[Rcpp-devel] Segfaults

Romain François romain at r-enthusiasts.com
Wed Jan 4 15:49:22 CET 2012


Le 04/01/12 15:33, Hadley Wickham a écrit :
> Hi all,
>
> Is it a bug to cause a segfault with Rcpp? Or are am I doing something
> so dumb that an automatic check could never protect?  See minimal
> reproducible example below.
>
> Hadley
>
> library(inline)
> f<- cxxfunction(signature(x = "numeric", i = "numeric"), plugin = "Rcpp", '
>    Rcpp::NumericVector x_(x);
>    Rcpp::NumericVector i_(i);
>
>    x_[(int) (i_[0]) - 1] = 1000;
>
>    return(x_);
> ')
> f(1:10, 1) # works
> f(1:10, 1.5) # also works
> f(1:10, NA) # segfaults
>
That is because of underlying C++ double arithmetics:

fx <- cxxfunction( signature( x_ = "numeric"), '

     double x = as<double>(x_) ;
     Rprintf( "%5.2f\\n", x ) ;


', plugin = "Rcpp" )
fx( NA )

So your i_[0] - 1 is also nan. You are responsible for dealing with na.

You can use traits::is_na:

fx <- cxxfunction( signature( x_ = "numeric"), '

     double x = as<double>(x_) ;

     if( traits::is_na<REALSXP>(x) ){
         // do something
     } else {
         // do something else
     }

', plugin = "Rcpp" )

or perhaps if you don't like the whole traits::is_na<REALSXP> thing, you 
could use e.g. somethin like this:

template <typename T>
bool isna( T x ){
     return traits::is_na<traits::r_sexptype_traits<T>::rtype > (x) ;
}

so that you coud just call

if( isna(x) ){ ... }

Romain


-- 
Romain Francois
Professional R Enthusiast
http://romainfrancois.blog.free.fr



More information about the Rcpp-devel mailing list