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 #include <util/byte_units.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 FUZZ_TARGET(cuckoocache) 31 { 32 FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); 33 fuzzed_data_provider_ptr = &fuzzed_data_provider; 34 CuckooCache::cache<int, 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 * 1_MiB); 38 } else { 39 cuckoo_cache.setup(fuzzed_data_provider.ConsumeIntegralInRange<uint32_t>(0, 4096)); 40 } 41 LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) { 42 if (fuzzed_data_provider.ConsumeBool()) { 43 cuckoo_cache.insert(fuzzed_data_provider.ConsumeBool()); 44 } else { 45 auto e = fuzzed_data_provider.ConsumeBool(); 46 auto erase = fuzzed_data_provider.ConsumeBool(); 47 cuckoo_cache.contains(e, erase); 48 } 49 } 50 fuzzed_data_provider_ptr = nullptr; 51 }