0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-02-13 11:25:02 -05:00

fuzz: Introduce CallOneOf helper to replace switch-case

Can be reviewed with --ignore-all-space
This commit is contained in:
MarcoFalke 2021-01-02 13:38:14 +01:00
parent 9c0b76c709
commit fa75d40ef8
No known key found for this signature in database
GPG key ID: CE2B75697E69A548
19 changed files with 1097 additions and 1217 deletions

View file

@ -45,36 +45,31 @@ FUZZ_TARGET_INIT(addrman, initialize_addrman)
} }
} }
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 11)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
addr_man.Clear(); addr_man.Clear();
break; },
} [&] {
case 1: {
addr_man.ResolveCollisions(); addr_man.ResolveCollisions();
break; },
} [&] {
case 2: {
(void)addr_man.SelectTriedCollision(); (void)addr_man.SelectTriedCollision();
break; },
} [&] {
case 3: {
(void)addr_man.Select(fuzzed_data_provider.ConsumeBool()); (void)addr_man.Select(fuzzed_data_provider.ConsumeBool());
break; },
} [&] {
case 4: {
(void)addr_man.GetAddr(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096), fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096)); (void)addr_man.GetAddr(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096), fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096));
break; },
} [&] {
case 5: {
const std::optional<CAddress> opt_address = ConsumeDeserializable<CAddress>(fuzzed_data_provider); const std::optional<CAddress> opt_address = ConsumeDeserializable<CAddress>(fuzzed_data_provider);
const std::optional<CNetAddr> opt_net_addr = ConsumeDeserializable<CNetAddr>(fuzzed_data_provider); const std::optional<CNetAddr> opt_net_addr = ConsumeDeserializable<CNetAddr>(fuzzed_data_provider);
if (opt_address && opt_net_addr) { if (opt_address && opt_net_addr) {
addr_man.Add(*opt_address, *opt_net_addr, fuzzed_data_provider.ConsumeIntegralInRange<int64_t>(0, 100000000)); addr_man.Add(*opt_address, *opt_net_addr, fuzzed_data_provider.ConsumeIntegralInRange<int64_t>(0, 100000000));
} }
break; },
} [&] {
case 6: {
std::vector<CAddress> addresses; std::vector<CAddress> addresses;
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
const std::optional<CAddress> opt_address = ConsumeDeserializable<CAddress>(fuzzed_data_provider); const std::optional<CAddress> opt_address = ConsumeDeserializable<CAddress>(fuzzed_data_provider);
@ -87,41 +82,34 @@ FUZZ_TARGET_INIT(addrman, initialize_addrman)
if (opt_net_addr) { if (opt_net_addr) {
addr_man.Add(addresses, *opt_net_addr, fuzzed_data_provider.ConsumeIntegralInRange<int64_t>(0, 100000000)); addr_man.Add(addresses, *opt_net_addr, fuzzed_data_provider.ConsumeIntegralInRange<int64_t>(0, 100000000));
} }
break; },
} [&] {
case 7: {
const std::optional<CService> opt_service = ConsumeDeserializable<CService>(fuzzed_data_provider); const std::optional<CService> opt_service = ConsumeDeserializable<CService>(fuzzed_data_provider);
if (opt_service) { if (opt_service) {
addr_man.Good(*opt_service, fuzzed_data_provider.ConsumeBool(), ConsumeTime(fuzzed_data_provider)); addr_man.Good(*opt_service, fuzzed_data_provider.ConsumeBool(), ConsumeTime(fuzzed_data_provider));
} }
break; },
} [&] {
case 8: {
const std::optional<CService> opt_service = ConsumeDeserializable<CService>(fuzzed_data_provider); const std::optional<CService> opt_service = ConsumeDeserializable<CService>(fuzzed_data_provider);
if (opt_service) { if (opt_service) {
addr_man.Attempt(*opt_service, fuzzed_data_provider.ConsumeBool(), ConsumeTime(fuzzed_data_provider)); addr_man.Attempt(*opt_service, fuzzed_data_provider.ConsumeBool(), ConsumeTime(fuzzed_data_provider));
} }
break; },
} [&] {
case 9: {
const std::optional<CService> opt_service = ConsumeDeserializable<CService>(fuzzed_data_provider); const std::optional<CService> opt_service = ConsumeDeserializable<CService>(fuzzed_data_provider);
if (opt_service) { if (opt_service) {
addr_man.Connected(*opt_service, ConsumeTime(fuzzed_data_provider)); addr_man.Connected(*opt_service, ConsumeTime(fuzzed_data_provider));
} }
break; },
} [&] {
case 10: {
const std::optional<CService> opt_service = ConsumeDeserializable<CService>(fuzzed_data_provider); const std::optional<CService> opt_service = ConsumeDeserializable<CService>(fuzzed_data_provider);
if (opt_service) { if (opt_service) {
addr_man.SetServices(*opt_service, ServiceFlags{fuzzed_data_provider.ConsumeIntegral<uint64_t>()}); addr_man.SetServices(*opt_service, ServiceFlags{fuzzed_data_provider.ConsumeIntegral<uint64_t>()});
} }
break; },
} [&] {
case 11: {
(void)addr_man.Check(); (void)addr_man.Check();
break; });
}
}
} }
(void)addr_man.size(); (void)addr_man.size();
CDataStream data_stream(SER_NETWORK, PROTOCOL_VERSION); CDataStream data_stream(SER_NETWORK, PROTOCOL_VERSION);

View file

@ -21,43 +21,37 @@ FUZZ_TARGET(autofile)
FuzzedAutoFileProvider fuzzed_auto_file_provider = ConsumeAutoFile(fuzzed_data_provider); FuzzedAutoFileProvider fuzzed_auto_file_provider = ConsumeAutoFile(fuzzed_data_provider);
CAutoFile auto_file = fuzzed_auto_file_provider.open(); CAutoFile auto_file = fuzzed_auto_file_provider.open();
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 5)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
std::array<uint8_t, 4096> arr{}; std::array<uint8_t, 4096> arr{};
try { try {
auto_file.read((char*)arr.data(), fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096)); auto_file.read((char*)arr.data(), fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096));
} catch (const std::ios_base::failure&) { } catch (const std::ios_base::failure&) {
} }
break; },
} [&] {
case 1: {
const std::array<uint8_t, 4096> arr{}; const std::array<uint8_t, 4096> arr{};
try { try {
auto_file.write((const char*)arr.data(), fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096)); auto_file.write((const char*)arr.data(), fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096));
} catch (const std::ios_base::failure&) { } catch (const std::ios_base::failure&) {
} }
break; },
} [&] {
case 2: {
try { try {
auto_file.ignore(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096)); auto_file.ignore(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096));
} catch (const std::ios_base::failure&) { } catch (const std::ios_base::failure&) {
} }
break; },
} [&] {
case 3: {
auto_file.fclose(); auto_file.fclose();
break; },
} [&] {
case 4: {
ReadFromStream(fuzzed_data_provider, auto_file); ReadFromStream(fuzzed_data_provider, auto_file);
break; },
} [&] {
case 5: {
WriteToStream(fuzzed_data_provider, auto_file); WriteToStream(fuzzed_data_provider, auto_file);
break; });
}
}
} }
(void)auto_file.Get(); (void)auto_file.Get();
(void)auto_file.GetType(); (void)auto_file.GetType();

View file

@ -38,51 +38,43 @@ FUZZ_TARGET_INIT(banman, initialize_banman)
{ {
BanMan ban_man{banlist_file, nullptr, ConsumeBanTimeOffset(fuzzed_data_provider)}; BanMan ban_man{banlist_file, nullptr, ConsumeBanTimeOffset(fuzzed_data_provider)};
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 11)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
ban_man.Ban(ConsumeNetAddr(fuzzed_data_provider), ban_man.Ban(ConsumeNetAddr(fuzzed_data_provider),
ConsumeBanTimeOffset(fuzzed_data_provider), fuzzed_data_provider.ConsumeBool()); ConsumeBanTimeOffset(fuzzed_data_provider), fuzzed_data_provider.ConsumeBool());
break; },
} [&] {
case 1: {
ban_man.Ban(ConsumeSubNet(fuzzed_data_provider), ban_man.Ban(ConsumeSubNet(fuzzed_data_provider),
ConsumeBanTimeOffset(fuzzed_data_provider), fuzzed_data_provider.ConsumeBool()); ConsumeBanTimeOffset(fuzzed_data_provider), fuzzed_data_provider.ConsumeBool());
break; },
} [&] {
case 2: {
ban_man.ClearBanned(); ban_man.ClearBanned();
break; },
} [] {},
case 4: { [&] {
ban_man.IsBanned(ConsumeNetAddr(fuzzed_data_provider)); ban_man.IsBanned(ConsumeNetAddr(fuzzed_data_provider));
break; },
} [&] {
case 5: {
ban_man.IsBanned(ConsumeSubNet(fuzzed_data_provider)); ban_man.IsBanned(ConsumeSubNet(fuzzed_data_provider));
break; },
} [&] {
case 6: {
ban_man.Unban(ConsumeNetAddr(fuzzed_data_provider)); ban_man.Unban(ConsumeNetAddr(fuzzed_data_provider));
break; },
} [&] {
case 7: {
ban_man.Unban(ConsumeSubNet(fuzzed_data_provider)); ban_man.Unban(ConsumeSubNet(fuzzed_data_provider));
break; },
} [&] {
case 8: {
banmap_t banmap; banmap_t banmap;
ban_man.GetBanned(banmap); ban_man.GetBanned(banmap);
break; },
} [&] {
case 9: {
ban_man.DumpBanlist(); ban_man.DumpBanlist();
break; },
} [] {},
case 11: { [&] {
ban_man.Discourage(ConsumeNetAddr(fuzzed_data_provider)); ban_man.Discourage(ConsumeNetAddr(fuzzed_data_provider));
break; });
}
}
} }
} }
fs::remove(banlist_file); fs::remove(banlist_file);

View file

