Hello list, I've been working on a package of my own. It works fine on the 32bit linux machines that I've tested it on. Someone using 64bit ubuntu wanted to try it, and surprising segfaults happened. My test code results in no segfault, errors, or leaks from my calls when run under valgrind (I recompiled R with the level 2 valgrind instruments). R and packages are compiled from source, so this is hopefully not a debian/ubuntu issue. I'm totally stumped and hoping that this is a silly / common 32 to 64 bit transition issue.
The problem seems to come when I attempt to access a function registered by the Matrix package. During compilation (on 64 bit only) I get the ominous: -------------- slim_stolen_from_matrix.c: In function ‘R_as_cholmod_sparse’: slim_stolen_from_matrix.c:36: warning: implicit declaration of function ‘R_GetCCallable’ slim_stolen_from_matrix.c:36: warning: cast to pointer from integer of different size -------------- The function in question is an identical copy of Matrix's M_as_cholmod_sparse, reproduced below -------------- CHM_SP R_as_cholmod_sparse(CHM_SP ans, SEXP x, Rboolean check_Udiag, Rboolean sort_in_place) { static CHM_SP(*fun)(CHM_SP,SEXP,Rboolean,Rboolean)= NULL; if(fun == NULL) fun = (CHM_SP(*)(CHM_SP,SEXP,Rboolean,Rboolean)) R_GetCCallable("Matrix", "as_cholmod_sparse"); return fun(ans, x, check_Udiag, sort_in_place); } -------------- I made this duplicate function since using Matrix's #include stubs conflicts with my copy of the CHOLMOD library (I need some functions Matrix doesn't make public). When run, the code gives the following segfault when it reaches te first call to that function: -------------- Program received signal SIGSEGV, Segmentation fault. 0xfffffffff54314e2 in ?? () *** caught segfault *** address 0xfffffffff54314e2, cause 'memory not mapped' -------------- As mentioned above, under valgrind the segault doesn't happen, but in GDB, the function pointer can be seen to have some problem. In 64 bit -------------- 35 fun = (CHM_SP(*)(CHM_SP,SEXP,Rboolean,Rboolean)) (gdb) p fun $1 = (CHM_SP (*)(CHM_SP, SEXP, Rboolean, Rboolean)) 0 (gdb) n 37 return fun(ans, x, check_Udiag, sort_in_place); (gdb) p fun $2 = (CHM_SP (*)(CHM_SP, SEXP, Rboolean, Rboolean)) 0xfffffffff54314e2 -------------- vs 32bit -------------- (gdb) p fun $1 = (CHM_SP (*)(CHM_SP, SEXP, Rboolean, Rboolean)) 0xb72a3ec0 <as_cholmod_sparse> -------------- I've never done 64 bit development, so I don't know what I've probably done wrong. I don't see an intermediate cast to an int to mess it up. Checking the pointer sizeof's seems like R_GetCCallable's return should be the same size as the function pointer. -------------- (gdb) p sizeof(void*) $5 = 8 (gdb) p sizeof(CHM_SP*) $6 = 8 (gdb) p sizeof(CHM_SP) $7 = 8 (gdb) p sizeof(SEXP) $8 = 8 (gdb) p sizeof(CHM_SP(*)) $9 = 8 (gdb) p sizeof(DL_FUNC) $10 = 8 (gdb) p sizeof(DL_FUNC*) $11 = 8 -------------- The function is invoked by ---------- fitholder->Zt = R_as_cholmod_sparse ((CHM_SP)malloc(sizeof(cholmod_sparse)), Zt, TRUE, FALSE); ----------- where Zt is a SEXP pointing to a Matrix-class sparse matrix passed by .Call from R. CHM_SP is a typedef'd pointer to a cholmod_sparse > sessionInfo() R version 2.12.1 (2010-12-16) Platform: x86_64-unknown-linux-gnu (64-bit) locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 [5] LC_MONETARY=C LC_MESSAGES=en_US.UTF-8 [7] LC_PAPER=en_US.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] emmpat_0.001 Matrix_0.999375-46 lattice_0.19-13 loaded via a namespace (and not attached): [1] grid_2.12.1 Ryan King University of Chicago Dept. Health Studies ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel