|
|
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.