diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index ae1232539b97..e3d7a749a70f 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -606,7 +606,9 @@ static ValueFlow::Value truncateImplicitConversion(Token* parent, const ValueFlo static long long truncateIntValue(long long value, size_t value_size, const ValueType::Sign dst_sign) { - const MathLib::biguint unsignedMaxValue = (1ULL << (value_size * 8)) - 1ULL; + MathLib::biguint unsignedMaxValue = -1; + if (value_size < sizeof(MathLib::biguint)) + unsignedMaxValue ^= ~(unsignedMaxValue << (value_size * 8)); const MathLib::biguint signBit = 1ULL << (value_size * 8 - 1); value &= unsignedMaxValue; if (dst_sign == ValueType::Sign::SIGNED && (value & signBit))