diff --git a/Userland/Libraries/LibC/math.cpp b/Userland/Libraries/LibC/math.cpp index 70d9bae97b5..ee8ea956657 100644 --- a/Userland/Libraries/LibC/math.cpp +++ b/Userland/Libraries/LibC/math.cpp @@ -68,6 +68,9 @@ static FloatType internal_to_integer(FloatType x, RoundingMode rounding_mode) return x; using Extractor = FloatExtractor; + // Most component types are larger than int. + constexpr auto zero = static_cast(0); + constexpr auto one = static_cast(1); Extractor extractor; extractor.d = x; @@ -90,7 +93,8 @@ static FloatType internal_to_integer(FloatType x, RoundingMode rounding_mode) return x; auto dead_bitcount = Extractor::mantissa_bits - unbiased_exponent; - auto dead_mask = (1ull << dead_bitcount) - 1; + // Avoid shifting by the integer type's size since that's UB. + auto dead_mask = dead_bitcount == sizeof(typename Extractor::ComponentType) * 8 ? ~zero : (one << dead_bitcount) - 1; auto dead_bits = extractor.mantissa & dead_mask; extractor.mantissa &= ~dead_mask;