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