Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <alpine.LNX.2.20.13.2001191959050.7204@monopod.intra.ispras.ru>
Date: Sun, 19 Jan 2020 20:11:37 +0300 (MSK)
From: Alexander Monakov <amonakov@...ras.ru>
To: musl@...ts.openwall.com
Subject: Re: Minor style patch to exit.c



On Sun, 19 Jan 2020, Rich Felker wrote:

> Conceptually the _start is an array; that means it's fine to iterate
> over its elements, and we could even do so with the "correct" type.
> The problem is that _end is a different symbol and thereby inherently
> a "different object", and comparing against it with < is not valid;
> the compiler can legitimately optimize that out. I think with != would
> be valid, but I'm not sure we can trust compilers to honor any
> consistency for such "one past the end" comparisons. Casting to
> (uintptr_t) before doing the != comparison would absolutely be safe in
> the abstract machine; whether compilers honor this is unclear (because
> of the "provenance" stuff, which could break even the current code, so
> arguably we should have some "provenance barrier" here).
> 
> Of course exit runs the array in reverse, which makes it even more of
> a mess. _end[-1] is clearly not valid when _end is an array object,
> and the compiler is free to break that.

I would suggest

  void (**ptr)(void);

  __asm__ ("" : "=g"(ptr) : "0"(..._end), "X"(..._start));

  while (ptr != _start) (*--ptr)();

Alexander

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.