Merge #20828: fuzz: Introduce CallOneOf helper to replace switch-case

fa75d40ef8 fuzz: Introduce CallOneOf helper to replace switch-case (MarcoFalke)

Pull request description:

  The current `switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, nn)) { case 0: ... case 1: ... case nn: ...` has several problems:

  * It makes it hard to review newly added targets, because it requires manual counting of cases
  * It makes it hard to update a target, because updating all case labels is trivial, but tedious to review and causes merge conflicts
  * ~~Updating the target raises the question whether the case labels should be preserved to not invalidate the existing fuzz inputs format. Fuzz input format might already change implicitly on every commit, so this isn't something worthwhile to pursue.~~ Edit: This pull doesn't fix this problem.

  Fix all issues by adding a new `CallOneOf` helper

ACKs for top commit:
  ajtowns:
    ACK fa75d40ef8 - code review only
  jnewbery:
    utACK fa75d40ef8

Tree-SHA512: 2daa602b240b86c8e85a024e008f03a57ba60349377eed771f4d21a97a9dba9b66e93fff16ff1992018d4330be7a1a276944c3dfdf698748ce135626c380e563
This commit is contained in:
MarcoFalke committed 2021-01-14 11:07:22 +01:00
commit 29d2aeb4a2
19 files changed
+489 -609

No files matched your search

+26 -38
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);
+14 -20
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();
+24 -32
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);
+13 -17
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();
} }
} }
+13 -18
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();
+48 -65
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; });
}
}
} }
} }
+58 -62
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();
+32 -46
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];
+12 -17
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; });
}
}
} }
} }
+16 -23
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; });
}
}
} }
} }
+6 -8
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;
+31 -42
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();
+11 -15
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(ALL_FEE_ESTIMATE_HORIZONS), 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(ALL_FEE_ESTIMATE_HORIZONS), fuzzed_data_provider.ConsumeBool() ? &result : nullptr);
+9 -11
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; });
}
} }
} }
+18 -21
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; });
}
}
} }
} }
+31 -37
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();
} }
+33 -32
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&) {
} }
} }
+19 -27
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);
+75 -78
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;
} }