[Rd] Re: (PR#7826) ... segfault during build of 2.1.0 on RH9; print.POSIXct ...

Jskud at Jskud.com Jskud at Jskud.com
Sun May 1 00:00:42 CEST 2005


Dear Peter,

Thank you very much for your kind and helpful reply.

As I mentioned in a followup email to r-bugs, indeed, one aspect of this
issue is a (user specified) shorter stack than that expected by R -- I
had only allowed 1 MB of stack space a long long time ago, and forgotten
about it.

Due to a glitch with r-bugs at r-project.org, I ended up submitting this
bug twice, and your original response was attached to (PR#7827), which
Prof Brian Ripley moved to the trashcan, as was appropriate.  

I've taken the liberty of responding to PR#7826 (including your reply,
below) to have your helpful response (specifically, the unclass
suggestion) associated with the representative bug number.

/Jskud

>------ Begin Included Message ------
> To: Jskud at Jskud.com
> Cc: r-devel at stat.math.ethz.ch, R-bugs at biostat.ku.dk
> Subject: Re: [Rd] segfault during build of 2.1.0 on RH9; print.POSIXct implicated (PR#7827)
> From: Peter Dalgaard <p.dalgaard at biostat.ku.dk>
> Date: 30 Apr 2005 12:18:56 +0200
> Lines: 73
> 
> Jskud at jskud.com writes:
> >     > unusual_but_ok <- c.POSIXlt(character(0))
> >     > unusual_but_ok
> >     character(0)
> >     > unusual_and_faults <- c.POSIXct(character(0))
> >     > unusual_and_faults
> >     Segmentation fault
> > 
> > Running this test program under gdb, we find that we're running off the
> > end of the stack, with 4222 stack frames showing -- apparently in an
> > infinite recursion -- "as.character" shows up every 69 function calls:
> 
> This gives a protection stack overflow on FC3 and RH8. Is the stack
> particularly small on RH9? I have 8MB on RH8 and 10MB on FC3. (The R
> limits for expression depth and pointer protection were increased in
> 2.1.0). I can force a segfault, but only after "ulimit -s 1024" or so.
> 
> > #64 0x080ea1ef in Rf_usemethod (generic=0x81c8b12 "as.character", obj=0x0, call=0x85a04f4, 
> ...
> > So it would seem that *printing* the unusual POSIXct value is suspect.
> 
> Pretty obviously, yes.
> 
> > Looking at a R-1.8.1 install, we find these definitions in base/R/base:
> > 
> >     print.POSIXct <- function(x, ...)
> >     {
> > 	print(format(x, usetz=TRUE), ...)
> > 	invisible(x)
> >     }
> > 
> >     print.POSIXlt <- function(x, ...)
> >     {
> > 	print(format(x, usetz=TRUE), ...)
> > 	invisible(x)
> >     }
> > 
> > However, looking at the 2.1.0 src file
> > R-2.1.0/src/library/base/R/datetime.R, we find
> > 
> >     print.POSIXct <- function(x, ...)
> >     {
> > 	print(format(x, usetz=TRUE, ...), ...)
> > 	invisible(x)
> >     }
> > 
> >     print.POSIXlt <- function(x, ...)
> >     {
> > 	print(format(x, usetz=TRUE), ...)
> > 	invisible(x)
> >     }
> > 
> > Note the suspicious definition of print.POSIXct using *two* sets of
> > ellipses, and that the print.POSIXct and print.POSIXlt definitions no
> > longer match.
> 
> Probably both should use the double ellipses, but "..." will be empty
> on automatic printing, so that's not it. 
> 
> The issue is an infinite recursion inside as.POSIXlt(). Specifically,
> strptime() internally calls as.character(x) inside the fromchar()
> function in as.POSIXlt(), and as.character.POSIXt() invokes format()
> which calls as.POSIXlt() again.
> 
> I think the fix is to unclass(x) inside fromchar(), but perhaps others
> know better?
> 
> 
> -- 
>    O__  ---- Peter Dalgaard             Blegdamsvej 3  
>   c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
>  (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
> ~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)             FAX: (+45) 35327907
> 
>------  End Included Message  ------



More information about the R-devel mailing list