@ -25,47 +25,43 @@ FUZZ_TARGET(bloom_filter)
fuzzed_data_provider.ConsumeIntegral<unsigned int>(), fuzzed_data_provider.ConsumeIntegral<unsigned int>(),
static_cast<unsigned char>(fuzzed_data_provider.PickValueInArray({BLOOM_UPDATE_NONE, BLOOM_UPDATE_ALL, BLOOM_UPDATE_P2PUBKEY_ONLY, BLOOM_UPDATE_MASK}))}; static_cast<unsigned char>(fuzzed_data_provider.PickValueInArray({BLOOM_UPDATE_NONE, BLOOM_UPDATE_ALL, BLOOM_UPDATE_P2PUBKEY_ONLY, BLOOM_UPDATE_MASK}))};
while (fuzzed_data_provider.remaining_bytes() > 0) { while (fuzzed_data_provider.remaining_bytes() > 0) {
switch (fuzzed_data_provider.ConsumeIntegralInRange(0, 3)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
const std::vector<unsigned char> b = ConsumeRandomLengthByteVector(fuzzed_data_provider); const std::vector<unsigned char> b = ConsumeRandomLengthByteVector(fuzzed_data_provider);
(void)bloom_filter.contains(b); (void)bloom_filter.contains(b);
bloom_filter.insert(b); bloom_filter.insert(b);
const bool present = bloom_filter.contains(b); const bool present = bloom_filter.contains(b);
assert(present); assert(present);
break; },
} [&] {
case 1: {
const std::optional<COutPoint> out_point = ConsumeDeserializable<COutPoint>(fuzzed_data_provider); const std::optional<COutPoint> out_point = ConsumeDeserializable<COutPoint>(fuzzed_data_provider);
if (!out_point) { if (!out_point) {
break; return;
} }
(void)bloom_filter.contains(*out_point); (void)bloom_filter.contains(*out_point);
bloom_filter.insert(*out_point); bloom_filter.insert(*out_point);
const bool present = bloom_filter.contains(*out_point); const bool present = bloom_filter.contains(*out_point);
assert(present); assert(present);
break; },
} [&] {
case 2: {
const std::optional<uint256> u256 = ConsumeDeserializable<uint256>(fuzzed_data_provider); const std::optional<uint256> u256 = ConsumeDeserializable<uint256>(fuzzed_data_provider);
if (!u256) { if (!u256) {
break; return;
} }
(void)bloom_filter.contains(*u256); (void)bloom_filter.contains(*u256);
bloom_filter.insert(*u256); bloom_filter.insert(*u256);
const bool present = bloom_filter.contains(*u256); const bool present = bloom_filter.contains(*u256);
assert(present); assert(present);
break; },
} [&] {
case 3: {
const std::optional<CMutableTransaction> mut_tx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider); const std::optional<CMutableTransaction> mut_tx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider);
if (!mut_tx) { if (!mut_tx) {
break; return;
} }
const CTransaction tx{*mut_tx}; const CTransaction tx{*mut_tx};
(void)bloom_filter.IsRelevantAndUpdate(tx); (void)bloom_filter.IsRelevantAndUpdate(tx);
break; });
}
}
(void)bloom_filter.IsWithinSizeConstraints(); (void)bloom_filter.IsWithinSizeConstraints();
} }
} }

View file

@ -31,41 +31,36 @@ FUZZ_TARGET(buffered_file)
if (opt_buffered_file && fuzzed_file != nullptr) { if (opt_buffered_file && fuzzed_file != nullptr) {
bool setpos_fail = false; bool setpos_fail = false;
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 4)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
std::array<uint8_t, 4096> arr{}; std::array<uint8_t, 4096> arr{};
try { try {
opt_buffered_file->read((char*)arr.data(), fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096)); opt_buffered_file->read((char*)arr.data(), fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096));
} catch (const std::ios_base::failure&) { } catch (const std::ios_base::failure&) {
} }
break; },
} [&] {
case 1: {
opt_buffered_file->SetLimit(fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096)); opt_buffered_file->SetLimit(fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096));
break; },
} [&] {
case 2: {
if (!opt_buffered_file->SetPos(fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096))) { if (!opt_buffered_file->SetPos(fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096))) {
setpos_fail = true; setpos_fail = true;
} }
break; },
} [&] {
case 3: {
if (setpos_fail) { if (setpos_fail) {
// Calling FindByte(...) after a failed SetPos(...) call may result in an infinite loop. // Calling FindByte(...) after a failed SetPos(...) call may result in an infinite loop.
break; return;
} }
try { try {
opt_buffered_file->FindByte(fuzzed_data_provider.ConsumeIntegral<char>()); opt_buffered_file->FindByte(fuzzed_data_provider.ConsumeIntegral<char>());
} catch (const std::ios_base::failure&) { } catch (const std::ios_base::failure&) {
} }
break; },
} [&] {
case 4: {
ReadFromStream(fuzzed_data_provider, *opt_buffered_file); ReadFromStream(fuzzed_data_provider, *opt_buffered_file);
break; });
}
}
} }
opt_buffered_file->GetPos(); opt_buffered_file->GetPos();
opt_buffered_file->GetType(); opt_buffered_file->GetType();

View file

@ -50,10 +50,11 @@ FUZZ_TARGET_INIT(coins_view, initialize_coins_view)
Coin random_coin; Coin random_coin;
CMutableTransaction random_mutable_transaction; CMutableTransaction random_mutable_transaction;
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 9)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
if (random_coin.IsSpent()) { if (random_coin.IsSpent()) {
break; return;
} }
Coin coin = random_coin; Coin coin = random_coin;
bool expected_code_path = false; bool expected_code_path = false;
@ -68,57 +69,48 @@ FUZZ_TARGET_INIT(coins_view, initialize_coins_view)
} }
} }
assert(expected_code_path); assert(expected_code_path);
break; },
} [&] {
case 1: {
(void)coins_view_cache.Flush(); (void)coins_view_cache.Flush();
break; },
} [&] {
case 2: {
coins_view_cache.SetBestBlock(ConsumeUInt256(fuzzed_data_provider)); coins_view_cache.SetBestBlock(ConsumeUInt256(fuzzed_data_provider));
break; },
} [&] {
case 3: {
Coin move_to; Coin move_to;
(void)coins_view_cache.SpendCoin(random_out_point, fuzzed_data_provider.ConsumeBool() ? &move_to : nullptr); (void)coins_view_cache.SpendCoin(random_out_point, fuzzed_data_provider.ConsumeBool() ? &move_to : nullptr);
break; },
} [&] {
case 4: {
coins_view_cache.Uncache(random_out_point); coins_view_cache.Uncache(random_out_point);
break; },
} [&] {
case 5: {
if (fuzzed_data_provider.ConsumeBool()) { if (fuzzed_data_provider.ConsumeBool()) {
backend_coins_view = CCoinsView{}; backend_coins_view = CCoinsView{};
} }
coins_view_cache.SetBackend(backend_coins_view); coins_view_cache.SetBackend(backend_coins_view);
break; },
} [&] {
case 6: {
const std::optional<COutPoint> opt_out_point = ConsumeDeserializable<COutPoint>(fuzzed_data_provider); const std::optional<COutPoint> opt_out_point = ConsumeDeserializable<COutPoint>(fuzzed_data_provider);
if (!opt_out_point) { if (!opt_out_point) {
break; return;
} }
random_out_point = *opt_out_point; random_out_point = *opt_out_point;
break; },
} [&] {
case 7: {
const std::optional<Coin> opt_coin = ConsumeDeserializable<Coin>(fuzzed_data_provider); const std::optional<Coin> opt_coin = ConsumeDeserializable<Coin>(fuzzed_data_provider);
if (!opt_coin) { if (!opt_coin) {
break; return;
} }
random_coin = *opt_coin; random_coin = *opt_coin;
break; },
} [&] {
case 8: {
const std::optional<CMutableTransaction> opt_mutable_transaction = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider); const std::optional<CMutableTransaction> opt_mutable_transaction = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider);
if (!opt_mutable_transaction) { if (!opt_mutable_transaction) {
break; return;
} }
random_mutable_transaction = *opt_mutable_transaction; random_mutable_transaction = *opt_mutable_transaction;
break; },
} [&] {
case 9: {
CCoinsMap coins_map; CCoinsMap coins_map;
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
CCoinsCacheEntry coins_cache_entry; CCoinsCacheEntry coins_cache_entry;
@ -128,7 +120,7 @@ FUZZ_TARGET_INIT(coins_view, initialize_coins_view)
} else { } else {
const std::optional<Coin> opt_coin = ConsumeDeserializable<Coin>(fuzzed_data_provider); const std::optional<Coin> opt_coin = ConsumeDeserializable<Coin>(fuzzed_data_provider);
if (!opt_coin) { if (!opt_coin) {
break; return;
} }
coins_cache_entry.coin = *opt_coin; coins_cache_entry.coin = *opt_coin;
} }
@ -144,9 +136,7 @@ FUZZ_TARGET_INIT(coins_view, initialize_coins_view)
} }
} }
assert(expected_code_path); assert(expected_code_path);
break; });
}
}
} }
{ {
@ -199,8 +189,9 @@ FUZZ_TARGET_INIT(coins_view, initialize_coins_view)
} }
if (fuzzed_data_provider.ConsumeBool()) { if (fuzzed_data_provider.ConsumeBool()) {
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 6)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
const CTransaction transaction{random_mutable_transaction}; const CTransaction transaction{random_mutable_transaction};
bool is_spent = false; bool is_spent = false;
for (const CTxOut& tx_out : transaction.vout) { for (const CTxOut& tx_out : transaction.vout) {
@ -211,7 +202,7 @@ FUZZ_TARGET_INIT(coins_view, initialize_coins_view)
if (is_spent) { if (is_spent) {
// Avoid: // Avoid:
// coins.cpp:69: void CCoinsViewCache::AddCoin(const COutPoint &, Coin &&, bool): Assertion `!coin.IsSpent()' failed. // coins.cpp:69: void CCoinsViewCache::AddCoin(const COutPoint &, Coin &&, bool): Assertion `!coin.IsSpent()' failed.
break; return;
} }
bool expected_code_path = false; bool expected_code_path = false;
const int height = fuzzed_data_provider.ConsumeIntegral<int>(); const int height = fuzzed_data_provider.ConsumeIntegral<int>();
@ -226,56 +217,51 @@ FUZZ_TARGET_INIT(coins_view, initialize_coins_view)
} }
} }
assert(expected_code_path); assert(expected_code_path);
break; },
} [&] {
case 1: {
(void)AreInputsStandard(CTransaction{random_mutable_transaction}, coins_view_cache, false); (void)AreInputsStandard(CTransaction{random_mutable_transaction}, coins_view_cache, false);
(void)AreInputsStandard(CTransaction{random_mutable_transaction}, coins_view_cache, true); (void)AreInputsStandard(CTransaction{random_mutable_transaction}, coins_view_cache, true);
break; },
} [&] {
case 2: {
TxValidationState state; TxValidationState state;
CAmount tx_fee_out; CAmount tx_fee_out;
const CTransaction transaction{random_mutable_transaction}; const CTransaction transaction{random_mutable_transaction};
if (ContainsSpentInput(transaction, coins_view_cache)) { if (ContainsSpentInput(transaction, coins_view_cache)) {
// Avoid: // Avoid:
// consensus/tx_verify.cpp:171: bool Consensus::CheckTxInputs(const CTransaction &, TxValidationState &, const CCoinsViewCache &, int, CAmount &): Assertion `!coin.IsSpent()' failed. // consensus/tx_verify.cpp:171: bool Consensus::CheckTxInputs(const CTransaction &, TxValidationState &, const CCoinsViewCache &, int, CAmount &): Assertion `!coin.IsSpent()' failed.
break; return;
} }
try { try {
(void)Consensus::CheckTxInputs(transaction, state, coins_view_cache, fuzzed_data_provider.ConsumeIntegralInRange<int>(0, std::numeric_limits<int>::max()), tx_fee_out); (void)Consensus::CheckTxInputs(transaction, state, coins_view_cache, fuzzed_data_provider.ConsumeIntegralInRange<int>(0, std::numeric_limits<int>::max()), tx_fee_out);
assert(MoneyRange(tx_fee_out)); assert(MoneyRange(tx_fee_out));
} catch (const std::runtime_error&) { } catch (const std::runtime_error&) {
} }
break; },
} [&] {
case 3: {
const CTransaction transaction{random_mutable_transaction}; const CTransaction transaction{random_mutable_transaction};
if (ContainsSpentInput(transaction, coins_view_cache)) { if (ContainsSpentInput(transaction, coins_view_cache)) {
// Avoid: // Avoid:
// consensus/tx_verify.cpp:130: unsigned int GetP2SHSigOpCount(const CTransaction &, const CCoinsViewCache &): Assertion `!coin.IsSpent()' failed. // consensus/tx_verify.cpp:130: unsigned int GetP2SHSigOpCount(const CTransaction &, const CCoinsViewCache &): Assertion `!coin.IsSpent()' failed.
break; return;
} }
(void)GetP2SHSigOpCount(transaction, coins_view_cache); (void)GetP2SHSigOpCount(transaction, coins_view_cache);
break; },
} [&] {
case 4: {
const CTransaction transaction{random_mutable_transaction}; const CTransaction transaction{random_mutable_transaction};
if (ContainsSpentInput(transaction, coins_view_cache)) { if (ContainsSpentInput(transaction, coins_view_cache)) {
// Avoid: // Avoid:
// consensus/tx_verify.cpp:130: unsigned int GetP2SHSigOpCount(const CTransaction &, const CCoinsViewCache &): Assertion `!coin.IsSpent()' failed. // consensus/tx_verify.cpp:130: unsigned int GetP2SHSigOpCount(const CTransaction &, const CCoinsViewCache &): Assertion `!coin.IsSpent()' failed.
break; return;
} }
const int flags = fuzzed_data_provider.ConsumeIntegral<int>(); const int flags = fuzzed_data_provider.ConsumeIntegral<int>();
if (!transaction.vin.empty() && (flags & SCRIPT_VERIFY_WITNESS) != 0 && (flags & SCRIPT_VERIFY_P2SH) == 0) { if (!transaction.vin.empty() && (flags & SCRIPT_VERIFY_WITNESS) != 0 && (flags & SCRIPT_VERIFY_P2SH) == 0) {
// Avoid: // Avoid:
// script/interpreter.cpp:1705: size_t CountWitnessSigOps(const CScript &, const CScript &, const CScriptWitness *, unsigned int): Assertion `(flags & SCRIPT_VERIFY_P2SH) != 0' failed. // script/interpreter.cpp:1705: size_t CountWitnessSigOps(const CScript &, const CScript &, const CScriptWitness *, unsigned int): Assertion `(flags & SCRIPT_VERIFY_P2SH) != 0' failed.
break; return;
} }
(void)GetTransactionSigOpCost(transaction, coins_view_cache, flags); (void)GetTransactionSigOpCost(transaction, coins_view_cache, flags);
break; },
} [&] {
case 5: {
CCoinsStats stats; CCoinsStats stats;
bool expected_code_path = false; bool expected_code_path = false;
try { try {
@ -284,12 +270,9 @@ FUZZ_TARGET_INIT(coins_view, initialize_coins_view)
expected_code_path = true; expected_code_path = true;
} }
assert(expected_code_path); assert(expected_code_path);
break; },
} [&] {
case 6: {
(void)IsWitnessStandard(CTransaction{random_mutable_transaction}, coins_view_cache); (void)IsWitnessStandard(CTransaction{random_mutable_transaction}, coins_view_cache);
break; });
}
}
} }
} }

