Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
fuzzer_data.cpp
Go to the documentation of this file.
2
3#include <random>
4
12
13namespace bb::avm2::fuzzer {
14
16
18{
19 auto num_of_mutation = std::uniform_int_distribution<uint8_t>(0, MAX_MUTATION_NUM)(rng);
20 for (uint8_t i = 0; i < num_of_mutation; i++) {
21 // Select mutation type each iteration for more variety
22 auto mutation_config = BASIC_FUZZER_DATA_MUTATION_CONFIGURATION.select(rng);
23 switch (mutation_config) {
25 mutate_vec<std::vector<FuzzInstruction>>(
26 fuzzer_data.instruction_blocks,
27 rng,
30 },
33 break;
36 break;
39 break;
41 mutate_calldata_vec(fuzzer_data.calldata, rng);
42 if (fuzzer_data.calldata.size() > 0) {
43 // For ts simulator, Selector must fit in 4 bytes (1st calldata element is perceived as the selector)
44 // just setting it to 0
45 fuzzer_data.calldata[0] = bb::avm2::FF(0);
46 }
47 break;
48 }
49 }
50}
51
53{
54 if (fuzzer_data.instruction_blocks.empty()) {
55 std::vector<FuzzInstruction> instruction_block;
56 uint32_t num_tags = static_cast<uint32_t>(ValueTag::MAX);
57 instruction_block.reserve(num_tags);
58 // Add one set per memory tag type
59 for (uint32_t i = 0; i < num_tags; i++) {
60 // TODO: Randomize address, value. Keep address < 255 so it can be used anywhere.
61 auto tag = static_cast<ValueTag>(i);
62 instruction_block.push_back(SET_8_Instruction{
63 .value_tag = tag,
64 .result_address =
66 .address = i + 1, // Skip address 0
67 },
68 .value = 1,
69 });
70 }
71 auto preamble = generate_instruction_block(rng, context);
72 instruction_block.insert(instruction_block.end(), preamble.begin(), preamble.end());
73 fuzzer_data.instruction_blocks.push_back(instruction_block);
75 }
76}
77
79{
80 FuzzerData fuzzer_data = FuzzerData();
82 return fuzzer_data;
83}
84
85} // namespace bb::avm2::fuzzer
void mutate_calldata_vec(std::vector< bb::avm2::FF > &calldata, std::mt19937_64 &rng)
T select(std::mt19937_64 &rng) const
constexpr ReturnOptionsMutationConfig BASIC_RETURN_OPTIONS_MUTATION_CONFIGURATION
constexpr uint8_t MAX_MUTATION_NUM
constexpr FuzzerDataMutationConfig BASIC_FUZZER_DATA_MUTATION_CONFIGURATION
constexpr VecMutationConfig BASIC_VEC_MUTATION_CONFIGURATION
void mutate_control_flow_vec(std::vector< CFGInstruction > &control_flow_vec, std::mt19937_64 &rng)
FuzzerData generate_fuzzer_data(std::mt19937_64 &rng, const FuzzerContext &context)
void mutate_instruction_block(std::vector< FuzzInstruction > &instruction_block, std::mt19937_64 &rng, const FuzzerContext &context)
void add_default_instruction_block_if_empty(FuzzerData &fuzzer_data, std::mt19937_64 &rng, const FuzzerContext &context)
void mutate_fuzzer_data(FuzzerData &fuzzer_data, std::mt19937_64 &rng, const FuzzerContext &context)
std::vector< FuzzInstruction > generate_instruction_block(std::mt19937_64 &rng, const FuzzerContext &context)
AvmFlavorSettings::FF FF
Definition field.hpp:10
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
void mutate_return_options(ReturnOptions &return_options, std::mt19937_64 &rng, const ReturnOptionsMutationConfig &config)
uint32_t address
describes the data which will be used for fuzzing Should contain instructions, calldata,...
ReturnOptions return_options
std::vector< bb::avm2::FF > calldata
std::vector< CFGInstruction > cfg_instructions
std::vector< std::vector< FuzzInstruction > > instruction_blocks
insert instruction block to the current block
SET_8 instruction.
MemoryTagWrapper value_tag