maechler@stat.math.ethz.ch
2005-Apr-30 15:37 UTC
[Rd] (PR#7826) Re: ... print.POSIXct .. infinite recursion
Thank you, Jskud. I can reproduce your problem, though not the seg.fault, see below>>>>> "Jskud" == Jskud <Jskud@Jskud.com> >>>>> on Sat, 30 Apr 2005 09:04:03 +0200 (CEST) writes:Jskud> In attempting to build R using rpmbuild --rebuild Jskud> R-2.1.0-0.fdr.2.fc3.src.rpm Jskud> on a fairly up-to-date RedHat 9 system (that is, with Jskud> patches installed through May 1 2004), it failed at Jskud> the make check-all step. Jskud> The problem was reproducible by going into the tests Jskud> directory and Jskud> make test-Segfault <....> Jskud> I was able to reproduce the problem (a segfault) as the following simple Jskud> transcript demonstrates: Jskud> LC_ALL=C SRCDIR=. R_DEFAULT_PACKAGES= ../bin/R --vanilla Jskud> R : Copyright 2005, The R Foundation for Statistical Computing Jskud> Version 2.1.0 (2005-04-18), ISBN 3-900051-07-0 <....> >> unusual_but_ok <- c.POSIXlt(character(0)) >> unusual_but_ok Jskud> character(0) >> unusual_and_faults <- c.POSIXct(character(0)) >> unusual_and_faults Jskud> Segmentation fault Jskud> Running this test program under gdb, we find that we're running off the Jskud> end of the stack, with 4222 stack frames showing -- apparently in an Jskud> infinite recursion -- "as.character" shows up every 69 function calls: <........> Jskud> So it would seem that *printing* the unusual POSIXct Jskud> value is suspect. that's correct. Jskud> value is suspect. Looking at a R-1.8.1 install, we Jskud> find these definitions in base/R/base: Jskud> print.POSIXct <- function(x, ...) { Jskud> print(format(x, usetz=TRUE), ...) invisible(x) } Jskud> print.POSIXlt <- function(x, ...) { Jskud> print(format(x, usetz=TRUE), ...) invisible(x) } Jskud> However, looking at the 2.1.0 src file Jskud> R-2.1.0/src/library/base/R/datetime.R, we find Jskud> print.POSIXct <- function(x, ...) { Jskud> print(format(x, usetz=TRUE, ...), ...) invisible(x) Jskud> } Jskud> print.POSIXlt <- function(x, ...) { Jskud> print(format(x, usetz=TRUE), ...) invisible(x) } Jskud> Note the suspicious definition of print.POSIXct using Jskud> *two* sets of ellipses, and that the print.POSIXct Jskud> and print.POSIXlt definitions no longer match. well, passing the "..." to both format() and print() is probably on purpose -- and I assume even fixes another bug. You are right however in wondering, why this is done only in print.*ct() and not in print.*lt(). The infinite recursion, BTW, happens with format(), not print()...: Here is the end of the stack you get from traceback(), after e.g. options(expressions = 50) 13: structure(format.POSIXlt(as.POSIXlt(x, tz), format, usetz, ...), names = names(x)) 12: format.POSIXct(x, ...) 11: format(x, ...) 10: as.character.POSIXt(x) 9: as.character(x) 8: strptime(x, f) 7: fromchar(x) 6: as.POSIXlt(x, tz) 5: inherits(x, "POSIXlt") 4: format.POSIXlt(as.POSIXlt(x, tz), format, usetz, ...) 3: structure(format.POSIXlt(as.POSIXlt(x, tz), format, usetz, ...), names = names(x)) 2: format.POSIXct(unusual_and_faults, usetz = TRUE) 1: format(unusual_and_faults, usetz = TRUE) - - - Unfortunately, I must do less fun things at the moment than fixing such a bug... but of course it *will* be fixed rather sooner than later. Martin Maechler, ETH Zurich
Maybe Matching Threads
- Re: (PR#7826) ... segfault during build of 2.1.0 on RH9; print.POSIXct ...
- (PR#7826) segfault during build of 2.1.0 on RH9; print.POSIXct
- segfault during build of 2.1.0 on RH9; print.POSIXct implicated (PR#7827)
- segfault during build of 2.1.0 on RH9; print.POSIXct implicated (PR#7826)
- print.POSIXct doesn't seem to use tz argument, as per its example