View file

@ -32,108 +32,104 @@ FUZZ_TARGET_INIT(connman, initialize_connman)
CSubNet random_subnet; CSubNet random_subnet;
std::string random_string; std::string random_string;
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 27)) { CallOneOf(
case 0: fuzzed_data_provider,
[&] {
random_address = ConsumeAddress(fuzzed_data_provider); random_address = ConsumeAddress(fuzzed_data_provider);
break; },
case 1: [&] {
random_netaddr = ConsumeNetAddr(fuzzed_data_provider); random_netaddr = ConsumeNetAddr(fuzzed_data_provider);
break; },
case 2: [&] {
random_service = ConsumeService(fuzzed_data_provider); random_service = ConsumeService(fuzzed_data_provider);
break; },
case 3: [&] {
random_subnet = ConsumeSubNet(fuzzed_data_provider); random_subnet = ConsumeSubNet(fuzzed_data_provider);
break; },
case 4: [&] {
random_string = fuzzed_data_provider.ConsumeRandomLengthString(64); random_string = fuzzed_data_provider.ConsumeRandomLengthString(64);
break; },
case 5: { [&] {
std::vector<CAddress> addresses; std::vector<CAddress> addresses;
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
addresses.push_back(ConsumeAddress(fuzzed_data_provider)); addresses.push_back(ConsumeAddress(fuzzed_data_provider));
} }
// Limit nTimePenalty to int32_t to avoid signed integer overflow // Limit nTimePenalty to int32_t to avoid signed integer overflow
(void)connman.AddNewAddresses(addresses, ConsumeAddress(fuzzed_data_provider), fuzzed_data_provider.ConsumeIntegral<int32_t>()); (void)connman.AddNewAddresses(addresses, ConsumeAddress(fuzzed_data_provider), fuzzed_data_provider.ConsumeIntegral<int32_t>());
break; },
} [&] {
case 6:
connman.AddNode(random_string); connman.AddNode(random_string);
break; },
case 7: [&] {
connman.CheckIncomingNonce(fuzzed_data_provider.ConsumeIntegral<uint64_t>()); connman.CheckIncomingNonce(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
break; },
case 8: [&] {
connman.DisconnectNode(fuzzed_data_provider.ConsumeIntegral<NodeId>()); connman.DisconnectNode(fuzzed_data_provider.ConsumeIntegral<NodeId>());
break; },
case 9: [&] {
connman.DisconnectNode(random_netaddr); connman.DisconnectNode(random_netaddr);
break; },
case 10: [&] {
connman.DisconnectNode(random_string); connman.DisconnectNode(random_string);
break; },
case 11: [&] {
connman.DisconnectNode(random_subnet); connman.DisconnectNode(random_subnet);
break; },
case 12: [&] {
connman.ForEachNode([](auto) {}); connman.ForEachNode([](auto) {});
break; },
case 13: [&] {
connman.ForEachNodeThen([](auto) {}, []() {}); connman.ForEachNodeThen([](auto) {}, []() {});
break; },
case 14: [&] {
(void)connman.ForNode(fuzzed_data_provider.ConsumeIntegral<NodeId>(), [&](auto) { return fuzzed_data_provider.ConsumeBool(); }); (void)connman.ForNode(fuzzed_data_provider.ConsumeIntegral<NodeId>(), [&](auto) { return fuzzed_data_provider.ConsumeBool(); });
break; },
case 15: [&] {
(void)connman.GetAddresses(fuzzed_data_provider.ConsumeIntegral<size_t>(), fuzzed_data_provider.ConsumeIntegral<size_t>()); (void)connman.GetAddresses(fuzzed_data_provider.ConsumeIntegral<size_t>(), fuzzed_data_provider.ConsumeIntegral<size_t>());
break; },
case 16: { [&] {
(void)connman.GetAddresses(random_node, fuzzed_data_provider.ConsumeIntegral<size_t>(), fuzzed_data_provider.ConsumeIntegral<size_t>()); (void)connman.GetAddresses(random_node, fuzzed_data_provider.ConsumeIntegral<size_t>(), fuzzed_data_provider.ConsumeIntegral<size_t>());
break; },
} [&] {
case 17:
(void)connman.GetDeterministicRandomizer(fuzzed_data_provider.ConsumeIntegral<uint64_t>()); (void)connman.GetDeterministicRandomizer(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
break; },
case 18: [&] {
(void)connman.GetNodeCount(fuzzed_data_provider.PickValueInArray({CConnman::CONNECTIONS_NONE, CConnman::CONNECTIONS_IN, CConnman::CONNECTIONS_OUT, CConnman::CONNECTIONS_ALL})); (void)connman.GetNodeCount(fuzzed_data_provider.PickValueInArray({CConnman::CONNECTIONS_NONE, CConnman::CONNECTIONS_IN, CConnman::CONNECTIONS_OUT, CConnman::CONNECTIONS_ALL}));
break; },
case 19: [&] {
connman.MarkAddressGood(random_address); connman.MarkAddressGood(random_address);
break; },
case 20: [&] {
(void)connman.OutboundTargetReached(fuzzed_data_provider.ConsumeBool()); (void)connman.OutboundTargetReached(fuzzed_data_provider.ConsumeBool());
break; },
case 21: [&] {
// Limit now to int32_t to avoid signed integer overflow // Limit now to int32_t to avoid signed integer overflow
(void)connman.PoissonNextSendInbound(fuzzed_data_provider.ConsumeIntegral<int32_t>(), fuzzed_data_provider.ConsumeIntegral<int>()); (void)connman.PoissonNextSendInbound(fuzzed_data_provider.ConsumeIntegral<int32_t>(), fuzzed_data_provider.ConsumeIntegral<int>());
break; },
case 22: { [&] {
CSerializedNetMsg serialized_net_msg; CSerializedNetMsg serialized_net_msg;
serialized_net_msg.m_type = fuzzed_data_provider.ConsumeRandomLengthString(CMessageHeader::COMMAND_SIZE); serialized_net_msg.m_type = fuzzed_data_provider.ConsumeRandomLengthString(CMessageHeader::COMMAND_SIZE);
serialized_net_msg.data = ConsumeRandomLengthByteVector(fuzzed_data_provider); serialized_net_msg.data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
connman.PushMessage(&random_node, std::move(serialized_net_msg)); connman.PushMessage(&random_node, std::move(serialized_net_msg));
break; },
} [&] {
case 23:
connman.RemoveAddedNode(random_string); connman.RemoveAddedNode(random_string);
break; },
case 24: { [&] {
const std::vector<bool> asmap = ConsumeRandomLengthBitVector(fuzzed_data_provider); const std::vector<bool> asmap = ConsumeRandomLengthBitVector(fuzzed_data_provider);
if (SanityCheckASMap(asmap)) { if (SanityCheckASMap(asmap)) {
connman.SetAsmap(asmap); connman.SetAsmap(asmap);
} }
break; },
} [&] {
case 25:
connman.SetNetworkActive(fuzzed_data_provider.ConsumeBool()); connman.SetNetworkActive(fuzzed_data_provider.ConsumeBool());
break; },
case 26: [&] {
connman.SetServices(random_service, ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS)); connman.SetServices(random_service, ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS));
break; },
case 27: [&] {
connman.SetTryNewOutboundPeer(fuzzed_data_provider.ConsumeBool()); connman.SetTryNewOutboundPeer(fuzzed_data_provider.ConsumeBool());
break; });
}
} }
(void)connman.GetAddedNodeInfo(); (void)connman.GetAddedNodeInfo();
(void)connman.GetExtraFullOutboundCount(); (void)connman.GetExtraFullOutboundCount();

