fuzz: share a single mocked steady clock across FuzzedSock instances

Each FuzzedSock used to own its mocked steady clock and call
MockableSteadyClock::SetMockTime() directly. Hold the clock by reference
to an externally provided FakeSteadyClock instead, so that several
FuzzedSock instances sharing a test case (e.g. one per peer, or one
created via Accept()) advance a single mocked clock, and the mocking goes
through the FakeSteadyClock RAII helper that resets mocktime on
destruction.

FakeSteadyClock is a LimitOne type, so each fuzz target constructs one
instance per iteration and passes it to ConsumeSock / ConsumeNode / the
FuzzedSock constructor.
This commit is contained in:
Hao Xu
2026-06-15 19:35:25 +08:00
parent 6b58eb6d51
commit 6fa4132298
11 changed files with 45 additions and 40 deletions

View File

@@ -33,7 +33,8 @@ FUZZ_TARGET(net, .init = initialize_net)
{
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
FakeNodeClock clock{ConsumeTime(fuzzed_data_provider)};
CNode node{ConsumeNode(fuzzed_data_provider)};
FakeSteadyClock steady_clock;
CNode node{ConsumeNode(fuzzed_data_provider, steady_clock)};
node.SetCommonVersion(fuzzed_data_provider.ConsumeIntegral<int>());
if (const auto service_opt =
ConsumeDeserializable<CService>(fuzzed_data_provider, ConsumeDeserializationParams<CNetAddr::SerParams>(fuzzed_data_provider)))
@@ -82,8 +83,9 @@ FUZZ_TARGET(local_address, .init = initialize_net)
{
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
FakeNodeClock clock{ConsumeTime(fuzzed_data_provider)};
FakeSteadyClock steady_clock;
CService service{ConsumeService(fuzzed_data_provider)};
CNode node{ConsumeNode(fuzzed_data_provider)};
CNode node{ConsumeNode(fuzzed_data_provider, steady_clock)};
{
LOCK(g_maplocalhost_mutex);
mapLocalHost.clear();