[R-pkg-devel] Tracking down cause of UBSAN error
Hugh Parsonage
hugh@p@r@on@ge @end|ng |rom gm@||@com
Fri Oct 16 02:59:11 CEST 2020
Hello,
I am getting a UBSAN-clang failure on my package hutilscpp
(<https://github.com/HughParsonage/hutilscpp>). However I cannot
reproduce the error on rhub, nor can I see an obvious problem with the
code. (Though obviously there is something wrong.)
The testthat.Rout log from CRAN reads (relevantly):
> test_check("hutilscpp")
/data/gannet/ripley/R/test-clang/Rcpp/include/Rcpp/internal/caster.h:30:25:
runtime error: nan is outside the range of representable values of
type 'long'
#0 0x7f817412275e in long Rcpp::internal::caster<double,
long>(double) /data/gannet/ripley/R/test-clang/Rcpp/include/Rcpp/internal/caster.h:30:25
#1 0x7f817412275e in long
Rcpp::internal::primitive_as<long>(SEXPREC*)
/data/gannet/ripley/R/test-clang/Rcpp/include/Rcpp/as.h:39:21
#2 0x7f81740f9a50 in long Rcpp::internal::as<long>(SEXPREC*,
Rcpp::traits::r_type_primitive_tag)
/data/gannet/ripley/R/test-clang/Rcpp/include/Rcpp/as.h:44:20
#3 0x7f81740f9a50 in long Rcpp::as<long>(SEXPREC*)
/data/gannet/ripley/R/test-clang/Rcpp/include/Rcpp/as.h:152:16
#4 0x7f81740f9a50 in Rcpp::InputParameter<long>::operator long()
/data/gannet/ripley/R/test-clang/Rcpp/include/Rcpp/InputParameter.h:34:38
#5 0x7f81740f9a50 in _hutilscpp_do_which_first__
/data/gannet/ripley/R/packages/tests-clang-SAN/hutilscpp/src/RcppExports.cpp:647:65
#6 0x6e187d in R_doDotCall
/data/gannet/ripley/R/svn/R-devel/src/main/dotcode.c:629:17
#7 0x844c13 in bcEval
/data/gannet/ripley/R/svn/R-devel/src/main/eval.c:7677:21
#8 0x828ab9 in Rf_eval
/data/gannet/ripley/R/svn/R-devel/src/main/eval.c:727:8
The RcppExports.cpp 647:65 refers to the commented line starting
"rcpp_result_gen" below
// do_which_first__
R_xlen_t do_which_first__(SEXP x, int op, SEXP y, R_xlen_t nx,
R_xlen_t ny, int y1i, int y2i, double y1d, double y2d);
RcppExport SEXP _hutilscpp_do_which_first__(SEXP xSEXP, SEXP opSEXP,
SEXP ySEXP, SEXP nxSEXP, SEXP nySEXP, SEXP y1iSEXP, SEXP y2iSEXP, SEXP
y1dSEXP, SEXP y2dSEXP) {
BEGIN_RCPP
Rcpp::RObject rcpp_result_gen;
Rcpp::traits::input_parameter< SEXP >::type x(xSEXP);
Rcpp::traits::input_parameter< int >::type op(opSEXP);
Rcpp::traits::input_parameter< SEXP >::type y(ySEXP);
Rcpp::traits::input_parameter< R_xlen_t >::type nx(nxSEXP);
Rcpp::traits::input_parameter< R_xlen_t >::type ny(nySEXP);
Rcpp::traits::input_parameter< int >::type y1i(y1iSEXP);
Rcpp::traits::input_parameter< int >::type y2i(y2iSEXP);
Rcpp::traits::input_parameter< double >::type y1d(y1dSEXP);
Rcpp::traits::input_parameter< double >::type y2d(y2dSEXP);
rcpp_result_gen = Rcpp::wrap(do_which_first__(x, op, y, nx, ny, y1i,
y2i, y1d, y2d)); // line 647, column 65 is between nx and ny
return rcpp_result_gen;
END_RCPP
}
The ny R_xlen_t value is used in a switch statement in the C++ code.
My attempt to fix this code was to limit the values of ny to 1, 2, or
3 before being passed to do_which_first__(). However, since I was not
able to reproduce the UBSAN error on rhub I'm not sure if this fix is
successful. I would prefer not to submit a package before being
completely sure the UBSAN error has been resolved.
Thank you for any help,
Hugh.
More information about the R-package-devel
mailing list