View file

@ -39,8 +39,9 @@ FUZZ_TARGET(crypto)
MuHash3072 muhash; MuHash3072 muhash;
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 2)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
if (fuzzed_data_provider.ConsumeBool()) { if (fuzzed_data_provider.ConsumeBool()) {
data = ConsumeRandomLengthByteVector(fuzzed_data_provider); data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
if (data.empty()) { if (data.empty()) {
@ -68,9 +69,8 @@ FUZZ_TARGET(crypto)
} else { } else {
muhash /= MuHash3072(data); muhash /= MuHash3072(data);
} }
break; },
} [&] {
case 1: {
(void)hash160.Reset(); (void)hash160.Reset();
(void)hash256.Reset(); (void)hash256.Reset();
(void)ripemd160.Reset(); (void)ripemd160.Reset();
@ -79,69 +79,55 @@ FUZZ_TARGET(crypto)
(void)sha3.Reset(); (void)sha3.Reset();
(void)sha512.Reset(); (void)sha512.Reset();
muhash = MuHash3072(); muhash = MuHash3072();
break; },
} [&] {
case 2: { CallOneOf(
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 10)) { fuzzed_data_provider,
case 0: { [&] {
data.resize(CHash160::OUTPUT_SIZE); data.resize(CHash160::OUTPUT_SIZE);
hash160.Finalize(data); hash160.Finalize(data);
break; },
} [&] {
case 1: {
data.resize(CHash256::OUTPUT_SIZE); data.resize(CHash256::OUTPUT_SIZE);
hash256.Finalize(data); hash256.Finalize(data);
break; },
} [&] {
case 2: {
data.resize(CHMAC_SHA256::OUTPUT_SIZE); data.resize(CHMAC_SHA256::OUTPUT_SIZE);
hmac_sha256.Finalize(data.data()); hmac_sha256.Finalize(data.data());
break; },
} [&] {
case 3: {
data.resize(CHMAC_SHA512::OUTPUT_SIZE); data.resize(CHMAC_SHA512::OUTPUT_SIZE);
hmac_sha512.Finalize(data.data()); hmac_sha512.Finalize(data.data());
break; },
} [&] {
case 4: {
data.resize(CRIPEMD160::OUTPUT_SIZE); data.resize(CRIPEMD160::OUTPUT_SIZE);
ripemd160.Finalize(data.data()); ripemd160.Finalize(data.data());
break; },
} [&] {
case 5: {
data.resize(CSHA1::OUTPUT_SIZE); data.resize(CSHA1::OUTPUT_SIZE);
sha1.Finalize(data.data()); sha1.Finalize(data.data());
break; },
} [&] {
case 6: {
data.resize(CSHA256::OUTPUT_SIZE); data.resize(CSHA256::OUTPUT_SIZE);
sha256.Finalize(data.data()); sha256.Finalize(data.data());
break; },
} [&] {
case 7: {
data.resize(CSHA512::OUTPUT_SIZE); data.resize(CSHA512::OUTPUT_SIZE);
sha512.Finalize(data.data()); sha512.Finalize(data.data());
break; },
} [&] {
case 8: {
data.resize(1); data.resize(1);
data[0] = sip_hasher.Finalize() % 256; data[0] = sip_hasher.Finalize() % 256;
break; },
} [&] {
case 9: {
data.resize(SHA3_256::OUTPUT_SIZE); data.resize(SHA3_256::OUTPUT_SIZE);
sha3.Finalize(data); sha3.Finalize(data);
break; },
} [&] {
case 10: {
uint256 out; uint256 out;
muhash.Finalize(out); muhash.Finalize(out);
break; });
} });
}
break;
}
}
} }
if (fuzzed_data_provider.ConsumeBool()) { if (fuzzed_data_provider.ConsumeBool()) {
uint64_t state[25]; uint64_t state[25];

View file

@ -20,31 +20,26 @@ FUZZ_TARGET(crypto_chacha20)
chacha20 = ChaCha20{key.data(), key.size()}; chacha20 = ChaCha20{key.data(), key.size()};
} }
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
switch (fuzzed_data_provider.ConsumeIntegralInRange(0, 4)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
const std::vector<unsigned char> key = ConsumeFixedLengthByteVector(fuzzed_data_provider, fuzzed_data_provider.ConsumeIntegralInRange<size_t>(16, 32)); const std::vector<unsigned char> key = ConsumeFixedLengthByteVector(fuzzed_data_provider, fuzzed_data_provider.ConsumeIntegralInRange<size_t>(16, 32));
chacha20.SetKey(key.data(), key.size()); chacha20.SetKey(key.data(), key.size());
break; },
} [&] {
case 1: {
chacha20.SetIV(fuzzed_data_provider.ConsumeIntegral<uint64_t>()); chacha20.SetIV(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
break; },
} [&] {
case 2: {
chacha20.Seek(fuzzed_data_provider.ConsumeIntegral<uint64_t>()); chacha20.Seek(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
break; },
} [&] {
case 3: {
std::vector<uint8_t> output(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096)); std::vector<uint8_t> output(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096));
chacha20.Keystream(output.data(), output.size()); chacha20.Keystream(output.data(), output.size());
break; },
} [&] {
case 4: {
std::vector<uint8_t> output(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096)); std::vector<uint8_t> output(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096));
const std::vector<uint8_t> input = ConsumeFixedLengthByteVector(fuzzed_data_provider, output.size()); const std::vector<uint8_t> input = ConsumeFixedLengthByteVector(fuzzed_data_provider, output.size());
chacha20.Crypt(input.data(), output.data(), input.size()); chacha20.Crypt(input.data(), output.data(), input.size());
break; });
}
}
} }
} }

View file

@ -29,44 +29,37 @@ FUZZ_TARGET(crypto_chacha20_poly1305_aead)
std::vector<uint8_t> out(buffer_size + CHACHA20_POLY1305_AEAD_AAD_LEN + POLY1305_TAGLEN, 0); std::vector<uint8_t> out(buffer_size + CHACHA20_POLY1305_AEAD_AAD_LEN + POLY1305_TAGLEN, 0);
bool is_encrypt = fuzzed_data_provider.ConsumeBool(); bool is_encrypt = fuzzed_data_provider.ConsumeBool();
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 6)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
buffer_size = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(64, 4096); buffer_size = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(64, 4096);
in = std::vector<uint8_t>(buffer_size + CHACHA20_POLY1305_AEAD_AAD_LEN + POLY1305_TAGLEN, 0); in = std::vector<uint8_t>(buffer_size + CHACHA20_POLY1305_AEAD_AAD_LEN + POLY1305_TAGLEN, 0);
out = std::vector<uint8_t>(buffer_size + CHACHA20_POLY1305_AEAD_AAD_LEN + POLY1305_TAGLEN, 0); out = std::vector<uint8_t>(buffer_size + CHACHA20_POLY1305_AEAD_AAD_LEN + POLY1305_TAGLEN, 0);
break; },
} [&] {
case 1: {
(void)aead.Crypt(seqnr_payload, seqnr_aad, aad_pos, out.data(), out.size(), in.data(), buffer_size, is_encrypt); (void)aead.Crypt(seqnr_payload, seqnr_aad, aad_pos, out.data(), out.size(), in.data(), buffer_size, is_encrypt);
break; },
} [&] {
case 2: {
uint32_t len = 0; uint32_t len = 0;
const bool ok = aead.GetLength(&len, seqnr_aad, aad_pos, in.data()); const bool ok = aead.GetLength(&len, seqnr_aad, aad_pos, in.data());
assert(ok); assert(ok);
break; },
} [&] {
case 3: {
seqnr_payload += 1; seqnr_payload += 1;
aad_pos += CHACHA20_POLY1305_AEAD_AAD_LEN; aad_pos += CHACHA20_POLY1305_AEAD_AAD_LEN;
if (aad_pos + CHACHA20_POLY1305_AEAD_AAD_LEN > CHACHA20_ROUND_OUTPUT) { if (aad_pos + CHACHA20_POLY1305_AEAD_AAD_LEN > CHACHA20_ROUND_OUTPUT) {
aad_pos = 0; aad_pos = 0;
seqnr_aad += 1; seqnr_aad += 1;
} }
break; },
} [&] {
case 4: {
seqnr_payload = fuzzed_data_provider.ConsumeIntegral<int>(); seqnr_payload = fuzzed_data_provider.ConsumeIntegral<int>();
break; },
} [&] {
case 5: {
seqnr_aad = fuzzed_data_provider.ConsumeIntegral<int>(); seqnr_aad = fuzzed_data_provider.ConsumeIntegral<int>();
break; },
} [&] {
case 6: {
is_encrypt = fuzzed_data_provider.ConsumeBool(); is_encrypt = fuzzed_data_provider.ConsumeBool();
break; });
}
}
} }
} }

