Re: Weird bitset shift offset in zend_alloc
| From: | Stanislav Malyshev | Date: | Wed, 06 Mar 2019 08:14:37 +0000 |
| Subject: | Re: Weird bitset shift offset in zend_alloc | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-104596@lists.php.net to get a copy of this message | ||
Hi!
> But I'm not sure how it's supposed to work. Is it correct that on GCC
> (and clang, presumably, since it defines __GNUC__) accept long bitshifts
> and do the right thing with argument like 138? Is it documented
> anywhere? Or is there a bug here?
>
>
> This is a bug, yes. Oversize shifts are UB, and the only thing
> preventing this from being miscompiled is the fact that the compiler
> cannot figure out that the shift is oversized.
>
> I'm not sure why this code was introduced, as the compiler should
> generally be able to eliminate this masking if it is unnecessary. See
> for example these isel patterns in clang:
>
> https://github.com/llvm-mirror/llvm/blob/46b09a3368af1be5005d31fd1d70bad08df352f9/lib/Target/X86/X86InstrCompiler.td#L1753
This was introduced by Dmitry in
https://github.com/php/php-src/commit/4ad9cf460595efd1151faec0780b6ae5a4e0bc57,
so I wonder how that code works in allocators...
--
Stas Malyshev
smalyshev@gmail.com