fuzz: Return chrono point from ConsumeTime(), Add ConsumeDuration()
What changed, and why it matters
This commit is a small internal cleanup of Bitcoin Core's fuzz-testing helpers. It changes a test-only function so it returns a strongly-typed time value instead of a plain integer, and adds a separate helper for time durations. It does not change any production code, network behavior, or wallet logic, and it is not a security fix.
No security action needed. Treat as normal code-quality/test refactoring.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch modifies src/test/fuzz/util.h, src/test/fuzz/util.cpp, and two fuzz targets. ConsumeTime() now returns NodeSeconds (a std::chrono::time_point alias) instead of int64_t, and a new ConsumeDuration() helper returns std::chrono::seconds. Call sites are updated to use the new types, sometimes converting back to integer epoch ticks where needed (e.g., header.nTime). The change is purely type-safe refactoring inside the fuzz test harness.
Changed components
src/test/fuzz/util.hsrc/test/fuzz/util.cppsrc/test/fuzz/addrman.cppsrc/test/fuzz/p2p_headers_presync.cppInspect captured patch +14 / −8
diff --git a/src/test/fuzz/addrman.cpp b/src/test/fuzz/addrman.cpp
index a13945a5..88260b27 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 c6842a35..d5871374 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<std::chrono::seconds>(ConsumeTime(fuzzed_data_provider));
header.hashPrevBlock = prev_hash;
header.nVersion = fuzzed_data_provider.ConsumeIntegral<int32_t>();
return header;
diff --git a/src/test/fuzz/util.cpp b/src/test/fuzz/util.cpp
index a4a319e7..f505357d 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<CAmount>(0, max.value_or(MAX_MONEY));
}
-int64_t ConsumeTime(FuzzedDataProvider& fuzzed_data_provider, const std::optional<int64_t>& min, const std::optional<int64_t>& max) noexcept
+NodeSeconds ConsumeTime(FuzzedDataProvider& fuzzed_data_provider, const std::optional<int64_t>& min, const std::optional<int64_t>& 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<int64_t>(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<int64_t>(min.count(), max.count());
}
CMutableTransaction ConsumeTransaction(FuzzedDataProvider& fuzzed_data_provider, const std::optional<std::vector<Txid>>& 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 0575b157..f82248b8 100644
--- a/src/test/fuzz/util.h
+++ b/src/test/fuzz/util.h
@@ -144,7 +144,8 @@ template <typename WeakEnumType, size_t size>
[[nodiscard]] CAmount ConsumeMoney(FuzzedDataProvider& fuzzed_data_provider, const std::optional<CAmount>& max = std::nullopt) noexcept;
-[[nodiscard]] int64_t ConsumeTime(FuzzedDataProvider& fuzzed_data_provider, const std::optional<int64_t>& min = std::nullopt, const std::optional<int64_t>& max = std::nullopt) noexcept;
+[[nodiscard]] NodeSeconds ConsumeTime(FuzzedDataProvider& fuzzed_data_provider, const std::optional<int64_t>& min = std::nullopt, const std::optional<int64_t>& 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<std::vector<Txid>>& prevout_txids, const int max_num_in = 10, const int max_num_out = 10) noexcept;
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.