View file

@ -17,15 +17,15 @@ FUZZ_TARGET(merkleblock)
{ {
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
CPartialMerkleTree partial_merkle_tree; CPartialMerkleTree partial_merkle_tree;
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 1)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
const std::optional<CPartialMerkleTree> opt_partial_merkle_tree = ConsumeDeserializable<CPartialMerkleTree>(fuzzed_data_provider); const std::optional<CPartialMerkleTree> opt_partial_merkle_tree = ConsumeDeserializable<CPartialMerkleTree>(fuzzed_data_provider);
if (opt_partial_merkle_tree) { if (opt_partial_merkle_tree) {
partial_merkle_tree = *opt_partial_merkle_tree; partial_merkle_tree = *opt_partial_merkle_tree;
} }
break; },
} [&] {
case 1: {
CMerkleBlock merkle_block; CMerkleBlock merkle_block;
const std::optional<CBlock> opt_block = ConsumeDeserializable<CBlock>(fuzzed_data_provider); const std::optional<CBlock> opt_block = ConsumeDeserializable<CBlock>(fuzzed_data_provider);
CBloomFilter bloom_filter; CBloomFilter bloom_filter;
@ -41,9 +41,7 @@ FUZZ_TARGET(merkleblock)
} }
} }
partial_merkle_tree = merkle_block.txn; partial_merkle_tree = merkle_block.txn;
break; });
}
}
(void)partial_merkle_tree.GetNumTransactions(); (void)partial_merkle_tree.GetNumTransactions();
std::vector<uint256> matches; std::vector<uint256> matches;
std::vector<unsigned int> indices; std::vector<unsigned int> indices;

View file

@ -32,85 +32,74 @@ FUZZ_TARGET_INIT(net, initialize_net)
CNode node{ConsumeNode(fuzzed_data_provider)}; CNode node{ConsumeNode(fuzzed_data_provider)};
node.SetCommonVersion(fuzzed_data_provider.ConsumeIntegral<int>()); node.SetCommonVersion(fuzzed_data_provider.ConsumeIntegral<int>());
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 10)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
node.CloseSocketDisconnect(); node.CloseSocketDisconnect();
break; },
} [&] {
case 1: {
node.MaybeSetAddrName(fuzzed_data_provider.ConsumeRandomLengthString(32)); node.MaybeSetAddrName(fuzzed_data_provider.ConsumeRandomLengthString(32));
break; },
} [&] {
case 2: {
const std::vector<bool> asmap = ConsumeRandomLengthBitVector(fuzzed_data_provider); const std::vector<bool> asmap = ConsumeRandomLengthBitVector(fuzzed_data_provider);
if (!SanityCheckASMap(asmap)) { if (!SanityCheckASMap(asmap)) {
break; return;
} }
CNodeStats stats; CNodeStats stats;
node.copyStats(stats, asmap); node.copyStats(stats, asmap);
break; },
} [&] {
case 3: {
const CNode* add_ref_node = node.AddRef(); const CNode* add_ref_node = node.AddRef();
assert(add_ref_node == &node); assert(add_ref_node == &node);
break; },
} [&] {
case 4: {
if (node.GetRefCount() > 0) { if (node.GetRefCount() > 0) {
node.Release(); node.Release();
} }
break; },
} [&] {
case 5: {
if (node.m_addr_known == nullptr) { if (node.m_addr_known == nullptr) {
break; return;
} }
const std::optional<CAddress> addr_opt = ConsumeDeserializable<CAddress>(fuzzed_data_provider); const std::optional<CAddress> addr_opt = ConsumeDeserializable<CAddress>(fuzzed_data_provider);
if (!addr_opt) { if (!addr_opt) {
break; return;
} }
node.AddAddressKnown(*addr_opt); node.AddAddressKnown(*addr_opt);
break; },
} [&] {
case 6: {
if (node.m_addr_known == nullptr) { if (node.m_addr_known == nullptr) {
break; return;
} }
const std::optional<CAddress> addr_opt = ConsumeDeserializable<CAddress>(fuzzed_data_provider); const std::optional<CAddress> addr_opt = ConsumeDeserializable<CAddress>(fuzzed_data_provider);
if (!addr_opt) { if (!addr_opt) {
break; return;
} }
FastRandomContext fast_random_context{ConsumeUInt256(fuzzed_data_provider)}; FastRandomContext fast_random_context{ConsumeUInt256(fuzzed_data_provider)};
node.PushAddress(*addr_opt, fast_random_context); node.PushAddress(*addr_opt, fast_random_context);
break; },
} [&] {
case 7: {
const std::optional<CInv> inv_opt = ConsumeDeserializable<CInv>(fuzzed_data_provider); const std::optional<CInv> inv_opt = ConsumeDeserializable<CInv>(fuzzed_data_provider);
if (!inv_opt) { if (!inv_opt) {
break; return;
} }
node.AddKnownTx(inv_opt->hash); node.AddKnownTx(inv_opt->hash);
break; },
} [&] {
case 8: {
node.PushTxInventory(ConsumeUInt256(fuzzed_data_provider)); node.PushTxInventory(ConsumeUInt256(fuzzed_data_provider));
break; },
} [&] {
case 9: {
const std::optional<CService> service_opt = ConsumeDeserializable<CService>(fuzzed_data_provider); const std::optional<CService> service_opt = ConsumeDeserializable<CService>(fuzzed_data_provider);
if (!service_opt) { if (!service_opt) {
break; return;
} }
node.SetAddrLocal(*service_opt); node.SetAddrLocal(*service_opt);
break; },
} [&] {
case 10: {
const std::vector<uint8_t> b = ConsumeRandomLengthByteVector(fuzzed_data_provider); const std::vector<uint8_t> b = ConsumeRandomLengthByteVector(fuzzed_data_provider);
bool complete; bool complete;
node.ReceiveMsgBytes(b, complete); node.ReceiveMsgBytes(b, complete);
break; });
}
}
} }
(void)node.GetAddrLocal(); (void)node.GetAddrLocal();

View file

@ -24,20 +24,20 @@ FUZZ_TARGET_INIT(policy_estimator, initialize_policy_estimator)
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
CBlockPolicyEstimator block_policy_estimator; CBlockPolicyEstimator block_policy_estimator;
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 3)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
const std::optional<CMutableTransaction> mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider); const std::optional<CMutableTransaction> mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider);
if (!mtx) { if (!mtx) {
break; return;
} }
const CTransaction tx{*mtx}; const CTransaction tx{*mtx};
block_policy_estimator.processTransaction(ConsumeTxMemPoolEntry(fuzzed_data_provider, tx), fuzzed_data_provider.ConsumeBool()); block_policy_estimator.processTransaction(ConsumeTxMemPoolEntry(fuzzed_data_provider, tx), fuzzed_data_provider.ConsumeBool());
if (fuzzed_data_provider.ConsumeBool()) { if (fuzzed_data_provider.ConsumeBool()) {
(void)block_policy_estimator.removeTx(tx.GetHash(), /* inBlock */ fuzzed_data_provider.ConsumeBool()); (void)block_policy_estimator.removeTx(tx.GetHash(), /* inBlock */ fuzzed_data_provider.ConsumeBool());
} }
break; },
} [&] {
case 1: {
std::vector<CTxMemPoolEntry> mempool_entries; std::vector<CTxMemPoolEntry> mempool_entries;
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
const std::optional<CMutableTransaction> mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider); const std::optional<CMutableTransaction> mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider);
@ -53,17 +53,13 @@ FUZZ_TARGET_INIT(policy_estimator, initialize_policy_estimator)
ptrs.push_back(&mempool_entry); ptrs.push_back(&mempool_entry);
} }
block_policy_estimator.processBlock(fuzzed_data_provider.ConsumeIntegral<unsigned int>(), ptrs); block_policy_estimator.processBlock(fuzzed_data_provider.ConsumeIntegral<unsigned int>(), ptrs);
break; },
} [&] {
case 2: {
(void)block_policy_estimator.removeTx(ConsumeUInt256(fuzzed_data_provider), /* inBlock */ fuzzed_data_provider.ConsumeBool()); (void)block_policy_estimator.removeTx(ConsumeUInt256(fuzzed_data_provider), /* inBlock */ fuzzed_data_provider.ConsumeBool());
break; },
} [&] {
case 3: {
block_policy_estimator.FlushUnconfirmed(); block_policy_estimator.FlushUnconfirmed();
break; });
}
}
(void)block_policy_estimator.estimateFee(fuzzed_data_provider.ConsumeIntegral<int>()); (void)block_policy_estimator.estimateFee(fuzzed_data_provider.ConsumeIntegral<int>());
EstimationResult result; EstimationResult result;
(void)block_policy_estimator.estimateRawFee(fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeFloatingPoint<double>(), fuzzed_data_provider.PickValueInArray({FeeEstimateHorizon::SHORT_HALFLIFE, FeeEstimateHorizon::MED_HALFLIFE, FeeEstimateHorizon::LONG_HALFLIFE}), fuzzed_data_provider.ConsumeBool() ? &result : nullptr); (void)block_policy_estimator.estimateRawFee(fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeFloatingPoint<double>(), fuzzed_data_provider.PickValueInArray({FeeEstimateHorizon::SHORT_HALFLIFE, FeeEstimateHorizon::MED_HALFLIFE, FeeEstimateHorizon::LONG_HALFLIFE}), fuzzed_data_provider.ConsumeBool() ? &result : nullptr);

View file

