Weird bitset shift offset in zend_alloc

From: Date: Wed, 06 Mar 2019 00:27:43 +0000
Subject: Weird bitset shift offset in zend_alloc
Groups: php.internals 
Request: Send a blank email to internals+get-104592@lists.php.net to get a copy of this message
Hi! I've been working on running PHP with undefined behavior sanitizer (http://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html) and I've encountered a weird error while running PHP: /src/php-src/Zend/zend_alloc.c:585:9: runtime error: shift exponent 138 is too large for 64-bit type 'zend_mm_bitset' (aka 'unsigned long') #0 0x86dada in zend_mm_bitset_is_set /src/php-src/Zend/zend_alloc.c:585:9 #1 0x86dada in zend_mm_bitset_is_free_range /src/php-src/Zend/zend_alloc.c:665 #2 0x86dada in zend_mm_realloc_heap /src/php-src/Zend/zend_alloc.c:1670 #3 0x86dada in _erealloc2 /src/php-src/Zend/zend_alloc.c:2577 Looks like the code is doing it intentionally: /* x86 instructions BT, SHL, SHR don't require masking */ #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) || defined(ZEND_WIN32) # define ZEND_BIT_TEST(bits, bit) (((bits)[(bit) / (sizeof((bits)[0])*8)] >> (bit)) & 1) #else # define ZEND_BIT_TEST(bits, bit) (((bits)[(bit) / (sizeof((bits)[0])*8)] >> ((bit) & (sizeof((bits)[0])*8-1))) & 1) #endif 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? Thanks, -- Stas Malyshev smalyshev@gmail.com

« previous php.internals (#104592) next »