[Rd] Segmentation faults on SEXP conversion
nabble.30.miller_2555 at spamgourmet.com
nabble.30.miller_2555 at spamgourmet.com
Mon Nov 16 02:30:22 CET 2009
On 15/11/2009 8:25 PM, nabble.30.miller_2555 at spamgourmet.com wrote:
> On Sun, Nov 15, 2009 at 2:52 PM, Duncan Murdoch - nabble.30.miller_2555 at spamgourmet.com
> <>
> wrote:
>> On 15/11/2009 1:41 PM, nabble.30.miller_2555 at spamgourmet.com wrote:
>> The "character" type in R corresponds to STRSXP in C, which is a vector of
>> CHARSXPs. So you need an extra step to get to the C string:
>>
>> const char * omsg = CHAR(STRING_ELT(msg, 0));
>>
>> Duncan Murdoch
>>
>
> Thank you for the suggestion. I have replaced the code as suggested,
> but I had attempted this conversion earlier. Unfortunately, I still
> receive the same segmentation fault (and backtrace). The underlying
> problem no longer appears to relate to type conversion. The following
> code represents the entirety of the extension's R and C code (and
> NAMESPACE file), and still causes the segmentation fault:
>
> NAMESPACE:
> ---------------------------------------------------
> useDynLib("tstlib")
> export( "ptest" )
>
>
> ptest.R:
> ---------------------------------------------------
> ptest <- function() { .Call("Rwrite", PACKAGE="tstlib");};
>
>
> ptest.c:
> ---------------------------------------------------
> #include <R.h>
> void Rwrite() { printf("[%i] %s",12,"Hi"); }
I forget if you said which system you're working on, but it may be that
you don't have an open file handle for printf to use. Use Rprintf
instead and things should be fine.
Duncan Murdoch
>
> ptest.R:
> ---------------------------------------------------
> ptest <- function() { .Call("Rwrite", PACKAGE="tstlib");};
>
>
> zzz.R:
> ---------------------------------------------------
> .onLoad <- function(libname, pkgname)
> {
> }
> .onUnload <- function(libpath) {
> library.dynam.unload("forkex", libpath)
> }
>
>
> This is just about the most simple example I can think of, and don't
> really know why it would segfault (if I change the interface in
> ptest.R above from .Call to .C, no segfault occurs). The following is
> the output from `R CMD SHLIB ptest.c`:
>
> gcc -m64 -std=gnu99 -I/usr/include/R -I/usr/local/include -fpic
> -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions
> -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -c
> ptest.c -o ptest.o
> gcc -m64 -std=gnu99 -shared -L/usr/local/lib64 -o ptest.so ./ptest.o
> -L/usr/lib64/R/lib -lR
>
More information about the R-devel
mailing list