Skip to content

Commit bf76000

Browse files
tests: Add fuzzing harness for classes/functions in cuckoocache.h
1 parent 57890b2 commit bf76000

File tree

3 files changed

+57
-0
lines changed

3 files changed

+57
-0
lines changed

src/Makefile.test.include

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ FUZZ_TARGETS = \
3030
test/fuzz/chain \
3131
test/fuzz/checkqueue \
3232
test/fuzz/coins_deserialize \
33+
test/fuzz/cuckoocache \
3334
test/fuzz/decode_tx \
3435
test/fuzz/descriptor_parse \
3536
test/fuzz/diskblockindex_deserialize \
@@ -444,6 +445,12 @@ test_fuzz_coins_deserialize_LDADD = $(FUZZ_SUITE_LD_COMMON)
444445
test_fuzz_coins_deserialize_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
445446
test_fuzz_coins_deserialize_SOURCES = test/fuzz/deserialize.cpp
446447

448+
test_fuzz_cuckoocache_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
449+
test_fuzz_cuckoocache_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
450+
test_fuzz_cuckoocache_LDADD = $(FUZZ_SUITE_LD_COMMON)
451+
test_fuzz_cuckoocache_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
452+
test_fuzz_cuckoocache_SOURCES = test/fuzz/cuckoocache.cpp
453+
447454
test_fuzz_decode_tx_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
448455
test_fuzz_decode_tx_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
449456
test_fuzz_decode_tx_LDADD = $(FUZZ_SUITE_LD_COMMON)

src/cuckoocache.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#ifndef BITCOIN_CUCKOOCACHE_H
66
#define BITCOIN_CUCKOOCACHE_H
77

8+
#include <algorithm> // std::find
89
#include <array>
910
#include <atomic>
1011
#include <cmath>

src/test/fuzz/cuckoocache.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright (c) 2020 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 <cuckoocache.h>
6+
#include <optional.h>
7+
#include <script/sigcache.h>
8+
#include <test/fuzz/FuzzedDataProvider.h>
9+
#include <test/fuzz/fuzz.h>
10+
#include <test/fuzz/util.h>
11+
#include <test/util/setup_common.h>
12+
13+
#include <cstdint>
14+
#include <string>
15+
#include <vector>
16+
17+
namespace {
18+
FuzzedDataProvider* fuzzed_data_provider_ptr = nullptr;
19+
20+
struct RandomHasher {
21+
template <uint8_t>
22+
uint32_t operator()(const bool& /* unused */) const
23+
{
24+
assert(fuzzed_data_provider_ptr != nullptr);
25+
return fuzzed_data_provider_ptr->ConsumeIntegral<uint32_t>();
26+
}
27+
};
28+
} // namespace
29+
30+
void test_one_input(const std::vector<uint8_t>& buffer)
31+
{
32+
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
33+
fuzzed_data_provider_ptr = &fuzzed_data_provider;
34+
CuckooCache::cache<bool, RandomHasher> cuckoo_cache{};
35+
if (fuzzed_data_provider.ConsumeBool()) {
36+
const size_t megabytes = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 16);
37+
cuckoo_cache.setup_bytes(megabytes << 20);
38+
} else {
39+
cuckoo_cache.setup(fuzzed_data_provider.ConsumeIntegralInRange<uint32_t>(0, 4096));
40+
}
41+
while (fuzzed_data_provider.ConsumeBool()) {
42+
if (fuzzed_data_provider.ConsumeBool()) {
43+
cuckoo_cache.insert(fuzzed_data_provider.ConsumeBool());
44+
} else {
45+
cuckoo_cache.contains(fuzzed_data_provider.ConsumeBool(), fuzzed_data_provider.ConsumeBool());
46+
}
47+
}
48+
fuzzed_data_provider_ptr = nullptr;
49+
}

0 commit comments

Comments
 (0)