-
Notifications
You must be signed in to change notification settings - Fork 52
Closed
Description
While trying to troubleshoot some segfaults, I stumbled upon the R option cpp11_preserve_xptr
that cpp11 uses internally;
cpp11/inst/include/cpp11/protect.hpp
Lines 380 to 405 in 9a62c3a
private: | |
// The preserved list singleton is stored in a XPtr within an R global option. | |
// | |
// It is not constructed as a static variable directly since many | |
// translation units may be compiled, resulting in unrelated instances of each | |
// static variable. | |
// | |
// We cannot store it in the cpp11 namespace, as cpp11 likely will not be loaded by | |
// packages. | |
// We cannot store it in R's global environment, as that is against CRAN | |
// policies. | |
// We instead store it as an XPtr in the global options, which avoids issues | |
// both copying and serializing. | |
static SEXP get_preserve_xptr_addr() { | |
static SEXP preserve_xptr_sym = Rf_install("cpp11_preserve_xptr"); | |
SEXP preserve_xptr = Rf_GetOption1(preserve_xptr_sym); | |
if (TYPEOF(preserve_xptr) != EXTPTRSXP) { | |
return R_NilValue; | |
} | |
auto addr = R_ExternalPtrAddr(preserve_xptr); | |
if (addr == nullptr) { | |
return R_NilValue; | |
} | |
return static_cast<SEXP>(addr); | |
} |
To be clear, I have no idea what it does, but looking at it's value, e.g.
> getOption("cpp11_preserve_xptr")
<pointer: 0x55555a020518>
is see it's an external pointer.
My question is, is the cpp11 code robust to anything that messes with this option? For example, can it safely be unset:
options(cpp11_preserve_xptr = NULL)
at any time? Can you imagine a scenario where changing it's value would wreak havoc?
Metadata
Metadata
Assignees
Labels
No labels