Jskud@jskud.com
2005-Apr-30 10:59 UTC
[Rd] segfault during build of 2.1.0 on RH9; print.POSIXct implicated (PR#7827)
In attempting to build R using rpmbuild --rebuild R-2.1.0-0.fdr.2.fc3.src.rpm on a fairly up-to-date RedHat 9 system (that is, with patches installed through May 1 2004), it failed at the make check-all step. The problem was reproducible by going into the tests directory and make test-Segfault The last lines of the saved file no-segfault.Rout.fail are> > ## c.POSIXct : > > f <- get("c.POSIXct", pos = 'package:base') > > f() > character(0) > > f(NULL) > character(0) > > f(,NULL) > Error in lapply(list(...), unclass) : argument is missing, with no default > > f(NULL,NULL) > character(0) > > f(list()) > character(0) > > f(l0) > character(0)I was able to reproduce the problem (a segfault) as the following simple transcript demonstrates: LC_ALL=C SRCDIR=. R_DEFAULT_PACKAGES= ../bin/R --vanilla R : Copyright 2005, The R Foundation for Statistical Computing Version 2.1.0 (2005-04-18), ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for a HTML browser interface to help. Type 'q()' to quit R. > 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: #64 0x080ea1ef in Rf_usemethod (generic=0x81c8b12 "as.character", obj=0x0, call=0x85a04f4, args=0x8af8b00, rho=0x8af8b70, callrho=0x8af8b70, defrho=0x829d4c0, ans=0xbff042b8) at objects.c:328 #133 0x080ea1ef in Rf_usemethod (generic=0x81c8b12 "as.character", obj=0x0, call=0x85a04f4, args=0x8af35f0, rho=0x8af3660, callrho=0x8af3660, defrho=0x829d4c0, ans=0xbff08538) at objects.c:328 #202 0x080ea1ef in Rf_usemethod (generic=0x81c8b12 "as.character", obj=0x0, call=0x85a04f4, args=0x8aeca08, rho=0x8aeca78, callrho=0x8aeca78, defrho=0x829d4c0, ans=0xbff0c7b8) at objects.c:328 #271 0x080ea1ef in Rf_usemethod (generic=0x81c8b12 "as.character", obj=0x0, call=0x85a04f4, args=0x8ae7514, rho=0x8ae7584, callrho=0x8ae7584, defrho=0x829d4c0, ans=0xbff10a38) at objects.c:328 #340 0x080ea1ef in Rf_usemethod (generic=0x81c8b12 "as.character", obj=0x0, call=0x85a04f4, args=0x8ade4c0, rho=0x8ade530, callrho=0x8ade530, defrho=0x829d4c0, ans=0xbff14cb8) at objects.c:328 So it would seem that *printing* the unusual POSIXct value is suspect. 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. /Jskud --please do not edit the information below-- Version: platform = i686-pc-linux-gnu arch = i686 os = linux-gnu system = i686, linux-gnu status = major = 2 minor = 1.0 year = 2005 month = 04 day = 18 language = R []
Peter Dalgaard
2005-Apr-30 12:19 UTC
[Rd] segfault during build of 2.1.0 on RH9; print.POSIXct implicated (PR#7827)
Jskud@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@biostat.ku.dk) FAX: (+45) 35327907
Reasonably Related Threads
- (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#7826)
- Re: (PR#7826) ... segfault during build of 2.1.0 on RH9; print.POSIXct ...
- (PR#7826) Re: ... print.POSIXct .. infinite recursion
- rdbi segmentation fault