// Copyright (c) 2020-2021 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 FUZZ_TARGET(float) { FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); { const double d{[&] { double tmp; CallOneOf( fuzzed_data_provider, // an actual number [&] { tmp = fuzzed_data_provider.ConsumeFloatingPoint(); }, // special numbers and NANs [&] { tmp = fuzzed_data_provider.PickValueInArray({ std::numeric_limits::infinity(), -std::numeric_limits::infinity(), std::numeric_limits::min(), -std::numeric_limits::min(), std::numeric_limits::max(), -std::numeric_limits::max(), std::numeric_limits::lowest(), -std::numeric_limits::lowest(), std::numeric_limits::quiet_NaN(), -std::numeric_limits::quiet_NaN(), std::numeric_limits::signaling_NaN(), -std::numeric_limits::signaling_NaN(), std::numeric_limits::denorm_min(), -std::numeric_limits::denorm_min(), }); }, // Anything from raw memory (also checks that DecodeDouble doesn't crash on any input) [&] { tmp = DecodeDouble(fuzzed_data_provider.ConsumeIntegral()); }); return tmp; }()}; (void)memusage::DynamicUsage(d); uint64_t encoded = EncodeDouble(d); if constexpr (std::numeric_limits::is_iec559) { if (!std::isnan(d)) { uint64_t encoded_in_memory; std::copy((const unsigned char*)&d, (const unsigned char*)(&d + 1), (unsigned char*)&encoded_in_memory); assert(encoded_in_memory == encoded); } } double d_deserialized = DecodeDouble(encoded); assert(std::isnan(d) == std::isnan(d_deserialized)); assert(std::isnan(d) || d == d_deserialized); } }