5#ifndef BITCOIN_TEST_FUZZ_UTIL_H
6#define BITCOIN_TEST_FUZZ_UTIL_H
34template <
typename... Callables>
37 constexpr size_t call_size{
sizeof...(callables)};
38 static_assert(call_size >= 1);
42 ((i++ == call_index ? callables() : void()), ...);
46template <
typename Collection>
51 auto it = col.begin();
56template<
typename B = u
int8_t>
59 static_assert(
sizeof(
B) == 1);
60 const std::string
s = max_length ?
61 fuzzed_data_provider.ConsumeRandomLengthString(*max_length) :
62 fuzzed_data_provider.ConsumeRandomLengthString();
63 std::vector<B>
ret(
s.size());
64 std::copy(
s.begin(),
s.end(),
reinterpret_cast<char*
>(
ret.data()));
81 std::vector<std::string> r;
82 r.reserve(n_elements);
83 for (
size_t i = 0; i < n_elements; ++i) {
94 r.reserve(n_elements);
95 for (
size_t i = 0; i < n_elements; ++i) {
104template <
typename T,
typename P>
112 }
catch (
const std::ios_base::failure&) {
126 }
catch (
const std::ios_base::failure&) {
132template <
typename WeakEnumType,
size_t size>
137 WeakEnumType(fuzzed_data_provider.
ConsumeIntegral<
typename std::underlying_type<WeakEnumType>::type>());
147[[nodiscard]] int64_t
ConsumeTime(
FuzzedDataProvider& fuzzed_data_provider,
const std::optional<int64_t>& min = std::nullopt,
const std::optional<int64_t>& max = std::nullopt)
noexcept;
164 const std::vector<uint8_t> v160 = fuzzed_data_provider.
ConsumeBytes<uint8_t>(160 / 8);
165 if (v160.size() != 160 / 8) {
173 const std::vector<uint8_t> v256 = fuzzed_data_provider.
ConsumeBytes<uint8_t>(256 / 8);
174 if (v256.size() != 256 / 8) {
194 result = value - (quotient * (range + 1));
197 assert(result >= min && result <= max);
210 static_assert(std::is_integral<T>::value,
"Integral required.");
211 if (std::numeric_limits<T>::is_signed) {
214 return i > (std::numeric_limits<T>::max() / j);
216 return j < (std::numeric_limits<T>::min() / i);
220 return i < (std::numeric_limits<T>::min() / j);
222 return i != 0 && (j < (std::numeric_limits<T>::max() / i));
226 return j != 0 && i > std::numeric_limits<T>::max() / j;
235template <
typename T,
size_t size>
255template<
typename B = u
int8_t>
258 static_assert(
sizeof(
B) == 1);
259 auto random_bytes = fuzzed_data_provider.
ConsumeBytes<
B>(length);
260 random_bytes.resize(length);
276 static ssize_t
read(
void* cookie,
char* buf,
size_t size);
278 static ssize_t
write(
void* cookie,
const char* buf,
size_t size);
280 static int seek(
void* cookie, int64_t* offset,
int whence);
282 static int close(
void* cookie);
285#define WRITE_TO_STREAM_CASE(type, consume) \
290template <
typename Stream>
296 fuzzed_data_provider,
307 WRITE_TO_STREAM_CASE(std::vector<uint8_t>, ConsumeRandomLengthIntegralVector<uint8_t>(fuzzed_data_provider)));
308 }
catch (
const std::ios_base::failure&) {
314#define READ_FROM_STREAM_CASE(type) \
319template <
typename Stream>
325 fuzzed_data_provider,
337 }
catch (
const std::ios_base::failure&) {
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
int64_t CAmount
Amount in satoshis (Can be negative)
arith_uint256 UintToArith256(const uint256 &a)
CCoinsView that adds a memory cache for transactions to another CCoinsView.
An encapsulated private key.
Serialized script, used inside transaction inputs and outputs.
The basic transaction that is broadcasted on the network and contained in blocks.
Double ended buffer combining vector and stream-like interfaces.
std::string ConsumeRandomLengthString(size_t max_length)
std::vector< T > ConsumeBytes(size_t num_bytes)
T ConsumeIntegralInRange(T min, T max)
T PickValueInArray(const T(&array)[size])
static ssize_t write(void *cookie, const char *buf, size_t size)
FuzzedDataProvider & m_fuzzed_data_provider
static int seek(void *cookie, int64_t *offset, int whence)
static int close(void *cookie)
FuzzedFileProvider(FuzzedDataProvider &fuzzed_data_provider)
static ssize_t read(void *cookie, char *buf, size_t size)
256-bit unsigned big integer.
std::vector< bool > BytesToBits(const std::vector< unsigned char > &bytes)
static const unsigned int MAX_OPCODE
opcodetype
Script opcodes.
A mutable version of CTransaction.
CScriptNum ConsumeScriptNum(FuzzedDataProvider &fuzzed_data_provider) noexcept
WeakEnumType ConsumeWeakEnum(FuzzedDataProvider &fuzzed_data_provider, const WeakEnumType(&all_types)[size]) noexcept
uint32_t ConsumeSequence(FuzzedDataProvider &fuzzed_data_provider) noexcept
DataStream ConsumeDataStream(FuzzedDataProvider &fuzzed_data_provider, const std::optional< size_t > &max_length=std::nullopt) noexcept
auto & PickValue(FuzzedDataProvider &fuzzed_data_provider, Collection &col)
CMutableTransaction ConsumeTransaction(FuzzedDataProvider &fuzzed_data_provider, const std::optional< std::vector< Txid > > &prevout_txids, const int max_num_in=10, const int max_num_out=10) noexcept
void ReadFromStream(FuzzedDataProvider &fuzzed_data_provider, Stream &stream) noexcept
std::vector< bool > ConsumeRandomLengthBitVector(FuzzedDataProvider &fuzzed_data_provider, const std::optional< size_t > &max_length=std::nullopt) noexcept
CScriptWitness ConsumeScriptWitness(FuzzedDataProvider &fuzzed_data_provider, const size_t max_stack_elem_size=32) noexcept
P ConsumeDeserializationParams(FuzzedDataProvider &fuzzed_data_provider) noexcept
std::vector< B > ConsumeFixedLengthByteVector(FuzzedDataProvider &fuzzed_data_provider, const size_t length) noexcept
Returns a byte vector of specified size regardless of the number of remaining bytes available from th...
bool ContainsSpentInput(const CTransaction &tx, const CCoinsViewCache &inputs) noexcept
uint256 ConsumeUInt256(FuzzedDataProvider &fuzzed_data_provider) noexcept
#define READ_FROM_STREAM_CASE(type)
arith_uint256 ConsumeArithUInt256(FuzzedDataProvider &fuzzed_data_provider) noexcept
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)
std::vector< B > ConsumeRandomLengthByteVector(FuzzedDataProvider &fuzzed_data_provider, const std::optional< size_t > &max_length=std::nullopt) noexcept
std::vector< T > ConsumeRandomLengthIntegralVector(FuzzedDataProvider &fuzzed_data_provider, const size_t max_vector_size=16) noexcept
CScript ConsumeScript(FuzzedDataProvider &fuzzed_data_provider, const bool maybe_p2wsh=false) noexcept
void WriteToStream(FuzzedDataProvider &fuzzed_data_provider, Stream &stream) noexcept
int64_t ConsumeTime(FuzzedDataProvider &fuzzed_data_provider, const std::optional< int64_t > &min=std::nullopt, const std::optional< int64_t > &max=std::nullopt) noexcept
std::optional< T > ConsumeDeserializable(FuzzedDataProvider &fuzzed_data_provider, const P ¶ms, const std::optional< size_t > &max_length=std::nullopt) noexcept
std::vector< std::string > ConsumeRandomLengthStringVector(FuzzedDataProvider &fuzzed_data_provider, const size_t max_vector_size=16, const size_t max_string_length=16) noexcept
CKey ConsumePrivateKey(FuzzedDataProvider &fuzzed_data_provider, std::optional< bool > compressed=std::nullopt) noexcept
bool MultiplicationOverflow(const T i, const T j) noexcept
opcodetype ConsumeOpcodeType(FuzzedDataProvider &fuzzed_data_provider) noexcept
void SetFuzzedErrNo(FuzzedDataProvider &fuzzed_data_provider, const std::array< T, size > &errnos)
Sets errno to a value selected from the given std::array errnos.
uint160 ConsumeUInt160(FuzzedDataProvider &fuzzed_data_provider) noexcept
#define WRITE_TO_STREAM_CASE(type, consume)
CTxDestination ConsumeTxDestination(FuzzedDataProvider &fuzzed_data_provider) noexcept
arith_uint256 ConsumeArithUInt256InRange(FuzzedDataProvider &fuzzed_data_provider, const arith_uint256 &min, const arith_uint256 &max) noexcept
std::map< COutPoint, Coin > ConsumeCoins(FuzzedDataProvider &fuzzed_data_provider) noexcept
CAmount ConsumeMoney(FuzzedDataProvider &fuzzed_data_provider, const std::optional< CAmount > &max=std::nullopt) noexcept