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<InstructionBlock>(
26 fuzzer_data.instruction_blocks,
27 rng,
29 mutate_instruction_block(block, r, context);
30 },
31 [&context](std::mt19937_64& r) { return generate_instruction_block(r, context); },
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 InstructionBlock instruction_block = generate_instruction_block(rng, context);
56 std::vector<FuzzInstruction> preamble;
57 uint32_t num_tags = static_cast<uint32_t>(ValueTag::MAX);
58 preamble.reserve(num_tags);
59 // Add one set per memory tag type
60 for (uint32_t i = 0; i < num_tags; i++) {
61 // TODO: Randomize address, value. Keep address < 255 so it can be used anywhere.
62 auto tag = static_cast<ValueTag>(i);
63 preamble.push_back(SET_8_Instruction{
64 .value_tag = tag,
65 .result_address =
67 .address = i + 1, // Skip address 0
68 },
69 .value = 1,
70 });
71 }
72 instruction_block.instructions.insert(instruction_block.instructions.begin(), 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)
InstructionBlock generate_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)
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< InstructionBlock > instruction_blocks
insert instruction block to the current block
SET_8 instruction.
MemoryTagWrapper value_tag
std::vector< FuzzInstruction > instructions