Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
instruction_block.cpp
Go to the documentation of this file.
2
3#include <random>
4#include <vector>
5
9
10namespace bb::avm2::fuzzer {
11
13
15{
16 InstructionBlock instruction_block;
18 InstructionMutator instruction_mutator(instruction_block, context);
19 for (uint16_t i = 0; i < std::uniform_int_distribution<uint16_t>(1, MAX_INSTRUCTION_BLOCK_SIZE_ON_GENERATION)(rng);
20 i++) {
21 auto new_instructions = instruction_mutator.generate_instruction(rng);
22 instruction_block.instructions.insert(
23 instruction_block.instructions.end(), new_instructions.begin(), new_instructions.end());
24 }
25 return instruction_block;
26}
27
29{
30 InstructionMutator instruction_mutator(instruction_block, context);
31
32 // If vector is empty, force insertion (other mutations do nothing on empty vectors)
33 if (instruction_block.instructions.empty()) {
34 auto new_instructions = instruction_mutator.generate_instruction(rng);
35 instruction_block.instructions.insert(
36 instruction_block.instructions.end(), new_instructions.begin(), new_instructions.end());
37 return;
38 }
39
41 switch (option) {
43 // Custom insertion logic to handle vector-returning generator
44 auto new_instructions = instruction_mutator.generate_instruction(rng);
45 if (!new_instructions.empty()) {
46 std::uniform_int_distribution<size_t> dist(0, instruction_block.instructions.size());
47 size_t index = dist(rng);
48 instruction_block.instructions.insert(instruction_block.instructions.begin() +
49 static_cast<std::ptrdiff_t>(index),
50 new_instructions.begin(),
51 new_instructions.end());
52 }
53 break;
54 }
56 RandomDeletion::mutate(rng, instruction_block.instructions);
57 break;
59 RandomSwap::mutate(rng, instruction_block.instructions);
60 break;
63 rng, instruction_block.instructions, [&instruction_mutator](FuzzInstruction& instr, std::mt19937_64& r) {
64 instruction_mutator.mutate_instruction(instr, r);
65 });
66 break;
67 }
68}
69
70} // namespace bb::avm2::fuzzer
::FuzzInstruction FuzzInstruction
#define AVM_HIGHEST_MEM_ADDRESS
T select(std::mt19937_64 &rng) const
std::vector< FuzzInstruction > generate_instruction(std::mt19937_64 &rng)
Generate one instruction and optionally backfill.
VecMutationOptions
constexpr VecMutationConfig BASIC_VEC_MUTATION_CONFIGURATION
constexpr uint16_t MAX_INSTRUCTION_BLOCK_SIZE_ON_GENERATION
InstructionBlock generate_instruction_block(std::mt19937_64 &rng, const FuzzerContext &context)
void mutate_instruction_block(InstructionBlock &instruction_block, std::mt19937_64 &rng, const FuzzerContext &context)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
static void mutate(std::mt19937_64 &rng, std::vector< T > &vec)
Definition vector.hpp:34
static void mutate(std::mt19937_64 &rng, std::vector< T > &vec, MutateFn &&mutate_element_function)
Definition vector.hpp:60
static void mutate(std::mt19937_64 &rng, std::vector< T > &vec)
Definition vector.hpp:46
std::vector< FuzzInstruction > instructions