--with-blas/lapack being ignored

Ben Abbott bpabbott at mac.com
Thu Dec 6 13:37:14 CST 2007


On Thursday, December 06, 2007, at 01:35PM, "John W. Eaton" <jwe at bevo.che.wisc.edu> wrote:
>On  6-Dec-2007, Ben Abbott wrote:
>
>| However, regarding the strptime function ...
>| 
>| ---------------------------
>| checking for strptime... yes
>| [...]
>| checking whether strptime is broken... no
>| ---------------------------
>| 
>| I do not know if Apple has fixed this in Leopard or not. Configure  
>| thinks so, but calls to strptime from octave produces a crash.
>| 
>| Running from gdb, I obtained the following.
>| 
>| ---------------------------
>| octave:1> strptime ('09/13', '%m/%d')
>| . done
>| 
>| Program received signal EXC_BAD_ACCESS, Could not access memory.
>| Reason: KERN_PROTECTION_FAILURE at address: 0x00000000
>| 0x9110f590 in strlen ()
>| (gdb) where
>| #0  0x9110f590 in strlen ()
>| #1  0x019b9661 in octave_base_tm::init (this=0xbfffed50, p=0x0) at oct- 
>| time.cc:307
>| #2  0x019b97dd in octave_strptime::init (this=0xbfffed24,  
>| str=@0xffffffff, fmt=@0xffffffff) at oct-time.cc:379
>
>Are str and fmt really @0xffffffff?  That looks strange.
>
>The octave_strptime::init function is
>
>  void
>  octave_strptime::init (const std::string& str, const std::string& fmt)
>  {
>    struct tm t;
>
>    t.tm_sec = 0;
>    t.tm_min = 0;
>    t.tm_hour = 0;
>    t.tm_mday = 0;
>    t.tm_mon = -1;
>    t.tm_year = INT_MIN;
>    t.tm_wday = 0;
>    t.tm_yday = 0;
>    t.tm_isdst = 0;
>
>  #if defined (HAVE_STRUCT_TM_TM_ZONE)
>    char *ps = strsave ("");
>    t.tm_zone = ps;
>  #endif
>
>    char *p = strsave (str.c_str ());
>
>    char *q = oct_strptime (p, fmt.c_str (), &t);
>
>    // Fill in wday and yday, but only if mday is valid and the mon and year
>    // are filled in, avoiding issues with mktime and invalid dates.
>    if (t.tm_mday != 0 && t.tm_mon >= 0 && t.tm_year != INT_MIN)
>      {
>	t.tm_isdst = -1;
>	mktime (&t);
>      }
>
>    if (t.tm_mon < 0)
>      t.tm_mon = 0;
>
>    if (t.tm_year == INT_MIN)
>      t.tm_year = 0;
>
>    if (q)
>      nchars = q - p + 1;
>    else
>      nchars = 0;
>
>    delete [] p;
>
>    octave_base_tm::init (&t);
>
>  #if defined (HAVE_STRUCT_TM_TM_ZONE)
>    delete [] ps;
>  #endif
>  }
>
>and the octave_base_tm::init function is
>
>  void
>  octave_base_tm::init (void *p)
>  {
>    struct tm *t = static_cast<struct tm*> (p);
>
>    tm_sec = t->tm_sec;
>    tm_min = t->tm_min;
>    tm_hour = t->tm_hour;
>    tm_mday = t->tm_mday;
>    tm_mon = t->tm_mon;
>    tm_year = t->tm_year;
>    tm_wday = t->tm_wday;
>    tm_yday = t->tm_yday;
>    tm_isdst = t->tm_isdst;
>
>  #if defined (HAVE_STRUCT_TM_TM_ZONE)
>    tm_zone = t->tm_zone;
>  #elif defined (HAVE_TZNAME)
>    if (t->tm_isdst == 0 || t->tm_isdst == 1)
>      tm_zone = tzname[t->tm_isdst];
>  #endif
>  }
>
>As I recall, the argument is void* instead of struct tm* to avoid
>exposing that in the octave_base_tm interface.
>
>Line 307 is
>
>    tm_zone = t->tm_zone;
>
>There is no call to strlen here, so I don't see how that happens.
>Does struct tm on your system actually have a tm_zone field?  If not,
>then why is HAVE_STRUCT_TM_TM_ZONE defined?  The check for this is
>performed by the autoconf macro AC_STRUCT_TIMEZONE.
>
>jwe
>

I've updated to 2.9.18 and will need to recompile with the debug information in place. I'll recompile with the "-ggdb3" option and set the optimization to "-O0". When I'm ready to debug I'll get back to you.

In the meantime, I'm a bit behind the learning curve on much of what you've asked. How do I go about answering "Does struct tm on your system actually have a tm_zone field?"

Does the configure process give an indication?

Ben


More information about the Bug-octave mailing list