Skip to content

Commit 32d44d2

Browse files
author
MarcoFalke
committed
Merge #21000: fuzz: Add UBSan suppressions needed for fuzz tests to not warn under -fsanitize=integer
f0f8b1a fuzz: Add UBSan suppressions needed for fuzz tests to not warn under -fsanitize=integer (practicalswift) 58232e3 fuzz: Avoid -fsanitize=integer warnings in fuzzing harnesses (practicalswift) Pull request description: Add UBSan suppressions needed for fuzz tests to not warn under `-fsanitize=integer`. Avoid `-fsanitize=integer` warnings in fuzzing harnesses. Suppressed warnings (excluding warnings from `src/crypto/` and `src/test/`): ``` addrman.cpp:306:24: runtime error: implicit conversion from type 'long' of value 5190149478 (64-bit, signed) to type 'uint32_t' (aka 'unsigned int') changed the value to 895182182 (32-bit, unsigned) addrman.h:446:43: runtime error: implicit conversion from type 'int' of value -22 (32-bit, signed) to type 'const uint8_t' (aka 'const unsigned char') changed the value to 234 (8-bit, unsigned) arith_uint256.cpp:32:35: runtime error: left shift of 1712128 by 24 places cannot be represented in type 'uint32_t' (aka 'unsigned int') arith_uint256.cpp:47:39: runtime error: left shift of 4294966784 by 31 places cannot be represented in type 'uint32_t' (aka 'unsigned int') chain.cpp:151:12: runtime error: implicit conversion from type 'int' of value -1 (32-bit, signed) to type 'unsigned long' changed the value to 18446744073709551615 (64-bit, unsigned) coins.cpp:114:22: runtime error: unsigned integer overflow: 0 - 96 cannot be represented in type 'unsigned long' compressor.cpp:162:33: runtime error: unsigned integer overflow: 15617702637291228364 * 10 cannot be represented in type 'unsigned long' compressor.cpp:188:11: runtime error: unsigned integer overflow: 2265760372865400000 * 10 cannot be represented in type 'unsigned long' hash.cpp:13:15: runtime error: left shift of 1692305888 by 15 places cannot be represented in type 'uint32_t' (aka 'unsigned int') pubkey.h:152:23: runtime error: unsigned integer overflow: 0 - 1 cannot be represented in type 'unsigned int' streams.h:570:31: runtime error: left shift of 350879 by 52 places cannot be represented in type 'uint64_t' (aka 'unsigned long') util/bip32.cpp:57:36: runtime error: left shift of 3241096244 by 1 places cannot be represented in type 'unsigned int' util/strencodings.cpp:562:38: runtime error: implicit conversion from type 'unsigned char' of value 255 (8-bit, unsigned) to type 'char' changed the value to -1 (8-bit, signed) util/strencodings.h:164:24: runtime error: implicit conversion from type 'int' of value -74 (32-bit, signed) to type 'unsigned long' changed the value to 18446744073709551542 (64-bit, unsigned) ``` The warnings above happen here: https://github.com/bitcoin/bitcoin/blob/32b191fb66e644c690c94cbfdae6ddbc754769d7/src/addrman.cpp#L306 https://github.com/bitcoin/bitcoin/blob/32b191fb66e644c690c94cbfdae6ddbc754769d7/src/addrman.h#L446 https://github.com/bitcoin/bitcoin/blob/32b191fb66e644c690c94cbfdae6ddbc754769d7/src/arith_uint256.cpp#L32 https://github.com/bitcoin/bitcoin/blob/32b191fb66e644c690c94cbfdae6ddbc754769d7/src/arith_uint256.cpp#L47 https://github.com/bitcoin/bitcoin/blob/32b191fb66e644c690c94cbfdae6ddbc754769d7/src/chain.cpp#L151 https://github.com/bitcoin/bitcoin/blob/32b191fb66e644c690c94cbfdae6ddbc754769d7/src/coins.cpp#L114 https://github.com/bitcoin/bitcoin/blob/32b191fb66e644c690c94cbfdae6ddbc754769d7/src/compressor.cpp#L162 https://github.com/bitcoin/bitcoin/blob/32b191fb66e644c690c94cbfdae6ddbc754769d7/src/compressor.cpp#L188 https://github.com/bitcoin/bitcoin/blob/32b191fb66e644c690c94cbfdae6ddbc754769d7/src/hash.cpp#L13 https://github.com/bitcoin/bitcoin/blob/32b191fb66e644c690c94cbfdae6ddbc754769d7/src/pubkey.h#L152 https://github.com/bitcoin/bitcoin/blob/32b191fb66e644c690c94cbfdae6ddbc754769d7/src/streams.h#L570 https://github.com/bitcoin/bitcoin/blob/32b191fb66e644c690c94cbfdae6ddbc754769d7/src/util/bip32.cpp#L57 https://github.com/bitcoin/bitcoin/blob/32b191fb66e644c690c94cbfdae6ddbc754769d7/src/util/strencodings.cpp#L562 https://github.com/bitcoin/bitcoin/blob/32b191fb66e644c690c94cbfdae6ddbc754769d7/src/util/strencodings.h#L164 ACKs for top commit: MarcoFalke: review ACK f0f8b1a 🤚 Tree-SHA512: a8f04f7cc055d03653161de1d9d14d106a6280cea1e86a1243abcd57cf8e61dcf5f731d0ab0da5b390790e816022ff7a70759a641463bc7e3303076b8667009f
2 parents ce75fc3 + f0f8b1a commit 32d44d2

