From 4f4d842fa2baf7ab2218445a3dafcc3acc901c24 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Tue, 6 Oct 2020 21:27:05 +0200 Subject: [PATCH] Fix undefined behavior when bit_width == 32. --- turbopfor.h | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/turbopfor.h b/turbopfor.h index f589687..3b57d5a 100644 --- a/turbopfor.h +++ b/turbopfor.h @@ -44,6 +44,15 @@ __attribute__((target("sse2"))) const unsigned char *decode_pfor_vb_interleaved_128_32(const unsigned char *in, uint32_t *out); #endif +constexpr uint32_t mask_for_bits(unsigned bit_width) +{ + if (bit_width == 32) { + return 0xFFFFFFFF; + } else { + return (1U << bit_width) - 1; + } +} + template Docid read_le(const void *in) { @@ -112,7 +121,7 @@ const unsigned char *read_vb(const unsigned char *in, Docid *out) struct BitReader { public: BitReader(const unsigned char *in, unsigned bits) - : in(in), bits(bits), mask((1U << bits) - 1) {} + : in(in), bits(bits), mask(mask_for_bits(bits)) {} uint32_t read() { uint32_t val = (read_le(in) >> bits_used) & mask; @@ -135,7 +144,7 @@ template struct InterleavedBitReader { public: InterleavedBitReader(const unsigned char *in, unsigned bits) - : in(in), bits(bits), mask((1U << bits) - 1) {} + : in(in), bits(bits), mask(mask_for_bits(bits)) {} uint32_t read() { uint32_t val; @@ -164,7 +173,7 @@ private: struct InterleavedBitReaderSSE2 { public: InterleavedBitReaderSSE2(const unsigned char *in, unsigned bits) - : in(reinterpret_cast(in)), bits(bits), mask(_mm_set1_epi32((1U << bits) - 1)) {} + : in(reinterpret_cast(in)), bits(bits), mask(_mm_set1_epi32(mask_for_bits(bits))) {} __m128i read() { __m128i val = _mm_srli_epi32(_mm_loadu_si128(in), bits_used); if (bits_used + bits > 32) { @@ -208,7 +217,7 @@ const unsigned char *decode_constant(const unsigned char *in, unsigned num, Doci const unsigned bit_width = *in++ & 0x3f; Docid val = read_le(in); if (bit_width < sizeof(Docid) * 8) { - val &= ((1U << bit_width) - 1); + val &= mask_for_bits(bit_width); } Docid prev_val = out[-1]; -- 2.39.2