tech-toolchain archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Handling __cxa_atexit(a,b,NULL)



On Thu, Nov 02, 2017 at 09:13:36PM +0100, Kamil Rytarowski wrote:
> On 02.11.2017 20:45, Joerg Sonnenberger wrote:
> > On Thu, Nov 02, 2017 at 07:09:34PM +0100, Kamil Rytarowski wrote:
> >> TSan intercepts all atexit() and __cxa_atexit() calls and wraps them in
> >> setup_at_exit_wrapper(() into a new struct that preserves the original
> >> arguments "a" and "b" from __cxa_atexit() / "a" from atexit(). In case
> >> of intercepting atexit() calls we end up with __cxa_atexit(x,y,NULL). In
> >> libc we handle this variation in the same way as atexit(x) and drop the
> >> "y" argument.
> > 
> > It should be intercepting atexit separately and just providing its own
> > stack, followed by registering a pop-and-call handler via the real
> > atexit, i.e.:
> > 
> >    std::vector<h> atexit_stack;
> >    void my_cleanup(void) {
> >      h = atexit_stack.pop();
> >      h();
> >    }
> > 
> >    int intercepted_atexit(h) {
> >      atexit_stack.push(h);
> >      rv = real_atexit(my_cleanup);
> >      if (rv) atexit_stack.pop();
> >      return rv;
> >    }
> > 
> > Joerg
> > 
> 
> Is this stack order deterministic? If so, I will go for it.

atexit handlers are called in reverse order. Nothing stops registering
the same handler more than once and this leaves the interleaving of
__cxa_atexit and atexit to the real implementation.

Joerg


Home | Main Index | Thread Index | Old Index