Re: [Rd] Segmentation faults on SEXP conversion

From: Duncan Temple Lang <duncan_at_wald.ucdavis.edu>
Date: Sun, 15 Nov 2009 17:44:11 -0800

nabble.30.miller_2555_at_spamgourmet.com wrote:
> On Sun, Nov 15, 2009 at 2:52 PM, Duncan Murdoch - murdoch@stats.uwo.ca
> <+nabble+miller_2555+1412c7fca2.murdoch#stats.uwo.ca_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"); }
>
>
> 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).

And that is your clue.

C routines that are invoked via .Call() _must_ return a SEXP object. Your routine (Rwrite) has a return type of void. Since you use .Call(), takes the return value from the stack and it is garbage. Seg fault ensues.

Declare your Rwrite() routine to return a SEXP and have it return the symbol R_NilValue, i.e.

 SEXP Rwrite() { printf("[%i] %s",12,"Hi"); return(R_NilValue); }

and you can use .Call()

  D.

 D.

> 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
>
> ______________________________________________
> R-devel_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Mon 16 Nov 2009 - 01:45:27 GMT

This archive was generated by hypermail 2.2.0 : Mon 16 Nov 2009 - 02:10:25 GMT