aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@yahooinc.com>2022-06-20 10:04:58 +0000
committerHåvard Pettersen <havardpe@yahooinc.com>2022-06-20 10:04:58 +0000
commit748b6381a8bd9eba48a2cb70eace21d0456c2202 (patch)
tree50366f6e7734c7d3c15046c3502e64db19775318
parentc1113c41bd63f46a7452b1baec2d142e03b2702e (diff)
avoid undefined shift
-rw-r--r--searchlib/src/vespa/searchlib/bitcompression/compression.cpp9
1 files changed, 4 insertions, 5 deletions
diff --git a/searchlib/src/vespa/searchlib/bitcompression/compression.cpp b/searchlib/src/vespa/searchlib/bitcompression/compression.cpp
index 5ac506e4fc2..b60250256f4 100644
--- a/searchlib/src/vespa/searchlib/bitcompression/compression.cpp
+++ b/searchlib/src/vespa/searchlib/bitcompression/compression.cpp
@@ -98,8 +98,7 @@ EncodeContext64EBase<false>::writeBits(uint64_t data, uint32_t length)
// Shift new bits into cacheInt
_cacheInt |= (data << (64 - _cacheFree));
*_valI++ = bswap(_cacheInt);
-
- data >>= _cacheFree;
+ data = (_cacheFree < 64) ? data >> _cacheFree : 0;
// Initialize variables for receiving new bits
length -= _cacheFree;
_cacheInt = 0;
@@ -194,9 +193,9 @@ writeBits(const uint64_t *bits, uint32_t bitOffset, uint32_t bitLength)
if (bitOffset + bitLength < 64) {
uint32_t length = bitLength;
if (bigEndian) {
- uint64_t data = (EC::bswap(*bits) >>
- (64 - bitOffset - length)) &
- CodingTables::_intMask64[length];
+ uint64_t data = ((bitOffset + length) > 0)
+ ? (EC::bswap(*bits) >> (64 - bitOffset - length)) & CodingTables::_intMask64[length]
+ : 0;
UC64BE_WRITEBITS_NS(o, EC);
} else {
uint64_t data = (EC::bswap(*bits) >> bitOffset) &