From faa5a9ebad15fe41e8ddf45f11ad72bdc5aabf99 Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Thu, 31 Jul 2025 11:44:04 +0200 Subject: [PATCH 1/2] fuzz: Use min option in ConsumeTime This is less code and also required for the next commit. --- src/test/fuzz/headerssync.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/test/fuzz/headerssync.cpp b/src/test/fuzz/headerssync.cpp index b33f4dc728f..f6e574f4044 100644 --- a/src/test/fuzz/headerssync.cpp +++ b/src/test/fuzz/headerssync.cpp @@ -55,13 +55,11 @@ FUZZ_TARGET(headers_sync_state, .init = initialize_headers_sync_state_fuzz) { SeedRandomStateForTest(SeedRand::ZEROS); FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); - auto mock_time{ConsumeTime(fuzzed_data_provider)}; CBlockHeader genesis_header{Params().GenesisBlock()}; CBlockIndex start_index(genesis_header); - if (mock_time < start_index.GetMedianTimePast()) return; - SetMockTime(mock_time); + SetMockTime(ConsumeTime(fuzzed_data_provider, /*min=*/start_index.GetMedianTimePast())); const uint256 genesis_hash = genesis_header.GetHash(); start_index.phashBlock = &genesis_hash; From eeee3755f8c415b227820479b5492261f3a8aa08 Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Tue, 6 May 2025 20:23:54 +0200 Subject: [PATCH 2/2] fuzz: Return chrono point from ConsumeTime(), Add ConsumeDuration() A chrono time point is a bit more type-safe than a raw i64. Also, add a dedicated helper for plain chrono durations. --- src/test/fuzz/addrman.cpp | 8 ++++---- src/test/fuzz/p2p_headers_presync.cpp | 2 +- src/test/fuzz/util.cpp | 9 +++++++-- src/test/fuzz/util.h | 3 ++- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/test/fuzz/addrman.cpp b/src/test/fuzz/addrman.cpp index a13945a5206..88260b272f2 100644 --- a/src/test/fuzz/addrman.cpp +++ b/src/test/fuzz/addrman.cpp @@ -144,23 +144,23 @@ FUZZ_TARGET(addrman, .init = initialize_addrman) addresses.push_back(ConsumeAddress(fuzzed_data_provider)); } auto net_addr = ConsumeNetAddr(fuzzed_data_provider); - auto time_penalty = std::chrono::seconds{ConsumeTime(fuzzed_data_provider, 0, 100000000)}; + auto time_penalty = ConsumeDuration(fuzzed_data_provider, /*min=*/0s, /*max=*/100000000s); addr_man.Add(addresses, net_addr, time_penalty); }, [&] { auto addr = ConsumeService(fuzzed_data_provider); - auto time = NodeSeconds{std::chrono::seconds{ConsumeTime(fuzzed_data_provider)}}; + auto time = ConsumeTime(fuzzed_data_provider); addr_man.Good(addr, time); }, [&] { auto addr = ConsumeService(fuzzed_data_provider); auto count_failure = fuzzed_data_provider.ConsumeBool(); - auto time = NodeSeconds{std::chrono::seconds{ConsumeTime(fuzzed_data_provider)}}; + auto time = ConsumeTime(fuzzed_data_provider); addr_man.Attempt(addr, count_failure, time); }, [&] { auto addr = ConsumeService(fuzzed_data_provider); - auto time = NodeSeconds{std::chrono::seconds{ConsumeTime(fuzzed_data_provider)}}; + auto time = ConsumeTime(fuzzed_data_provider); addr_man.Connected(addr, time); }, [&] { diff --git a/src/test/fuzz/p2p_headers_presync.cpp b/src/test/fuzz/p2p_headers_presync.cpp index c6842a35849..d587137413c 100644 --- a/src/test/fuzz/p2p_headers_presync.cpp +++ b/src/test/fuzz/p2p_headers_presync.cpp @@ -121,7 +121,7 @@ CBlockHeader ConsumeHeader(FuzzedDataProvider& fuzzed_data_provider, const uint2 arith_uint256 target = ConsumeArithUInt256InRange(fuzzed_data_provider, lower_target, upper_target); header.nBits = target.GetCompact(); } - header.nTime = ConsumeTime(fuzzed_data_provider); + header.nTime = TicksSinceEpoch(ConsumeTime(fuzzed_data_provider)); header.hashPrevBlock = prev_hash; header.nVersion = fuzzed_data_provider.ConsumeIntegral(); return header; diff --git a/src/test/fuzz/util.cpp b/src/test/fuzz/util.cpp index a4a319e74b9..f505357d802 100644 --- a/src/test/fuzz/util.cpp +++ b/src/test/fuzz/util.cpp @@ -31,12 +31,17 @@ CAmount ConsumeMoney(FuzzedDataProvider& fuzzed_data_provider, const std::option return fuzzed_data_provider.ConsumeIntegralInRange(0, max.value_or(MAX_MONEY)); } -int64_t ConsumeTime(FuzzedDataProvider& fuzzed_data_provider, const std::optional& min, const std::optional& max) noexcept +NodeSeconds ConsumeTime(FuzzedDataProvider& fuzzed_data_provider, const std::optional& min, const std::optional& max) noexcept { // Avoid t=0 (1970-01-01T00:00:00Z) since SetMockTime(0) disables mocktime. static const int64_t time_min{ParseISO8601DateTime("2000-01-01T00:00:01Z").value()}; static const int64_t time_max{ParseISO8601DateTime("2100-12-31T23:59:59Z").value()}; - return fuzzed_data_provider.ConsumeIntegralInRange(min.value_or(time_min), max.value_or(time_max)); + return NodeSeconds{ConsumeDuration(fuzzed_data_provider, min.value_or(time_min) * 1s, max.value_or(time_max) * 1s)}; +} + +std::chrono::seconds ConsumeDuration(FuzzedDataProvider& fuzzed_data_provider, std::chrono::seconds min, std::chrono::seconds max) noexcept +{ + return 1s * fuzzed_data_provider.ConsumeIntegralInRange(min.count(), max.count()); } CMutableTransaction ConsumeTransaction(FuzzedDataProvider& fuzzed_data_provider, const std::optional>& prevout_txids, const int max_num_in, const int max_num_out) noexcept diff --git a/src/test/fuzz/util.h b/src/test/fuzz/util.h index 0575b157ea8..f82248b80c9 100644 --- a/src/test/fuzz/util.h +++ b/src/test/fuzz/util.h @@ -144,7 +144,8 @@ template [[nodiscard]] CAmount ConsumeMoney(FuzzedDataProvider& fuzzed_data_provider, const std::optional& max = std::nullopt) noexcept; -[[nodiscard]] int64_t ConsumeTime(FuzzedDataProvider& fuzzed_data_provider, const std::optional& min = std::nullopt, const std::optional& max = std::nullopt) noexcept; +[[nodiscard]] NodeSeconds ConsumeTime(FuzzedDataProvider& fuzzed_data_provider, const std::optional& min = std::nullopt, const std::optional& max = std::nullopt) noexcept; +[[nodiscard]] std::chrono::seconds ConsumeDuration(FuzzedDataProvider& fuzzed_data_provider, std::chrono::seconds min, std::chrono::seconds max) noexcept; [[nodiscard]] CMutableTransaction ConsumeTransaction(FuzzedDataProvider& fuzzed_data_provider, const std::optional>& prevout_txids, const int max_num_in = 10, const int max_num_out = 10) noexcept;