@ -22,29 +22,27 @@ FUZZ_TARGET(rolling_bloom_filter)
fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(1, 1000), fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(1, 1000),
0.999 / fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(1, std::numeric_limits<unsigned int>::max())}; 0.999 / fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(1, std::numeric_limits<unsigned int>::max())};
while (fuzzed_data_provider.remaining_bytes() > 0) { while (fuzzed_data_provider.remaining_bytes() > 0) {
switch (fuzzed_data_provider.ConsumeIntegralInRange(0, 2)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
const std::vector<unsigned char> b = ConsumeRandomLengthByteVector(fuzzed_data_provider); const std::vector<unsigned char> b = ConsumeRandomLengthByteVector(fuzzed_data_provider);
(void)rolling_bloom_filter.contains(b); (void)rolling_bloom_filter.contains(b);
rolling_bloom_filter.insert(b); rolling_bloom_filter.insert(b);
const bool present = rolling_bloom_filter.contains(b); const bool present = rolling_bloom_filter.contains(b);
assert(present); assert(present);
break; },
} [&] {
case 1: {
const std::optional<uint256> u256 = ConsumeDeserializable<uint256>(fuzzed_data_provider); const std::optional<uint256> u256 = ConsumeDeserializable<uint256>(fuzzed_data_provider);
if (!u256) { if (!u256) {
break; return;
} }
(void)rolling_bloom_filter.contains(*u256); (void)rolling_bloom_filter.contains(*u256);
rolling_bloom_filter.insert(*u256); rolling_bloom_filter.insert(*u256);
const bool present = rolling_bloom_filter.contains(*u256); const bool present = rolling_bloom_filter.contains(*u256);
assert(present); assert(present);
break; },
} [&] {
case 2:
rolling_bloom_filter.reset(); rolling_bloom_filter.reset();
break; });
}
} }
} }

View file

@ -16,33 +16,32 @@ FUZZ_TARGET(script_ops)
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
CScript script = ConsumeScript(fuzzed_data_provider); CScript script = ConsumeScript(fuzzed_data_provider);
while (fuzzed_data_provider.remaining_bytes() > 0) { while (fuzzed_data_provider.remaining_bytes() > 0) {
switch (fuzzed_data_provider.ConsumeIntegralInRange(0, 7)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
CScript s = ConsumeScript(fuzzed_data_provider); CScript s = ConsumeScript(fuzzed_data_provider);
script = std::move(s); script = std::move(s);
break; },
} [&] {
case 1: {
const CScript& s = ConsumeScript(fuzzed_data_provider); const CScript& s = ConsumeScript(fuzzed_data_provider);
script = s; script = s;
break; },
} [&] {
case 2:
script << fuzzed_data_provider.ConsumeIntegral<int64_t>(); script << fuzzed_data_provider.ConsumeIntegral<int64_t>();
break; },
case 3: [&] {
script << ConsumeOpcodeType(fuzzed_data_provider); script << ConsumeOpcodeType(fuzzed_data_provider);
break; },
case 4: [&] {
script << ConsumeScriptNum(fuzzed_data_provider); script << ConsumeScriptNum(fuzzed_data_provider);
break; },
case 5: [&] {
script << ConsumeRandomLengthByteVector(fuzzed_data_provider); script << ConsumeRandomLengthByteVector(fuzzed_data_provider);
break; },
case 6: [&] {
script.clear(); script.clear();
break; },
case 7: { [&] {
(void)script.GetSigOpCount(false); (void)script.GetSigOpCount(false);
(void)script.GetSigOpCount(true); (void)script.GetSigOpCount(true);
(void)script.GetSigOpCount(script); (void)script.GetSigOpCount(script);
@ -64,8 +63,6 @@ FUZZ_TARGET(script_ops)
std::vector<uint8_t> program; std::vector<uint8_t> program;
(void)script.IsWitnessProgram(version, program); (void)script.IsWitnessProgram(version, program);
} }
break; });
}
}
} }
} }

View file

@ -29,8 +29,9 @@ FUZZ_TARGET(scriptnum_ops)
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
CScriptNum script_num = ConsumeScriptNum(fuzzed_data_provider); CScriptNum script_num = ConsumeScriptNum(fuzzed_data_provider);
while (fuzzed_data_provider.remaining_bytes() > 0) { while (fuzzed_data_provider.remaining_bytes() > 0) {
switch (fuzzed_data_provider.ConsumeIntegralInRange(0, 11)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
const int64_t i = fuzzed_data_provider.ConsumeIntegral<int64_t>(); const int64_t i = fuzzed_data_provider.ConsumeIntegral<int64_t>();
assert((script_num == i) != (script_num != i)); assert((script_num == i) != (script_num != i));
assert((script_num <= i) != (script_num > i)); assert((script_num <= i) != (script_num > i));
@ -45,9 +46,8 @@ FUZZ_TARGET(scriptnum_ops)
if (IsValidSubtraction(script_num, CScriptNum{i})) { if (IsValidSubtraction(script_num, CScriptNum{i})) {
assert((script_num - i) + i == script_num); assert((script_num - i) + i == script_num);
} }
break; },
} [&] {
case 1: {
const CScriptNum random_script_num = ConsumeScriptNum(fuzzed_data_provider); const CScriptNum random_script_num = ConsumeScriptNum(fuzzed_data_provider);
assert((script_num == random_script_num) != (script_num != random_script_num)); assert((script_num == random_script_num) != (script_num != random_script_num));
assert((script_num <= random_script_num) != (script_num > random_script_num)); assert((script_num <= random_script_num) != (script_num > random_script_num));
@ -62,72 +62,66 @@ FUZZ_TARGET(scriptnum_ops)
if (IsValidSubtraction(script_num, random_script_num)) { if (IsValidSubtraction(script_num, random_script_num)) {
assert((script_num - random_script_num) + random_script_num == script_num); assert((script_num - random_script_num) + random_script_num == script_num);
} }
break; },
} [&] {
case 2: {
const CScriptNum random_script_num = ConsumeScriptNum(fuzzed_data_provider); const CScriptNum random_script_num = ConsumeScriptNum(fuzzed_data_provider);
if (!IsValidAddition(script_num, random_script_num)) { if (!IsValidAddition(script_num, random_script_num)) {
// Avoid assertion failure: // Avoid assertion failure:
// ./script/script.h:292: CScriptNum &CScriptNum::operator+=(const int64_t &): Assertion `rhs == 0 || (rhs > 0 && m_value <= std::numeric_limits<int64_t>::max() - rhs) || (rhs < 0 && m_value >= std::numeric_limits<int64_t>::min() - rhs)' failed. // ./script/script.h:292: CScriptNum &CScriptNum::operator+=(const int64_t &): Assertion `rhs == 0 || (rhs > 0 && m_value <= std::numeric_limits<int64_t>::max() - rhs) || (rhs < 0 && m_value >= std::numeric_limits<int64_t>::min() - rhs)' failed.
break; return;
} }
script_num += random_script_num; script_num += random_script_num;
break; },
} [&] {
case 3: {
const CScriptNum random_script_num = ConsumeScriptNum(fuzzed_data_provider); const CScriptNum random_script_num = ConsumeScriptNum(fuzzed_data_provider);
if (!IsValidSubtraction(script_num, random_script_num)) { if (!IsValidSubtraction(script_num, random_script_num)) {
// Avoid assertion failure: // Avoid assertion failure:
// ./script/script.h:300: CScriptNum &CScriptNum::operator-=(const int64_t &): Assertion `rhs == 0 || (rhs > 0 && m_value >= std::numeric_limits<int64_t>::min() + rhs) || (rhs < 0 && m_value <= std::numeric_limits<int64_t>::max() + rhs)' failed. // ./script/script.h:300: CScriptNum &CScriptNum::operator-=(const int64_t &): Assertion `rhs == 0 || (rhs > 0 && m_value >= std::numeric_limits<int64_t>::min() + rhs) || (rhs < 0 && m_value <= std::numeric_limits<int64_t>::max() + rhs)' failed.
break; return;
} }
script_num -= random_script_num; script_num -= random_script_num;
break; },
} [&] {
case 4:
script_num = script_num & fuzzed_data_provider.ConsumeIntegral<int64_t>(); script_num = script_num & fuzzed_data_provider.ConsumeIntegral<int64_t>();
break; },
case 5: [&] {
script_num = script_num & ConsumeScriptNum(fuzzed_data_provider); script_num = script_num & ConsumeScriptNum(fuzzed_data_provider);
break; },
case 6: [&] {
script_num &= ConsumeScriptNum(fuzzed_data_provider); script_num &= ConsumeScriptNum(fuzzed_data_provider);
break; },
case 7: [&] {
if (script_num == CScriptNum{std::numeric_limits<int64_t>::min()}) { if (script_num == CScriptNum{std::numeric_limits<int64_t>::min()}) {
// Avoid assertion failure: // Avoid assertion failure:
// ./script/script.h:279: CScriptNum CScriptNum::operator-() const: Assertion `m_value != std::numeric_limits<int64_t>::min()' failed. // ./script/script.h:279: CScriptNum CScriptNum::operator-() const: Assertion `m_value != std::numeric_limits<int64_t>::min()' failed.
break; return;
} }
script_num = -script_num; script_num = -script_num;
break; },
case 8: [&] {
script_num = fuzzed_data_provider.ConsumeIntegral<int64_t>(); script_num = fuzzed_data_provider.ConsumeIntegral<int64_t>();
break; },
case 9: { [&] {
const int64_t random_integer = fuzzed_data_provider.ConsumeIntegral<int64_t>(); const int64_t random_integer = fuzzed_data_provider.ConsumeIntegral<int64_t>();
if (!IsValidAddition(script_num, CScriptNum{random_integer})) { if (!IsValidAddition(script_num, CScriptNum{random_integer})) {
// Avoid assertion failure: // Avoid assertion failure:
// ./script/script.h:292: CScriptNum &CScriptNum::operator+=(const int64_t &): Assertion `rhs == 0 || (rhs > 0 && m_value <= std::numeric_limits<int64_t>::max() - rhs) || (rhs < 0 && m_value >= std::numeric_limits<int64_t>::min() - rhs)' failed. // ./script/script.h:292: CScriptNum &CScriptNum::operator+=(const int64_t &): Assertion `rhs == 0 || (rhs > 0 && m_value <= std::numeric_limits<int64_t>::max() - rhs) || (rhs < 0 && m_value >= std::numeric_limits<int64_t>::min() - rhs)' failed.
break; return;
} }
script_num += random_integer; script_num += random_integer;
break; },
} [&] {
case 10: {
const int64_t random_integer = fuzzed_data_provider.ConsumeIntegral<int64_t>(); const int64_t random_integer = fuzzed_data_provider.ConsumeIntegral<int64_t>();
if (!IsValidSubtraction(script_num, CScriptNum{random_integer})) { if (!IsValidSubtraction(script_num, CScriptNum{random_integer})) {
// Avoid assertion failure: // Avoid assertion failure:
// ./script/script.h:300: CScriptNum &CScriptNum::operator-=(const int64_t &): Assertion `rhs == 0 || (rhs > 0 && m_value >= std::numeric_limits<int64_t>::min() + rhs) || (rhs < 0 && m_value <= std::numeric_limits<int64_t>::max() + rhs)' failed. // ./script/script.h:300: CScriptNum &CScriptNum::operator-=(const int64_t &): Assertion `rhs == 0 || (rhs > 0 && m_value >= std::numeric_limits<int64_t>::min() + rhs) || (rhs < 0 && m_value <= std::numeric_limits<int64_t>::max() + rhs)' failed.
break; return;
} }
script_num -= random_integer; script_num -= random_integer;
break; },
} [&] {
case 11:
script_num &= fuzzed_data_provider.ConsumeIntegral<int64_t>(); script_num &= fuzzed_data_provider.ConsumeIntegral<int64_t>();
break; });
}
(void)script_num.getint(); (void)script_num.getint();
(void)script_num.getvch(); (void)script_num.getvch();
} }

