6#include <fuzzer/FuzzedDataProvider.h>
74 for (
size_t i = 0; i <
local_pcs.size(); i++) {
130 int mutation_choice = mutation_dist(rng);
132 switch (mutation_choice) {
148 0, std::numeric_limits<uint32_t>::max() - uint32_t(num_events));
149 input.
start_pc = start_pc_dist(rng);
155 size_t value_idx = index_dist(rng);
157 input.
local_pcs[value_idx] = pc_dist(rng);
185 .internal_call_id = internal_call_stack_manager.
get_call_id(),
210 ex_events.push_back(ex_event);
224 auto next_pc = internal_call_stack_manager.
pop();
228 ex_event.
error = ExecutionError::OPCODE_EXECUTION;
236 ex_events.push_back(ex_event);
244 ex_events.push_back(ex_event);
261 auto& internal_call_stack_manager =
context->get_internal_call_stack_manager();
275 size_t current_call_idx = 0;
280 ex_events,
context, internal_call_stack_manager, input.
local_pcs[current_call_idx++]);
294 assert(internal_call_stack_manager.get_current_call_stack().size() == 0);
304 assert(ex_events.at(ex_events.size() - 1).error == ExecutionError::OPCODE_EXECUTION);
314 if (getenv(
"AVM_DEBUG") !=
nullptr) {
315 info(
"Debugging trace:");
320 check_relation<internal_call_rel>(
trace);
void run(uint32_t starting_row=0)
static TaggedValue from(T value)
Sets up gadgets and instance managers to provide a context for fuzzing. NOTE: rudimentary set up for ...
EventEmitter< InternalCallStackEvent > internal_call_stack_emitter
std::unique_ptr< simulation::ContextInterface > make_enqueued_fuzzing_context(AztecAddress address=AztecAddress(0), AztecAddress msg_sender=AztecAddress(0), bool is_static=false, FF transaction_fee=FF(0), std::span< const FF > calldata={}, Gas gas_limit=GAS_LIMIT, Gas gas_used=GAS_USED_BY_PRIVATE, TransactionPhase phase=TransactionPhase::APP_LOGIC)
virtual void push(PC caller_pc, PC return_pc)=0
virtual InternalCallId get_call_id() const =0
virtual InternalCallId get_return_call_id() const =0
virtual InternalCallId get_next_call_id() const =0
simulation::Instruction build() const
InstructionBuilder & operand(OperandBuilder operand)
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
Process the ALU events and populate the ALU relevant columns in the trace.
void process(const simulation::EventEmitterInterface< simulation::ExecutionEvent >::Container &ex_events, TraceContainer &trace)
const std::vector< MemoryValue > data
uint8_t buffer[RANDOM_BUFFER_SIZE]
const uint8_t max_total_calls
ContextEvent fill_context_event(std::unique_ptr< ContextInterface > &context, InternalCallStackManagerInterface &internal_call_stack_manager)
void fuzz_internal_return(std::vector< ExecutionEvent > &ex_events, std::unique_ptr< ContextInterface > &context, InternalCallStackManagerInterface &internal_call_stack_manager)
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
size_t LLVMFuzzerCustomMutator(uint8_t *data, size_t size, size_t max_size, unsigned int seed)
const uint8_t max_flat_calls
void fuzz_internal_call(std::vector< ExecutionEvent > &ex_events, std::unique_ptr< ContextInterface > &context, InternalCallStackManagerInterface &internal_call_stack_manager, uint32_t loc)
const uint8_t max_nested_calls
void check_interaction(tracegen::TestTraceContainer &trace)
permutation_settings< perm_internal_call_push_call_stack_settings_ > perm_internal_call_push_call_stack_settings
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
ContextEvent after_context_event
Instruction wire_instruction