diff --git a/src/test/fuzz/addrman.cpp b/src/test/fuzz/addrman.cpp index 6b4519c17a0..750480285de 100644 --- a/src/test/fuzz/addrman.cpp +++ b/src/test/fuzz/addrman.cpp @@ -145,7 +145,7 @@ FUZZ_TARGET(addrman, .init = initialize_addrman) addresses.push_back(ConsumeAddress(fuzzed_data_provider)); } auto net_addr = ConsumeNetAddr(fuzzed_data_provider); - auto time_penalty = ConsumeDuration(fuzzed_data_provider, /*min=*/0s, /*max=*/100000000s); + auto time_penalty = ConsumeDuration(fuzzed_data_provider, /*min=*/0s, /*max=*/100000000s); addr_man.Add(addresses, net_addr, time_penalty); }, [&] { diff --git a/src/test/fuzz/node_eviction.cpp b/src/test/fuzz/node_eviction.cpp index 04eab335365..2ecc91a05e3 100644 --- a/src/test/fuzz/node_eviction.cpp +++ b/src/test/fuzz/node_eviction.cpp @@ -19,13 +19,14 @@ FUZZ_TARGET(node_eviction) { FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()}; std::vector eviction_candidates; - LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) { + LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) + { eviction_candidates.push_back({ /*id=*/fuzzed_data_provider.ConsumeIntegral(), - /*m_connected=*/std::chrono::seconds{fuzzed_data_provider.ConsumeIntegral()}, - /*m_min_ping_time=*/std::chrono::microseconds{fuzzed_data_provider.ConsumeIntegral()}, - /*m_last_block_time=*/std::chrono::seconds{fuzzed_data_provider.ConsumeIntegral()}, - /*m_last_tx_time=*/std::chrono::seconds{fuzzed_data_provider.ConsumeIntegral()}, + /*m_connected=*/ConsumeTime(fuzzed_data_provider).time_since_epoch(), + /*m_min_ping_time=*/ConsumeDuration(fuzzed_data_provider, /*min=*/std::chrono::years{-1}, /*max=*/decltype(CNode::m_min_ping_time.load())::max()), + /*m_last_block_time=*/ConsumeTime(fuzzed_data_provider).time_since_epoch(), + /*m_last_tx_time=*/ConsumeTime(fuzzed_data_provider).time_since_epoch(), /*fRelevantServices=*/fuzzed_data_provider.ConsumeBool(), /*m_relay_txs=*/fuzzed_data_provider.ConsumeBool(), /*fBloomFilter=*/fuzzed_data_provider.ConsumeBool(), diff --git a/src/test/fuzz/util.cpp b/src/test/fuzz/util.cpp index f505357d802..da0e2dea460 100644 --- a/src/test/fuzz/util.cpp +++ b/src/test/fuzz/util.cpp @@ -36,12 +36,7 @@ NodeSeconds ConsumeTime(FuzzedDataProvider& fuzzed_data_provider, const std::opt // 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 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()); + return NodeSeconds{ConsumeDuration(fuzzed_data_provider, min.value_or(time_min) * 1s, max.value_or(time_max) * 1s)}; } 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 aa1eed8badf..fd53e39fcc5 100644 --- a/src/test/fuzz/util.h +++ b/src/test/fuzz/util.h @@ -140,7 +140,16 @@ template [[nodiscard]] CAmount ConsumeMoney(FuzzedDataProvider& fuzzed_data_provider, 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; + +template +// Having the compiler infer the template argument from the function argument +// is dangerous, because the desired return value generally has a different +// type than the function argument. So std::common_type is used to force the +// call site to specify the type of the return value. +[[nodiscard]] Dur ConsumeDuration(FuzzedDataProvider& fuzzed_data_provider, std::common_type_t min, std::common_type_t max) noexcept +{ + return Dur{fuzzed_data_provider.ConsumeIntegralInRange(min.count(), max.count())}; +} [[nodiscard]] CMutableTransaction ConsumeTransaction(FuzzedDataProvider& fuzzed_data_provider, const std::optional>& prevout_txids, int max_num_in = 10, int max_num_out = 10) noexcept;