/Users/mcomp/contrib/bitcoin/src/test/fuzz/poolresource.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright (c) 2022-present The Bitcoin Core developers |
2 | | // Distributed under the MIT software license, see the accompanying |
3 | | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
4 | | |
5 | | #include <random.h> |
6 | | #include <span.h> |
7 | | #include <support/allocators/pool.h> |
8 | | #include <test/fuzz/FuzzedDataProvider.h> |
9 | | #include <test/fuzz/fuzz.h> |
10 | | #include <test/fuzz/util.h> |
11 | | #include <test/util/poolresourcetester.h> |
12 | | |
13 | | #include <cstdint> |
14 | | #include <tuple> |
15 | | #include <vector> |
16 | | |
17 | | namespace { |
18 | | |
19 | | template <std::size_t MAX_BLOCK_SIZE_BYTES, std::size_t ALIGN_BYTES> |
20 | | class PoolResourceFuzzer |
21 | | { |
22 | | FuzzedDataProvider& m_provider; |
23 | | PoolResource<MAX_BLOCK_SIZE_BYTES, ALIGN_BYTES> m_test_resource; |
24 | | uint64_t m_sequence{0}; |
25 | | size_t m_total_allocated{}; |
26 | | |
27 | | struct Entry { |
28 | | std::span<std::byte> span; |
29 | | size_t alignment; |
30 | | uint64_t seed; |
31 | | |
32 | 0 | Entry(std::span<std::byte> s, size_t a, uint64_t se) : span(s), alignment(a), seed(se) {} Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm1EE5EntryC2ENSt3__14spanISt4byteLm18446744073709551615EEEmy Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm2EE5EntryC2ENSt3__14spanISt4byteLm18446744073709551615EEEmy Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm4EE5EntryC2ENSt3__14spanISt4byteLm18446744073709551615EEEmy Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm8EE5EntryC2ENSt3__14spanISt4byteLm18446744073709551615EEEmy Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm8ELm8EE5EntryC2ENSt3__14spanISt4byteLm18446744073709551615EEEmy Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm16ELm16EE5EntryC2ENSt3__14spanISt4byteLm18446744073709551615EEEmy Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm8EE5EntryC2ENSt3__14spanISt4byteLm18446744073709551615EEEmy Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm64EE5EntryC2ENSt3__14spanISt4byteLm18446744073709551615EEEmy |
33 | | }; |
34 | | |
35 | | std::vector<Entry> m_entries; |
36 | | |
37 | | public: |
38 | | PoolResourceFuzzer(FuzzedDataProvider& provider) |
39 | 0 | : m_provider{provider}, |
40 | 0 | m_test_resource{provider.ConsumeIntegralInRange<size_t>(MAX_BLOCK_SIZE_BYTES, 262144)} |
41 | 0 | { |
42 | 0 | } Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm1EEC2ER18FuzzedDataProvider Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm2EEC2ER18FuzzedDataProvider Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm4EEC2ER18FuzzedDataProvider Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm8EEC2ER18FuzzedDataProvider Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm8ELm8EEC2ER18FuzzedDataProvider Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm16ELm16EEC2ER18FuzzedDataProvider Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm8EEC2ER18FuzzedDataProvider Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm64EEC2ER18FuzzedDataProvider |
43 | | |
44 | | void Allocate(size_t size, size_t alignment) |
45 | 0 | { |
46 | 0 | assert(size > 0); // Must allocate at least 1 byte. |
47 | 0 | assert(alignment > 0); // Alignment must be at least 1. |
48 | 0 | assert((alignment & (alignment - 1)) == 0); // Alignment must be power of 2. |
49 | 0 | assert((size & (alignment - 1)) == 0); // Size must be a multiple of alignment. |
50 | | |
51 | 0 | auto span = std::span(static_cast<std::byte*>(m_test_resource.Allocate(size, alignment)), size); |
52 | 0 | m_total_allocated += size; |
53 | |
|
54 | 0 | auto ptr_val = reinterpret_cast<std::uintptr_t>(span.data()); |
55 | 0 | assert((ptr_val & (alignment - 1)) == 0); |
56 | | |
57 | 0 | uint64_t seed = m_sequence++; |
58 | 0 | RandomContentFill(m_entries.emplace_back(span, alignment, seed)); |
59 | 0 | } Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm1EE8AllocateEmm Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm2EE8AllocateEmm Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm4EE8AllocateEmm Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm8EE8AllocateEmm Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm8ELm8EE8AllocateEmm Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm16ELm16EE8AllocateEmm Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm8EE8AllocateEmm Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm64EE8AllocateEmm |
60 | | |
61 | | void |
62 | | Allocate() |
63 | 0 | { |
64 | 0 | if (m_total_allocated > 0x1000000) return; |
65 | 0 | size_t alignment_bits = m_provider.ConsumeIntegralInRange<size_t>(0, 7); |
66 | 0 | size_t alignment = size_t{1} << alignment_bits; |
67 | 0 | size_t size_bits = m_provider.ConsumeIntegralInRange<size_t>(0, 16 - alignment_bits); |
68 | 0 | size_t size = m_provider.ConsumeIntegralInRange<size_t>(size_t{1} << size_bits, (size_t{1} << (size_bits + 1)) - 1U) << alignment_bits; |
69 | 0 | Allocate(size, alignment); |
70 | 0 | } Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm1EE8AllocateEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm2EE8AllocateEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm4EE8AllocateEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm8EE8AllocateEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm8ELm8EE8AllocateEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm16ELm16EE8AllocateEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm8EE8AllocateEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm64EE8AllocateEv |
71 | | |
72 | | void RandomContentFill(Entry& entry) |
73 | 0 | { |
74 | 0 | InsecureRandomContext(entry.seed).fillrand(entry.span); |
75 | 0 | } Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm1EE17RandomContentFillERNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm2EE17RandomContentFillERNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm4EE17RandomContentFillERNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm8EE17RandomContentFillERNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm8ELm8EE17RandomContentFillERNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm16ELm16EE17RandomContentFillERNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm8EE17RandomContentFillERNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm64EE17RandomContentFillERNS1_5EntryE |
76 | | |
77 | | void RandomContentCheck(const Entry& entry) |
78 | 0 | { |
79 | 0 | std::vector<std::byte> expect(entry.span.size()); |
80 | 0 | InsecureRandomContext(entry.seed).fillrand(expect); |
81 | 0 | assert(std::ranges::equal(entry.span, expect)); |
82 | 0 | } Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm1EE18RandomContentCheckERKNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm2EE18RandomContentCheckERKNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm4EE18RandomContentCheckERKNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm8EE18RandomContentCheckERKNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm8ELm8EE18RandomContentCheckERKNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm16ELm16EE18RandomContentCheckERKNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm8EE18RandomContentCheckERKNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm64EE18RandomContentCheckERKNS1_5EntryE |
83 | | |
84 | | void Deallocate(const Entry& entry) |
85 | 0 | { |
86 | 0 | auto ptr_val = reinterpret_cast<std::uintptr_t>(entry.span.data()); |
87 | 0 | assert((ptr_val & (entry.alignment - 1)) == 0); |
88 | 0 | RandomContentCheck(entry); |
89 | 0 | m_total_allocated -= entry.span.size(); |
90 | 0 | m_test_resource.Deallocate(entry.span.data(), entry.span.size(), entry.alignment); |
91 | 0 | } Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm1EE10DeallocateERKNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm2EE10DeallocateERKNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm4EE10DeallocateERKNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm8EE10DeallocateERKNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm8ELm8EE10DeallocateERKNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm16ELm16EE10DeallocateERKNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm8EE10DeallocateERKNS1_5EntryE Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm64EE10DeallocateERKNS1_5EntryE |
92 | | |
93 | | void Deallocate() |
94 | 0 | { |
95 | 0 | if (m_entries.empty()) { |
96 | 0 | return; |
97 | 0 | } |
98 | | |
99 | 0 | size_t idx = m_provider.ConsumeIntegralInRange<size_t>(0, m_entries.size() - 1); |
100 | 0 | Deallocate(m_entries[idx]); |
101 | 0 | if (idx != m_entries.size() - 1) { |
102 | 0 | m_entries[idx] = std::move(m_entries.back()); |
103 | 0 | } |
104 | 0 | m_entries.pop_back(); |
105 | 0 | } Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm1EE10DeallocateEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm2EE10DeallocateEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm4EE10DeallocateEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm8EE10DeallocateEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm8ELm8EE10DeallocateEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm16ELm16EE10DeallocateEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm8EE10DeallocateEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm64EE10DeallocateEv |
106 | | |
107 | | void Clear() |
108 | 0 | { |
109 | 0 | while (!m_entries.empty()) { |
110 | 0 | Deallocate(); |
111 | 0 | } |
112 | |
|
113 | 0 | PoolResourceTester::CheckAllDataAccountedFor(m_test_resource); |
114 | 0 | } Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm1EE5ClearEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm2EE5ClearEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm4EE5ClearEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm8EE5ClearEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm8ELm8EE5ClearEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm16ELm16EE5ClearEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm8EE5ClearEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm64EE5ClearEv |
115 | | |
116 | | void Fuzz() |
117 | 0 | { |
118 | 0 | LIMITED_WHILE(m_provider.ConsumeBool(), 10000) |
119 | 0 | { |
120 | 0 | CallOneOf( |
121 | 0 | m_provider, |
122 | 0 | [&] { Allocate(); }, Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm1EE4FuzzEvENKUlvE_clEv Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm2EE4FuzzEvENKUlvE_clEv Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm4EE4FuzzEvENKUlvE_clEv Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm8EE4FuzzEvENKUlvE_clEv Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm8ELm8EE4FuzzEvENKUlvE_clEv Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm16ELm16EE4FuzzEvENKUlvE_clEv Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm8EE4FuzzEvENKUlvE_clEv Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm64EE4FuzzEvENKUlvE_clEv |
123 | 0 | [&] { Deallocate(); }); Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm1EE4FuzzEvENKUlvE0_clEv Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm2EE4FuzzEvENKUlvE0_clEv Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm4EE4FuzzEvENKUlvE0_clEv Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm8EE4FuzzEvENKUlvE0_clEv Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm8ELm8EE4FuzzEvENKUlvE0_clEv Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm16ELm16EE4FuzzEvENKUlvE0_clEv Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm8EE4FuzzEvENKUlvE0_clEv Unexecuted instantiation: poolresource.cpp:_ZZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm64EE4FuzzEvENKUlvE0_clEv |
124 | 0 | } |
125 | 0 | Clear(); |
126 | 0 | } Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm1EE4FuzzEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm2EE4FuzzEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm4EE4FuzzEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm128ELm8EE4FuzzEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm8ELm8EE4FuzzEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm16ELm16EE4FuzzEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm8EE4FuzzEv Unexecuted instantiation: poolresource.cpp:_ZN12_GLOBAL__N_118PoolResourceFuzzerILm256ELm64EE4FuzzEv |
127 | | }; |
128 | | |
129 | | |
130 | | } // namespace |
131 | | |
132 | | FUZZ_TARGET(pool_resource) |
133 | 0 | { |
134 | 0 | FuzzedDataProvider provider(buffer.data(), buffer.size()); |
135 | 0 | CallOneOf( |
136 | 0 | provider, |
137 | 0 | [&] { PoolResourceFuzzer<128, 1>{provider}.Fuzz(); }, |
138 | 0 | [&] { PoolResourceFuzzer<128, 2>{provider}.Fuzz(); }, |
139 | 0 | [&] { PoolResourceFuzzer<128, 4>{provider}.Fuzz(); }, |
140 | 0 | [&] { PoolResourceFuzzer<128, 8>{provider}.Fuzz(); }, |
141 | |
|
142 | 0 | [&] { PoolResourceFuzzer<8, 8>{provider}.Fuzz(); }, |
143 | 0 | [&] { PoolResourceFuzzer<16, 16>{provider}.Fuzz(); }, |
144 | |
|
145 | 0 | [&] { PoolResourceFuzzer<256, alignof(max_align_t)>{provider}.Fuzz(); }, |
146 | 0 | [&] { PoolResourceFuzzer<256, 64>{provider}.Fuzz(); }); |
147 | 0 | } |