Changeset View
Changeset View
Standalone View
Standalone View
src/test/fuzz/util.h
Show All 16 Lines | |||||
#include <test/fuzz/fuzz.h> | #include <test/fuzz/fuzz.h> | ||||
#include <cstdint> | #include <cstdint> | ||||
#include <string> | #include <string> | ||||
#include <vector> | #include <vector> | ||||
NODISCARD inline std::vector<uint8_t> | NODISCARD inline std::vector<uint8_t> | ||||
ConsumeRandomLengthByteVector(FuzzedDataProvider &fuzzed_data_provider, | ConsumeRandomLengthByteVector(FuzzedDataProvider &fuzzed_data_provider, | ||||
size_t max_length = 4096) noexcept { | const size_t max_length = 4096) noexcept { | ||||
const std::string s = | const std::string s = | ||||
fuzzed_data_provider.ConsumeRandomLengthString(max_length); | fuzzed_data_provider.ConsumeRandomLengthString(max_length); | ||||
return {s.begin(), s.end()}; | return {s.begin(), s.end()}; | ||||
} | } | ||||
NODISCARD inline std::vector<std::string> | NODISCARD inline std::vector<std::string> | ||||
ConsumeRandomLengthStringVector(FuzzedDataProvider &fuzzed_data_provider, | ConsumeRandomLengthStringVector(FuzzedDataProvider &fuzzed_data_provider, | ||||
size_t max_vector_size = 16, | const size_t max_vector_size = 16, | ||||
size_t max_string_length = 16) noexcept { | const size_t max_string_length = 16) noexcept { | ||||
const size_t n_elements = | const size_t n_elements = | ||||
fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, max_vector_size); | fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, max_vector_size); | ||||
std::vector<std::string> r; | std::vector<std::string> r; | ||||
for (size_t i = 0; i < n_elements; ++i) { | for (size_t i = 0; i < n_elements; ++i) { | ||||
r.push_back( | r.push_back( | ||||
fuzzed_data_provider.ConsumeRandomLengthString(max_string_length)); | fuzzed_data_provider.ConsumeRandomLengthString(max_string_length)); | ||||
} | } | ||||
return r; | return r; | ||||
} | } | ||||
template <typename T> | template <typename T> | ||||
NODISCARD inline std::vector<T> | |||||
ConsumeRandomLengthIntegralVector(FuzzedDataProvider &fuzzed_data_provider, | |||||
const size_t max_vector_size = 16) noexcept { | |||||
const size_t n_elements = | |||||
fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, max_vector_size); | |||||
std::vector<T> r; | |||||
for (size_t i = 0; i < n_elements; ++i) { | |||||
r.push_back(fuzzed_data_provider.ConsumeIntegral<T>()); | |||||
} | |||||
return r; | |||||
} | |||||
template <typename T> | |||||
NODISCARD inline std::optional<T> | NODISCARD inline std::optional<T> | ||||
ConsumeDeserializable(FuzzedDataProvider &fuzzed_data_provider, | ConsumeDeserializable(FuzzedDataProvider &fuzzed_data_provider, | ||||
size_t max_length = 4096) noexcept { | const size_t max_length = 4096) noexcept { | ||||
const std::vector<uint8_t> buffer = | const std::vector<uint8_t> buffer = | ||||
ConsumeRandomLengthByteVector(fuzzed_data_provider, max_length); | ConsumeRandomLengthByteVector(fuzzed_data_provider, max_length); | ||||
CDataStream ds{buffer, SER_NETWORK, INIT_PROTO_VERSION}; | CDataStream ds{buffer, SER_NETWORK, INIT_PROTO_VERSION}; | ||||
T obj; | T obj; | ||||
try { | try { | ||||
ds >> obj; | ds >> obj; | ||||
} catch (const std::ios_base::failure &) { | } catch (const std::ios_base::failure &) { | ||||
return std::nullopt; | return std::nullopt; | ||||
Show All 33 Lines | ConsumeUInt256(FuzzedDataProvider &fuzzed_data_provider) noexcept { | ||||
const std::vector<uint8_t> v256 = | const std::vector<uint8_t> v256 = | ||||
fuzzed_data_provider.ConsumeBytes<uint8_t>(sizeof(uint256)); | fuzzed_data_provider.ConsumeBytes<uint8_t>(sizeof(uint256)); | ||||
if (v256.size() != sizeof(uint256)) { | if (v256.size() != sizeof(uint256)) { | ||||
return {}; | return {}; | ||||
} | } | ||||
return uint256{v256}; | return uint256{v256}; | ||||
} | } | ||||
template <typename T> bool MultiplicationOverflow(T i, T j) { | template <typename T> | ||||
NODISCARD bool MultiplicationOverflow(const T i, const T j) noexcept { | |||||
static_assert(std::is_integral<T>::value, "Integral required."); | static_assert(std::is_integral<T>::value, "Integral required."); | ||||
if (std::numeric_limits<T>::is_signed) { | if (std::numeric_limits<T>::is_signed) { | ||||
if (i > 0) { | if (i > 0) { | ||||
if (j > 0) { | if (j > 0) { | ||||
return i > (std::numeric_limits<T>::max() / j); | return i > (std::numeric_limits<T>::max() / j); | ||||
} else { | } else { | ||||
return j < (std::numeric_limits<T>::min() / i); | return j < (std::numeric_limits<T>::min() / i); | ||||
} | } | ||||
Show All 13 Lines |