[Rd] Wrong config check for __libc_stack_end

Martin Maechler maechler at stat.math.ethz.ch
Mon Feb 1 18:32:23 CET 2016

>>>>> Simon Urbanek <simon.urbanek at r-project.org>
>>>>>     on Mon, 1 Feb 2016 08:36:56 -0500 writes:

    > On Feb 1, 2016, at 4:16 AM, Martin Maechler <maechler at stat.math.ethz.ch> wrote:


    >> Back to R: I'm not familiar with that part of the code, neither
    >> the configuration, nor the usage (in  R/src/unix/system.c ).
    >> However, that code seems to be using a a glibc "feature" widely
    >> available which does help making R startup (a very tiny bit ??)
    >> faster.

    > No, it's actually very crucial as it is used to detect stack overflows.

    > Cheers,
    > Simon

Well, I think you misunderstood what I meant to say (or then I'm
happy for clarification if I misunderstood you) :

The #ifdef ... #elseif ... #else ... # endif
branch which *uses* the __libc_stack_end "variable" would
hopefully be a speedup in comparison with the alternatives; from
system.c  mentioned above:

#if defined(HAVE_LIBC_STACK_END)
    R_CStackStart = (uintptr_t) __libc_stack_end;
#elif defined(HAVE_KERN_USRSTACK)
	/* Borrowed from mzscheme/gc/os_dep.c */
	int nm[2] = {CTL_KERN, KERN_USRSTACK};
	void * base;
	size_t len = sizeof(void *);
	(void) sysctl(nm, 2, &base, &len, NULL, 0);
	R_CStackStart = (uintptr_t) base;
    if(R_running_as_main_program) {
	/* This is not the main program, but unless embedded it is
	   near the top, 5540 bytes away when checked. */
	R_CStackStart = (uintptr_t) &i + (6000 * R_CStackDir);
    if(R_CStackStart == -1) R_CStackLimit = -1; /* never set */

    /* printf("stack limit %ld, start %lx dir %d \n", R_CStackLimit,
	      R_CStackStart, R_CStackDir); */

so I'd hope that typically  R_CStackStart  would be set usefully
also when the  __libc_stack_end  is not available.

If not, that would mean that for the 'musl' lovers, R would not
be able to detect stack overflows.... which would probably be
quite undesirable.

More information about the R-devel mailing list