5 #ifndef BITCOIN_TEST_FUZZ_UTIL_H
6 #define BITCOIN_TEST_FUZZ_UTIL_H
34 template <
typename... Callables>
37 constexpr
size_t call_size{
sizeof...(callables)};
38 static_assert(call_size >= 1);
42 ((i++ == call_index ? callables() : void()), ...);
46 template <
typename Collection>
51 auto it = col.begin();
56 template<
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 for (
size_t i = 0; i < n_elements; ++i) {
93 for (
size_t i = 0; i < n_elements; ++i) {
102 template <
typename T,
typename P>
110 }
catch (
const std::ios_base::failure&) {
116 template <
typename T>
124 }
catch (
const std::ios_base::failure&) {
130 template <
typename WeakEnumType,
size_t size>
135 WeakEnumType(fuzzed_data_provider.
ConsumeIntegral<
typename std::underlying_type<WeakEnumType>::type>());
145 [[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;
162 const std::vector<uint8_t> v160 = fuzzed_data_provider.
ConsumeBytes<uint8_t>(160 / 8);
163 if (v160.size() != 160 / 8) {
171 const std::vector<uint8_t> v256 = fuzzed_data_provider.
ConsumeBytes<uint8_t>(256 / 8);
172 if (v256.size() != 256 / 8) {
189 template <
typename T>
192 static_assert(std::is_integral<T>::value,
"Integral required.");
193 if (std::numeric_limits<T>::is_signed) {
196 return i > (std::numeric_limits<T>::max() / j);
198 return j < (std::numeric_limits<T>::min() / i);
202 return i < (std::numeric_limits<T>::min() / j);
204 return i != 0 && (j < (std::numeric_limits<T>::max() / i));
208 return j != 0 && i > std::numeric_limits<T>::max() / j;
217 template <
typename T,
size_t size>
237 template<
typename B = u
int8_t>
240 static_assert(
sizeof(
B) == 1);
241 auto random_bytes = fuzzed_data_provider.
ConsumeBytes<
B>(length);
242 random_bytes.resize(length);
258 static ssize_t
read(
void* cookie,
char* buf,
size_t size);
260 static ssize_t
write(
void* cookie,
const char* buf,
size_t size);
262 static int seek(
void* cookie, int64_t* offset,
int whence);
264 static int close(
void* cookie);
267 #define WRITE_TO_STREAM_CASE(type, consume) \
272 template <
typename Stream>
278 fuzzed_data_provider,
289 WRITE_TO_STREAM_CASE(std::vector<uint8_t>, ConsumeRandomLengthIntegralVector<uint8_t>(fuzzed_data_provider)));
290 }
catch (
const std::ios_base::failure&) {
296 #define READ_FROM_STREAM_CASE(type) \
301 template <
typename Stream>
307 fuzzed_data_provider,
319 }
catch (
const std::ios_base::failure&) {
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, 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
void ReadFromStream(FuzzedDataProvider &fuzzed_data_provider, Stream &stream) noexcept
CScriptWitness ConsumeScriptWitness(FuzzedDataProvider &fuzzed_data_provider, const size_t max_stack_elem_size=32) noexcept
std::vector< T > ConsumeRandomLengthIntegralVector(FuzzedDataProvider &fuzzed_data_provider, const size_t max_vector_size=16) noexcept
auto & PickValue(FuzzedDataProvider &fuzzed_data_provider, Collection &col)
std::optional< T > ConsumeDeserializable(FuzzedDataProvider &fuzzed_data_provider, const P ¶ms, const std::optional< size_t > &max_length=std::nullopt) noexcept
bool ContainsSpentInput(const CTransaction &tx, const CCoinsViewCache &inputs) noexcept
std::map< COutPoint, Coin > ConsumeCoins(FuzzedDataProvider &fuzzed_data_provider) noexcept
uint256 ConsumeUInt256(FuzzedDataProvider &fuzzed_data_provider) 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
#define READ_FROM_STREAM_CASE(type)
arith_uint256 ConsumeArithUInt256(FuzzedDataProvider &fuzzed_data_provider) noexcept
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)
CScript ConsumeScript(FuzzedDataProvider &fuzzed_data_provider, const bool maybe_p2wsh=false) noexcept
void WriteToStream(FuzzedDataProvider &fuzzed_data_provider, Stream &stream) noexcept
std::vector< B > ConsumeRandomLengthByteVector(FuzzedDataProvider &fuzzed_data_provider, const std::optional< size_t > &max_length=std::nullopt) 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
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
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
P ConsumeDeserializationParams(FuzzedDataProvider &fuzzed_data_provider) noexcept
#define WRITE_TO_STREAM_CASE(type, consume)
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...
CTxDestination ConsumeTxDestination(FuzzedDataProvider &fuzzed_data_provider) noexcept
CAmount ConsumeMoney(FuzzedDataProvider &fuzzed_data_provider, const std::optional< CAmount > &max=std::nullopt) noexcept
std::vector< bool > ConsumeRandomLengthBitVector(FuzzedDataProvider &fuzzed_data_provider, const std::optional< size_t > &max_length=std::nullopt) noexcept