From 451f31b92775d45889bd0589d31ad53317688b64 Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Sat, 8 Jun 2019 10:06:40 -0400 Subject: [PATCH] Fix undefined behavior in the macros SET_BH, CLEAR_BH, & ISSET_BH These macros contain this pattern: 1 << ((Int32_value) & 31 This causes the undefined behavior sanitizers in clang and gcc to complain because the shift, while ultimately stored to an unsigned variable, is done as a signed value. Adding a cast to unsigned for the int32 value resolves this issue. --- blocksort.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blocksort.c b/blocksort.c index 830d1b4..aa36766 100644 --- a/blocksort.c +++ b/blocksort.c @@ -202,9 +202,9 @@ void fallbackQSort3 ( UInt32* fmap, bhtab [ 0 .. 2+(nblock/32) ] destroyed */ -#define SET_BH(zz) bhtab[(zz) >> 5] |= (1 << ((zz) & 31)) -#define CLEAR_BH(zz) bhtab[(zz) >> 5] &= ~(1 << ((zz) & 31)) -#define ISSET_BH(zz) (bhtab[(zz) >> 5] & (1 << ((zz) & 31))) +#define SET_BH(zz) bhtab[(zz) >> 5] |= ((UInt32)1 << ((zz) & 31)) +#define CLEAR_BH(zz) bhtab[(zz) >> 5] &= ~((UInt32)1 << ((zz) & 31)) +#define ISSET_BH(zz) (bhtab[(zz) >> 5] & ((UInt32)1 << ((zz) & 31))) #define WORD_BH(zz) bhtab[(zz) >> 5] #define UNALIGNED_BH(zz) ((zz) & 0x01f)