View file

@ -4,6 +4,7 @@
#include <test/fuzz/FuzzedDataProvider.h> #include <test/fuzz/FuzzedDataProvider.h>
#include <test/fuzz/fuzz.h> #include <test/fuzz/fuzz.h>
#include <test/fuzz/util.h>
#include <tinyformat.h> #include <tinyformat.h>
#include <util/strencodings.h> #include <util/strencodings.h>
#include <util/translation.h> #include <util/translation.h>
@ -109,32 +110,32 @@ FUZZ_TARGET(str_printf)
} }
try { try {
switch (fuzzed_data_provider.ConsumeIntegralInRange(0, 5)) { CallOneOf(
case 0: fuzzed_data_provider,
[&] {
(void)strprintf(format_string, fuzzed_data_provider.ConsumeRandomLengthString(32)); (void)strprintf(format_string, fuzzed_data_provider.ConsumeRandomLengthString(32));
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeRandomLengthString(32)); (void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeRandomLengthString(32));
break; },
case 1: [&] {
(void)strprintf(format_string, fuzzed_data_provider.ConsumeRandomLengthString(32).c_str()); (void)strprintf(format_string, fuzzed_data_provider.ConsumeRandomLengthString(32).c_str());
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeRandomLengthString(32).c_str()); (void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeRandomLengthString(32).c_str());
break; },
case 2: [&] {
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<signed char>()); (void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<signed char>());
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<signed char>()); (void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<signed char>());
break; },
case 3: [&] {
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<unsigned char>()); (void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<unsigned char>());
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<unsigned char>()); (void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<unsigned char>());
break; },
case 4: [&] {
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<char>()); (void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<char>());
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<char>()); (void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<char>());
break; },
case 5: [&] {
(void)strprintf(format_string, fuzzed_data_provider.ConsumeBool()); (void)strprintf(format_string, fuzzed_data_provider.ConsumeBool());
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeBool()); (void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeBool());
break; });
}
} catch (const tinyformat::format_error&) { } catch (const tinyformat::format_error&) {
} }
@ -155,40 +156,40 @@ FUZZ_TARGET(str_printf)
} }
try { try {
switch (fuzzed_data_provider.ConsumeIntegralInRange(0, 7)) { CallOneOf(
case 0: fuzzed_data_provider,
[&] {
(void)strprintf(format_string, fuzzed_data_provider.ConsumeFloatingPoint<float>()); (void)strprintf(format_string, fuzzed_data_provider.ConsumeFloatingPoint<float>());
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeFloatingPoint<float>()); (void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeFloatingPoint<float>());
break; },
case 1: [&] {
(void)strprintf(format_string, fuzzed_data_provider.ConsumeFloatingPoint<double>()); (void)strprintf(format_string, fuzzed_data_provider.ConsumeFloatingPoint<double>());
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeFloatingPoint<double>()); (void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeFloatingPoint<double>());
break; },
case 2: [&] {
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<int16_t>()); (void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<int16_t>());
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<int16_t>()); (void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<int16_t>());
break; },
case 3: [&] {
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<uint16_t>()); (void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<uint16_t>());
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<uint16_t>()); (void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<uint16_t>());
break; },
case 4: [&] {
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<int32_t>()); (void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<int32_t>());
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<int32_t>()); (void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<int32_t>());
break; },
case 5: [&] {
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<uint32_t>()); (void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<uint32_t>());
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<uint32_t>()); (void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<uint32_t>());
break; },
case 6: [&] {
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<int64_t>()); (void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<int64_t>());
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<int64_t>()); (void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<int64_t>());
break; },
case 7: [&] {
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<uint64_t>()); (void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<uint64_t>());
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<uint64_t>()); (void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<uint64_t>());
break; });
}
} catch (const tinyformat::format_error&) { } catch (const tinyformat::format_error&) {
} }
} }

View file

@ -32,35 +32,31 @@ FUZZ_TARGET(system)
} }
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 7)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
args_manager.SelectConfigNetwork(fuzzed_data_provider.ConsumeRandomLengthString(16)); args_manager.SelectConfigNetwork(fuzzed_data_provider.ConsumeRandomLengthString(16));
break; },
} [&] {
case 1: {
args_manager.SoftSetArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeRandomLengthString(16)); args_manager.SoftSetArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeRandomLengthString(16));
break; },
} [&] {
case 2: {
args_manager.ForceSetArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeRandomLengthString(16)); args_manager.ForceSetArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeRandomLengthString(16));
break; },
} [&] {
case 3: {
args_manager.SoftSetBoolArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeBool()); args_manager.SoftSetBoolArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeBool());
break; },
} [&] {
case 4: {
const OptionsCategory options_category = fuzzed_data_provider.PickValueInArray<OptionsCategory>({OptionsCategory::OPTIONS, OptionsCategory::CONNECTION, OptionsCategory::WALLET, OptionsCategory::WALLET_DEBUG_TEST, OptionsCategory::ZMQ, OptionsCategory::DEBUG_TEST, OptionsCategory::CHAINPARAMS, OptionsCategory::NODE_RELAY, OptionsCategory::BLOCK_CREATION, OptionsCategory::RPC, OptionsCategory::GUI, OptionsCategory::COMMANDS, OptionsCategory::REGISTER_COMMANDS, OptionsCategory::HIDDEN}); const OptionsCategory options_category = fuzzed_data_provider.PickValueInArray<OptionsCategory>({OptionsCategory::OPTIONS, OptionsCategory::CONNECTION, OptionsCategory::WALLET, OptionsCategory::WALLET_DEBUG_TEST, OptionsCategory::ZMQ, OptionsCategory::DEBUG_TEST, OptionsCategory::CHAINPARAMS, OptionsCategory::NODE_RELAY, OptionsCategory::BLOCK_CREATION, OptionsCategory::RPC, OptionsCategory::GUI, OptionsCategory::COMMANDS, OptionsCategory::REGISTER_COMMANDS, OptionsCategory::HIDDEN});
// Avoid hitting: // Avoid hitting:
// util/system.cpp:425: void ArgsManager::AddArg(const std::string &, const std::string &, unsigned int, const OptionsCategory &): Assertion `ret.second' failed. // util/system.cpp:425: void ArgsManager::AddArg(const std::string &, const std::string &, unsigned int, const OptionsCategory &): Assertion `ret.second' failed.
const std::string argument_name = GetArgumentName(fuzzed_data_provider.ConsumeRandomLengthString(16)); const std::string argument_name = GetArgumentName(fuzzed_data_provider.ConsumeRandomLengthString(16));
if (args_manager.GetArgFlags(argument_name) != nullopt) { if (args_manager.GetArgFlags(argument_name) != nullopt) {
break; return;
} }
args_manager.AddArg(argument_name, fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeIntegral<unsigned int>(), options_category); args_manager.AddArg(argument_name, fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeIntegral<unsigned int>(), options_category);
break; },
} [&] {
case 5: {
// Avoid hitting: // Avoid hitting:
// util/system.cpp:425: void ArgsManager::AddArg(const std::string &, const std::string &, unsigned int, const OptionsCategory &): Assertion `ret.second' failed. // util/system.cpp:425: void ArgsManager::AddArg(const std::string &, const std::string &, unsigned int, const OptionsCategory &): Assertion `ret.second' failed.
const std::vector<std::string> names = ConsumeRandomLengthStringVector(fuzzed_data_provider); const std::vector<std::string> names = ConsumeRandomLengthStringVector(fuzzed_data_provider);
@ -76,13 +72,11 @@ FUZZ_TARGET(system)
hidden_arguments.push_back(hidden_argument); hidden_arguments.push_back(hidden_argument);
} }
args_manager.AddHiddenArgs(hidden_arguments); args_manager.AddHiddenArgs(hidden_arguments);
break; },
} [&] {
case 6: {
args_manager.ClearArgs(); args_manager.ClearArgs();
break; },
} [&] {
case 7: {
const std::vector<std::string> random_arguments = ConsumeRandomLengthStringVector(fuzzed_data_provider); const std::vector<std::string> random_arguments = ConsumeRandomLengthStringVector(fuzzed_data_provider);
std::vector<const char*> argv; std::vector<const char*> argv;
argv.reserve(random_arguments.size()); argv.reserve(random_arguments.size());
@ -94,9 +88,7 @@ FUZZ_TARGET(system)
(void)args_manager.ParseParameters(argv.size(), argv.data(), error); (void)args_manager.ParseParameters(argv.size(), argv.data(), error);
} catch (const std::logic_error&) { } catch (const std::logic_error&) {
} }
break; });
}
}
} }
const std::string s1 = fuzzed_data_provider.ConsumeRandomLengthString(16); const std::string s1 = fuzzed_data_provider.ConsumeRandomLengthString(16);

View file

