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 std::vector<FuzzInstruction> instruction_block;
17 for (uint16_t i = 0; i < std::uniform_int_distribution<uint16_t>(1, MAX_INSTRUCTION_BLOCK_SIZE_ON_GENERATION)(rng);
18 i++) {
19 auto instructions = generate_instruction(rng, context);
20 instruction_block.insert(instruction_block.end(), instructions.begin(), instructions.end());
21 }
22 return instruction_block;
23}
24
26 std::mt19937_64& rng,
28{
29 // If vector is empty, force insertion (other mutations do nothing on empty vectors)
30 if (instruction_block.empty()) {
31 auto new_instructions = generate_instruction(rng, context);
32 instruction_block.insert(instruction_block.end(), new_instructions.begin(), new_instructions.end());
33 return;
34 }
35
37 switch (option) {
39 // Custom insertion logic to handle vector-returning generator
40 auto new_instructions = generate_instruction(rng, context);
41 if (!new_instructions.empty()) {
42 std::uniform_int_distribution<size_t> dist(0, instruction_block.size());
43 size_t index = dist(rng);
44 instruction_block.insert(instruction_block.begin() + static_cast<std::ptrdiff_t>(index),
45 new_instructions.begin(),
46 new_instructions.end());
47 }
48 break;
49 }
51 RandomDeletion::mutate(rng, instruction_block);
52 break;
54 RandomSwap::mutate(rng, instruction_block);
55 break;
57 RandomElementMutation::mutate(rng, instruction_block, [&context](FuzzInstruction& instr, std::mt19937_64& r) {
58 mutate_instruction(instr, r, context);
59 });
60 break;
61 }
62}
63
64} // namespace bb::avm2::fuzzer
::FuzzInstruction FuzzInstruction
T select(std::mt19937_64 &rng) const
VecMutationOptions
constexpr VecMutationConfig BASIC_VEC_MUTATION_CONFIGURATION
constexpr uint16_t MAX_INSTRUCTION_BLOCK_SIZE_ON_GENERATION
void mutate_instruction(FuzzInstruction &instruction, std::mt19937_64 &rng, const FuzzerContext &context)
void mutate_instruction_block(std::vector< FuzzInstruction > &instruction_block, std::mt19937_64 &rng, const FuzzerContext &context)
std::vector< FuzzInstruction > generate_instruction(std::mt19937_64 &rng, const FuzzerContext &context)
Generate one instruction and optionally backfill.
std::vector< FuzzInstruction > generate_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