// Copyright (c) 2020 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include #include #include #include #include #include #include #include #include #include #include void test_one_input(const std::vector& buffer) { FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); CBloomFilter bloom_filter{ fuzzed_data_provider.ConsumeIntegralInRange(1, 10000000), 1.0 / fuzzed_data_provider.ConsumeIntegralInRange(1, std::numeric_limits::max()), fuzzed_data_provider.ConsumeIntegral(), static_cast(fuzzed_data_provider.PickValueInArray({BLOOM_UPDATE_NONE, BLOOM_UPDATE_ALL, BLOOM_UPDATE_P2PUBKEY_ONLY, BLOOM_UPDATE_MASK}))}; while (fuzzed_data_provider.remaining_bytes() > 0) { switch (fuzzed_data_provider.ConsumeIntegralInRange(0, 3)) { case 0: { const std::vector b = ConsumeRandomLengthByteVector(fuzzed_data_provider); (void)bloom_filter.contains(b); bloom_filter.insert(b); const bool present = bloom_filter.contains(b); assert(present); break; } case 1: { const std::optional out_point = ConsumeDeserializable(fuzzed_data_provider); if (!out_point) { break; } (void)bloom_filter.contains(*out_point); bloom_filter.insert(*out_point); const bool present = bloom_filter.contains(*out_point); assert(present); break; } case 2: { const std::optional u256 = ConsumeDeserializable(fuzzed_data_provider); if (!u256) { break; } (void)bloom_filter.contains(*u256); bloom_filter.insert(*u256); const bool present = bloom_filter.contains(*u256); assert(present); break; } case 3: { const std::optional mut_tx = ConsumeDeserializable(fuzzed_data_provider); if (!mut_tx) { break; } const CTransaction tx{*mut_tx}; (void)bloom_filter.IsRelevantAndUpdate(tx); break; } } (void)bloom_filter.IsWithinSizeConstraints(); } }