File tree

5 files changed

+57
-23
lines changed

5 files changed

+57
-23
lines changed

src/test/fuzz/crypto_chacha20_poly1305_aead.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,24 @@ FUZZ_TARGET(crypto_chacha20_poly1305_aead)
4545
assert(ok);
4646
},
4747
[&] {
48+
if (AdditionOverflow(seqnr_payload, static_cast<uint64_t>(1))) {
49+
return;
50+
}
4851
seqnr_payload += 1;
4952
aad_pos += CHACHA20_POLY1305_AEAD_AAD_LEN;
5053
if (aad_pos + CHACHA20_POLY1305_AEAD_AAD_LEN > CHACHA20_ROUND_OUTPUT) {
5154
aad_pos = 0;
55+
if (AdditionOverflow(seqnr_aad, static_cast<uint64_t>(1))) {
56+
return;
57+
}
5258
seqnr_aad += 1;
5359
}
5460
},
5561
[&] {
56-
seqnr_payload = fuzzed_data_provider.ConsumeIntegral<int>();
62+
seqnr_payload = fuzzed_data_provider.ConsumeIntegral<uint64_t>();
5763
},
5864
[&] {
59-
seqnr_aad = fuzzed_data_provider.ConsumeIntegral<int>();
65+
seqnr_aad = fuzzed_data_provider.ConsumeIntegral<uint64_t>();
6066
},
6167
[&] {
6268
is_encrypt = fuzzed_data_provider.ConsumeBool();

src/test/fuzz/pow.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ FUZZ_TARGET_INIT(pow, initialize_pow)
4343
current_block.nHeight = current_height;
4444
}
4545
if (fuzzed_data_provider.ConsumeBool()) {
46-
current_block.nTime = fixed_time + current_height * consensus_params.nPowTargetSpacing;
46+
const uint32_t seconds = current_height * consensus_params.nPowTargetSpacing;
47+
if (!AdditionOverflow(fixed_time, seconds)) {
48+
current_block.nTime = fixed_time + seconds;
49+
}
4750
}
4851
if (fuzzed_data_provider.ConsumeBool()) {
4952
current_block.nBits = fixed_bits;

src/test/fuzz/script.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,13 +154,13 @@ FUZZ_TARGET_INIT(script, initialize_script)
154154

155155
{
156156
WitnessUnknown witness_unknown_1{};
157-
witness_unknown_1.version = fuzzed_data_provider.ConsumeIntegral<int>();
157+
witness_unknown_1.version = fuzzed_data_provider.ConsumeIntegral<uint32_t>();
158158
const std::vector<uint8_t> witness_unknown_program_1 = fuzzed_data_provider.ConsumeBytes<uint8_t>(40);
159159
witness_unknown_1.length = witness_unknown_program_1.size();
160160
std::copy(witness_unknown_program_1.begin(), witness_unknown_program_1.end(), witness_unknown_1.program);
161161

162162
WitnessUnknown witness_unknown_2{};
163-
witness_unknown_2.version = fuzzed_data_provider.ConsumeIntegral<int>();
163+
witness_unknown_2.version = fuzzed_data_provider.ConsumeIntegral<uint32_t>();
164164
const std::vector<uint8_t> witness_unknown_program_2 = fuzzed_data_provider.ConsumeBytes<uint8_t>(40);
165165
witness_unknown_2.length = witness_unknown_program_2.size();
166166
std::copy(witness_unknown_program_2.begin(), witness_unknown_program_2.end(), witness_unknown_2.program);

src/test/fuzz/util.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ template <typename WeakEnumType, size_t size>
196196
},
197197
[&] {
198198
WitnessUnknown witness_unknown{};
199-
witness_unknown.version = fuzzed_data_provider.ConsumeIntegral<int>();
199+
witness_unknown.version = fuzzed_data_provider.ConsumeIntegral<uint32_t>();
200200
const std::vector<uint8_t> witness_unknown_program_1 = fuzzed_data_provider.ConsumeBytes<uint8_t>(40);
201201
witness_unknown.length = witness_unknown_program_1.size();
202202
std::copy(witness_unknown_program_1.begin(), witness_unknown_program_1.end(), witness_unknown.program);

test/sanitizer_suppressions/ubsan

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# -fsanitize=undefined suppressions
2+
# =================================
3+
# No suppressions at the moment. Hooray!
4+
15
# -fsanitize=integer suppressions
26
# ===============================
37
# Unsigned integer overflow occurs when the result of an unsigned integer
@@ -6,7 +10,8 @@
610
# contains files in which we expect unsigned integer overflows to occur. The
711
# list is used to suppress -fsanitize=integer warnings when running our CI UBSan
812
# job.
9-
unsigned-integer-overflow:*/include/c++/*/bits/basic_string.tcc
13+
unsigned-integer-overflow:*/include/c++/
14+
unsigned-integer-overflow:addrman.cpp
1015
unsigned-integer-overflow:arith_uint256.h
1116
unsigned-integer-overflow:basic_string.h
1217
unsigned-integer-overflow:bench/bench.h
@@ -15,34 +20,41 @@ unsigned-integer-overflow:bloom.cpp
1520
unsigned-integer-overflow:chain.cpp
1621
unsigned-integer-overflow:chain.h
1722
unsigned-integer-overflow:coded_stream.h
23+
unsigned-integer-overflow:coins.cpp
24+
unsigned-integer-overflow:compressor.cpp
1825
unsigned-integer-overflow:core_write.cpp
19-
unsigned-integer-overflow:crypto/*
26+
unsigned-integer-overflow:crypto/
27+
# unsigned-integer-overflow in FuzzedDataProvider's ConsumeIntegralInRange
28+
unsigned-integer-overflow:FuzzedDataProvider.h
2029
unsigned-integer-overflow:hash.cpp
21-
unsigned-integer-overflow:leveldb/db/log_reader.cc
22-
unsigned-integer-overflow:leveldb/util/bloom.cc
23-
unsigned-integer-overflow:leveldb/util/crc32c.h
24-
unsigned-integer-overflow:leveldb/util/hash.cc
30+
unsigned-integer-overflow:leveldb/
2531
unsigned-integer-overflow:policy/fees.cpp
2632
unsigned-integer-overflow:prevector.h
33+
unsigned-integer-overflow:pubkey.h
2734
unsigned-integer-overflow:script/interpreter.cpp
2835
unsigned-integer-overflow:stl_bvector.h
2936
unsigned-integer-overflow:txmempool.cpp
3037
unsigned-integer-overflow:util/strencodings.cpp
3138
unsigned-integer-overflow:validation.cpp
32-
33-
implicit-integer-sign-change:*/include/c++/*/bits/*.h
39+
implicit-integer-sign-change:*/include/boost/
40+
implicit-integer-sign-change:*/include/c++/
3441
implicit-integer-sign-change:*/new_allocator.h
35-
implicit-integer-sign-change:/usr/include/boost/date_time/format_date_parser.hpp
42+
implicit-integer-sign-change:addrman.h
3643
implicit-integer-sign-change:arith_uint256.cpp
3744
implicit-integer-sign-change:bech32.cpp
3845
implicit-integer-sign-change:bloom.cpp
39-
implicit-integer-sign-change:chain.*
46+
implicit-integer-sign-change:chain.cpp
47+
implicit-integer-sign-change:chain.h
4048
implicit-integer-sign-change:coins.h
4149
implicit-integer-sign-change:compat/stdin.cpp
4250
implicit-integer-sign-change:compressor.h
43-
implicit-integer-sign-change:crypto/*
51+
implicit-integer-sign-change:crc32c/
52+
implicit-integer-sign-change:crypto/
53+
# implicit-integer-sign-change in FuzzedDataProvider's ConsumeIntegralInRange
54+
implicit-integer-sign-change:FuzzedDataProvider.h
4455
implicit-integer-sign-change:key.cpp
4556
implicit-integer-sign-change:noui.cpp
57+
implicit-integer-sign-change:policy/fees.cpp
4658
implicit-integer-sign-change:prevector.h
4759
implicit-integer-sign-change:protocol.cpp
4860
implicit-integer-sign-change:script/bitcoinconsensus.cpp
@@ -53,24 +65,37 @@ implicit-integer-sign-change:test/coins_tests.cpp
5365
implicit-integer-sign-change:test/pow_tests.cpp
5466
implicit-integer-sign-change:test/prevector_tests.cpp
5567
implicit-integer-sign-change:test/sighash_tests.cpp
68+
implicit-integer-sign-change:test/skiplist_tests.cpp
5669
implicit-integer-sign-change:test/streams_tests.cpp
5770
implicit-integer-sign-change:test/transaction_tests.cpp
5871
implicit-integer-sign-change:txmempool.cpp
59-
implicit-integer-sign-change:util/strencodings.*
72+
implicit-integer-sign-change:util/strencodings.cpp
73+
implicit-integer-sign-change:util/strencodings.h
6074
implicit-integer-sign-change:validation.cpp
6175
implicit-integer-sign-change:zmq/zmqpublishnotifier.cpp
6276
implicit-signed-integer-truncation,implicit-integer-sign-change:chain.h
6377
implicit-signed-integer-truncation,implicit-integer-sign-change:test/skiplist_tests.cpp
78+
implicit-signed-integer-truncation:addrman.cpp
79+
implicit-signed-integer-truncation:addrman.h
6480
implicit-signed-integer-truncation:chain.h
65-
implicit-signed-integer-truncation:crypto/*
81+
implicit-signed-integer-truncation:crypto/
6682
implicit-signed-integer-truncation:cuckoocache.h
67-
implicit-signed-integer-truncation:leveldb/*
83+
implicit-signed-integer-truncation:leveldb/
84+
implicit-signed-integer-truncation:net.cpp
85+
implicit-signed-integer-truncation:net_processing.cpp
6886
implicit-signed-integer-truncation:streams.h
6987
implicit-signed-integer-truncation:test/arith_uint256_tests.cpp
7088
implicit-signed-integer-truncation:test/skiplist_tests.cpp
7189
implicit-signed-integer-truncation:torcontrol.cpp
72-
implicit-unsigned-integer-truncation:crypto/*
73-
implicit-unsigned-integer-truncation:leveldb/*
90+
implicit-unsigned-integer-truncation:crypto/
91+
implicit-unsigned-integer-truncation:leveldb/
7492
# std::variant warning fixed in https://github.com/gcc-mirror/gcc/commit/074436cf8cdd2a9ce75cadd36deb8301f00e55b9
7593
implicit-unsigned-integer-truncation:std::__detail::__variant::_Variant_storage
76-
implicit-integer-sign-change:crc32c/*
94+
shift-base:*/include/c++/
95+
shift-base:arith_uint256.cpp
96+
shift-base:crypto/
97+
shift-base:hash.cpp
98+
shift-base:leveldb/
99+
shift-base:net_processing.cpp
100+
shift-base:streams.h
101+
shift-base:util/bip32.cpp

0 commit comments

Comments
 (0)