From fa8401f9bfe81f4853bf9b67bff42a2cebffc10f Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Thu, 13 Jul 2023 16:27:38 +0200 Subject: [compiler-rt][NFC] Avoid implicit-integer-sign-change in FuzzedDataProvider::ConsumeIntegralInRange This makes the implicit conversion that is happening explicit. Otherwise, each user is forced to suppress this implicit-integer-sign-change runtime error in their their UBSAN suppressions file. For example, the runtime error might look like: runtime error: implicit conversion from type 'long' of value -9223372036854775808 (64-bit, signed) to type 'uint64_t' (aka 'unsigned long') changed the value to 9223372036854775808 (64-bit, unsigned) #0 0x55fe29dea91d in long FuzzedDataProvider::ConsumeIntegralInRange(long, long) src/./test/fuzz/FuzzedDataProvider.h:233:25 [...] SUMMARY: UndefinedBehaviorSanitizer: implicit-integer-sign-change test/fuzz/FuzzedDataProvider.h:233:25 in Differential Revision: https://reviews.llvm.org/D155206 --- compiler-rt/include/fuzzer/FuzzedDataProvider.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'compiler-rt') diff --git a/compiler-rt/include/fuzzer/FuzzedDataProvider.h b/compiler-rt/include/fuzzer/FuzzedDataProvider.h index 71cb427..8a8214b 100644 --- a/compiler-rt/include/fuzzer/FuzzedDataProvider.h +++ b/compiler-rt/include/fuzzer/FuzzedDataProvider.h @@ -209,7 +209,7 @@ T FuzzedDataProvider::ConsumeIntegralInRange(T min, T max) { abort(); // Use the biggest type possible to hold the range and the result. - uint64_t range = static_cast(max) - min; + uint64_t range = static_cast(max) - static_cast(min); uint64_t result = 0; size_t offset = 0; @@ -230,7 +230,7 @@ T FuzzedDataProvider::ConsumeIntegralInRange(T min, T max) { if (range != std::numeric_limits::max()) result = result % (range + 1); - return static_cast(min + result); + return static_cast(static_cast(min) + result); } // Returns a floating point value in the range [Type's lowest, Type's max] by -- cgit v1.1