https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113082

Alexander Monakov <amonakov at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |amonakov at gcc dot gnu.org

--- Comment #4 from Alexander Monakov <amonakov at gcc dot gnu.org> ---
re. comment #3, you'd need to be careful to avoid miscompiling

#include <stdlib.h>

int f(size_t sz, void **out, int *eptr)
{
    int e = *eptr;
    *out = malloc(sz);
    return *eptr - e;
}

to asm that unconditionally returns 0, because that changes the outcome for

  errno = 0;
  f(SIZE_MAX, &ptr, &errno);

IOW, I'm not sure how you can go beyond TBAA since user code can pass around
the address of errno in a plain 'int *' anyway.


re. comment #2, Glibc has

* lazy PLT resolver calling back into the dynamic linker
* LD_AUDIT callbacks
* LD_PROFILE hooks
* IFUNC resolvers

and you'd have to guarantee they won't clobber errno either. For lazy PLT and
LD_PROFILE it is necessary anyway (otherwise it's a Glibc bug), but audit and
ifunc callbacks are provided by the user, not Glibc, and might accidentally
clobber errno.

Reply via email to