When extending the test/fuzz/integer
fuzzer I noticed the following UBSan warning when fuzzing abs64(...)
:
0runtime error: negation of -9223372036854775808 cannot be represented in type 'int64_t' (aka 'long'); cast to an unsigned type to negate this value to itself
Fuzzing harness:
0diff --git a/src/test/fuzz/integer.cpp b/src/test/fuzz/integer.cpp
1index 35d6804d4..bc158e5a2 100644
2--- a/src/test/fuzz/integer.cpp
3+++ b/src/test/fuzz/integer.cpp
4@@ -40,6 +40,8 @@
5 #include <set>
6 #include <vector>
7
8 void initialize()
9 {
10 SelectParams(CBaseChainParams::REGTEST);
11@@ -82,6 +84,7 @@ void test_one_input(const std::vector<uint8_t>& buffer)
12 (void)ComputeMerkleRoot(v256);
13 (void)CountBits(u64);
14 (void)DecompressAmount(u64);
15+ (void)abs64(i64);
16 (void)FormatISO8601Date(i64);
17 (void)FormatISO8601DateTime(i64);
18 // FormatMoney(i) not defined when i == std::numeric_limits<int64_t>::min()
Typically abs(I n)
type functions are not defined when n == std::numeric_limits<I>::min()
so it could be argued that this is expected, but perhaps the function could be rewritten in a way which guarantees that it gives the same behaviour across systems (instead of UB).