@ -36,6 +36,17 @@
#include <string> #include <string>
#include <vector> #include <vector>
template <typename... Callables>
void CallOneOf(FuzzedDataProvider& fuzzed_data_provider, Callables... callables)
{
constexpr size_t call_size{sizeof...(callables)};
static_assert(call_size >= 1);
const size_t call_index{fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, call_size - 1)};
size_t i{0};
return ((i++ == call_index ? callables() : void()), ...);
}
[[nodiscard]] inline std::vector<uint8_t> ConsumeRandomLengthByteVector(FuzzedDataProvider& fuzzed_data_provider, const size_t max_length = 4096) noexcept [[nodiscard]] inline std::vector<uint8_t> ConsumeRandomLengthByteVector(FuzzedDataProvider& fuzzed_data_provider, const size_t max_length = 4096) noexcept
{ {
const std::string s = fuzzed_data_provider.ConsumeRandomLengthString(max_length); const std::string s = fuzzed_data_provider.ConsumeRandomLengthString(max_length);
@ -165,37 +176,31 @@ template <typename WeakEnumType, size_t size>
[[nodiscard]] inline CTxDestination ConsumeTxDestination(FuzzedDataProvider& fuzzed_data_provider) noexcept [[nodiscard]] inline CTxDestination ConsumeTxDestination(FuzzedDataProvider& fuzzed_data_provider) noexcept
{ {
CTxDestination tx_destination; CTxDestination tx_destination;
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 5)) { CallOneOf(
case 0: { fuzzed_data_provider,
[&] {
tx_destination = CNoDestination{}; tx_destination = CNoDestination{};
break; },
} [&] {
case 1: {
tx_destination = PKHash{ConsumeUInt160(fuzzed_data_provider)}; tx_destination = PKHash{ConsumeUInt160(fuzzed_data_provider)};
break; },
} [&] {
case 2: {
tx_destination = ScriptHash{ConsumeUInt160(fuzzed_data_provider)}; tx_destination = ScriptHash{ConsumeUInt160(fuzzed_data_provider)};
break; },
} [&] {
case 3: {
tx_destination = WitnessV0ScriptHash{ConsumeUInt256(fuzzed_data_provider)}; tx_destination = WitnessV0ScriptHash{ConsumeUInt256(fuzzed_data_provider)};
break; },
} [&] {
case 4: {
tx_destination = WitnessV0KeyHash{ConsumeUInt160(fuzzed_data_provider)}; tx_destination = WitnessV0KeyHash{ConsumeUInt160(fuzzed_data_provider)};
break; },
} [&] {
case 5: {
WitnessUnknown witness_unknown{}; WitnessUnknown witness_unknown{};
witness_unknown.version = fuzzed_data_provider.ConsumeIntegral<int>(); witness_unknown.version = fuzzed_data_provider.ConsumeIntegral<int>();
const std::vector<uint8_t> witness_unknown_program_1 = fuzzed_data_provider.ConsumeBytes<uint8_t>(40); const std::vector<uint8_t> witness_unknown_program_1 = fuzzed_data_provider.ConsumeBytes<uint8_t>(40);
witness_unknown.length = witness_unknown_program_1.size(); witness_unknown.length = witness_unknown_program_1.size();
std::copy(witness_unknown_program_1.begin(), witness_unknown_program_1.end(), witness_unknown.program); std::copy(witness_unknown_program_1.begin(), witness_unknown_program_1.end(), witness_unknown.program);
tx_destination = witness_unknown; tx_destination = witness_unknown;
break; });
}
}
return tx_destination; return tx_destination;
} }
@ -354,32 +359,26 @@ public:
return nullptr; return nullptr;
} }
std::string mode; std::string mode;
switch (m_fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 5)) { CallOneOf(
case 0: { m_fuzzed_data_provider,
[&] {
mode = "r"; mode = "r";
break; },
} [&] {
case 1: {
mode = "r+"; mode = "r+";
break; },
} [&] {
case 2: {
mode = "w"; mode = "w";
break; },
} [&] {
case 3: {
mode = "w+"; mode = "w+";
break; },
} [&] {
case 4: {
mode = "a"; mode = "a";
break; },
} [&] {
case 5: {
mode = "a+"; mode = "a+";
break; });
}
}
#ifdef _GNU_SOURCE #ifdef _GNU_SOURCE
const cookie_io_functions_t io_hooks = { const cookie_io_functions_t io_hooks = {
FuzzedFileProvider::read, FuzzedFileProvider::read,
@ -477,66 +476,64 @@ public:
return {fuzzed_data_provider}; return {fuzzed_data_provider};
} }
#define WRITE_TO_STREAM_CASE(id, type, consume) \ #define WRITE_TO_STREAM_CASE(type, consume) \
case id: { \ [&] { \
type o = consume; \ type o = consume; \
stream << o; \ stream << o; \
break; \
} }
template <typename Stream> template <typename Stream>
void WriteToStream(FuzzedDataProvider& fuzzed_data_provider, Stream& stream) noexcept void WriteToStream(FuzzedDataProvider& fuzzed_data_provider, Stream& stream) noexcept
{ {
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
try { try {
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 13)) { CallOneOf(
WRITE_TO_STREAM_CASE(0, bool, fuzzed_data_provider.ConsumeBool()) fuzzed_data_provider,
WRITE_TO_STREAM_CASE(1, char, fuzzed_data_provider.ConsumeIntegral<char>()) WRITE_TO_STREAM_CASE(bool, fuzzed_data_provider.ConsumeBool()),
WRITE_TO_STREAM_CASE(2, int8_t, fuzzed_data_provider.ConsumeIntegral<int8_t>()) WRITE_TO_STREAM_CASE(char, fuzzed_data_provider.ConsumeIntegral<char>()),
WRITE_TO_STREAM_CASE(3, uint8_t, fuzzed_data_provider.ConsumeIntegral<uint8_t>()) WRITE_TO_STREAM_CASE(int8_t, fuzzed_data_provider.ConsumeIntegral<int8_t>()),
WRITE_TO_STREAM_CASE(4, int16_t, fuzzed_data_provider.ConsumeIntegral<int16_t>()) WRITE_TO_STREAM_CASE(uint8_t, fuzzed_data_provider.ConsumeIntegral<uint8_t>()),
WRITE_TO_STREAM_CASE(5, uint16_t, fuzzed_data_provider.ConsumeIntegral<uint16_t>()) WRITE_TO_STREAM_CASE(int16_t, fuzzed_data_provider.ConsumeIntegral<int16_t>()),
WRITE_TO_STREAM_CASE(6, int32_t, fuzzed_data_provider.ConsumeIntegral<int32_t>()) WRITE_TO_STREAM_CASE(uint16_t, fuzzed_data_provider.ConsumeIntegral<uint16_t>()),
WRITE_TO_STREAM_CASE(7, uint32_t, fuzzed_data_provider.ConsumeIntegral<uint32_t>()) WRITE_TO_STREAM_CASE(int32_t, fuzzed_data_provider.ConsumeIntegral<int32_t>()),
WRITE_TO_STREAM_CASE(8, int64_t, fuzzed_data_provider.ConsumeIntegral<int64_t>()) WRITE_TO_STREAM_CASE(uint32_t, fuzzed_data_provider.ConsumeIntegral<uint32_t>()),
WRITE_TO_STREAM_CASE(9, uint64_t, fuzzed_data_provider.ConsumeIntegral<uint64_t>()) WRITE_TO_STREAM_CASE(int64_t, fuzzed_data_provider.ConsumeIntegral<int64_t>()),
WRITE_TO_STREAM_CASE(10, float, fuzzed_data_provider.ConsumeFloatingPoint<float>()) WRITE_TO_STREAM_CASE(uint64_t, fuzzed_data_provider.ConsumeIntegral<uint64_t>()),
WRITE_TO_STREAM_CASE(11, double, fuzzed_data_provider.ConsumeFloatingPoint<double>()) WRITE_TO_STREAM_CASE(float, fuzzed_data_provider.ConsumeFloatingPoint<float>()),
WRITE_TO_STREAM_CASE(12, std::string, fuzzed_data_provider.ConsumeRandomLengthString(32)) WRITE_TO_STREAM_CASE(double, fuzzed_data_provider.ConsumeFloatingPoint<double>()),
WRITE_TO_STREAM_CASE(13, std::vector<char>, ConsumeRandomLengthIntegralVector<char>(fuzzed_data_provider)) WRITE_TO_STREAM_CASE(std::string, fuzzed_data_provider.ConsumeRandomLengthString(32)),
} WRITE_TO_STREAM_CASE(std::vector<char>, ConsumeRandomLengthIntegralVector<char>(fuzzed_data_provider)));
} catch (const std::ios_base::failure&) { } catch (const std::ios_base::failure&) {
break; break;
} }
} }
} }
#define READ_FROM_STREAM_CASE(id, type) \ #define READ_FROM_STREAM_CASE(type) \
case id: { \ [&] { \
type o; \ type o; \
stream >> o; \ stream >> o; \
break; \
} }
template <typename Stream> template <typename Stream>
void ReadFromStream(FuzzedDataProvider& fuzzed_data_provider, Stream& stream) noexcept void ReadFromStream(FuzzedDataProvider& fuzzed_data_provider, Stream& stream) noexcept
{ {
while (fuzzed_data_provider.ConsumeBool()) { while (fuzzed_data_provider.ConsumeBool()) {
try { try {
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 13)) { CallOneOf(
READ_FROM_STREAM_CASE(0, bool) fuzzed_data_provider,
READ_FROM_STREAM_CASE(1, char) READ_FROM_STREAM_CASE(bool),
READ_FROM_STREAM_CASE(2, int8_t) READ_FROM_STREAM_CASE(char),
READ_FROM_STREAM_CASE(3, uint8_t) READ_FROM_STREAM_CASE(int8_t),
READ_FROM_STREAM_CASE(4, int16_t) READ_FROM_STREAM_CASE(uint8_t),
READ_FROM_STREAM_CASE(5, uint16_t) READ_FROM_STREAM_CASE(int16_t),
READ_FROM_STREAM_CASE(6, int32_t) READ_FROM_STREAM_CASE(uint16_t),
READ_FROM_STREAM_CASE(7, uint32_t) READ_FROM_STREAM_CASE(int32_t),
READ_FROM_STREAM_CASE(8, int64_t) READ_FROM_STREAM_CASE(uint32_t),
READ_FROM_STREAM_CASE(9, uint64_t) READ_FROM_STREAM_CASE(int64_t),
READ_FROM_STREAM_CASE(10, float) READ_FROM_STREAM_CASE(uint64_t),
READ_FROM_STREAM_CASE(11, double) READ_FROM_STREAM_CASE(float),
READ_FROM_STREAM_CASE(12, std::string) READ_FROM_STREAM_CASE(double),
READ_FROM_STREAM_CASE(13, std::vector<char>) READ_FROM_STREAM_CASE(std::string),
} READ_FROM_STREAM_CASE(std::vector<char>));
} catch (const std::ios_base::failure&) { } catch (const std::ios_base::failure&) {
break; break;
} }