40 MemoryTag::FF, MemoryTag::U1, MemoryTag::U8, MemoryTag::U16, MemoryTag::U32, MemoryTag::U64, MemoryTag::U128,
102__attribute__((section(
"__libfuzzer_extra_counters"))) uint8_t num_of_entries = 0;
108 values.reserve(num_of_entries);
111 for (
const auto& val : input.init_memory_values) {
112 values.emplace_back(val);
116 for (
size_t i = input.init_memory_values.size(); i < num_of_entries; ++i) {
117 auto entry_idx = (input.selection_encoding >> i) % values.size();
118 auto entry_value = values[entry_idx];
120 FF modified_value = entry_value.as_ff() + input.init_memory_values[i % input.init_memory_values.size()].as_ff();
122 auto should_upcast = (input.upcast_encoding >> i) & 1;
123 auto should_downcast = (input.downcast_encoding >> i) & 1;
124 if (should_upcast == 1) {
126 auto new_tag_index = (
static_cast<uint8_t
>(entry_value.get_tag()) + 1) %
memory_tags.size();
130 if (should_downcast == 1) {
132 auto new_tag_index = (
static_cast<uint8_t
>(entry_value.get_tag()) - 1) %
memory_tags.size();
136 values.emplace_back(entry_value);
144 addresses.reserve(num_of_entries);
148 addresses.emplace_back(addr);
151 for (
size_t i = 0; i < num_of_entries; ++i) {
154 addresses.emplace_back(addr + addr);
171 int mutation_choice = mutation_dist(rng);
173 switch (mutation_choice) {
184 size_t entry_idx = entry_dist(rng);
191 size_t entry_idx = entry_dist(rng);
198 size_t entry_idx = entry_dist(rng);
205 size_t entry_idx = entry_dist(rng);
212 size_t value_idx = value_dist(rng);
215 size_t tag_idx = tag_dist(rng);
219 for (
size_t i = 0; i < 4; ++i) {
220 limbs[i] = dist(rng);
222 auto random_value =
FF(limbs[0], limbs[1], limbs[2], limbs[3]);
229 size_t addr_idx = addr_idx_dist(rng);
231 int new_addr =
static_cast<int>(input.
memory_addresses[addr_idx]) + addr_change(rng);
238 int new_val =
static_cast<int>(input.
space_ids) + context_dist(rng);
239 input.
space_ids =
static_cast<uint8_t
>(new_val);
255 info(
"Input size too small");
277 memories.reserve(num_contexts);
279 for (
size_t i = 0; i < num_contexts; ++i) {
280 memories.push_back(mem_provider.
make_memory(
static_cast<uint8_t
>(i)));
288 for (
size_t i = 0; i < num_of_entries; ++i) {
295 mem->
set(addr, memory_contents[i]);
299 auto retrieved_val =
mem->
get(addr);
303 assert(retrieved_val == expected_val);
320 for (uint32_t i = 1; i <= num_of_entries; ++i) {
321 trace.
set(Column::memory_sel_register_op_0_, i, 1);
323 check_relation<memory_rel>(
trace);
EventEmitter< simulation::RangeCheckEvent > range_check_emitter
static TaggedValue from_tag_truncating(ValueTag tag, FF value)
uint32_t get_execution_id() const override
void increment_execution_id() override
std::unique_ptr< MemoryInterface > make_memory(uint16_t space_id) override
void set(MemoryAddress index, MemoryValue value) override
uint16_t get_space_id() const override
const MemoryValue & get(MemoryAddress index) const override
void process(const simulation::EventEmitterInterface< simulation::MemoryEvent >::Container &events, TraceContainer &trace)
Processes memory events into the memory subtrace.
void process_misc(TraceContainer &trace, const uint32_t num_rows=PRECOMPUTED_TRACE_SIZE)
Populate miscellaneous precomputed columns: first_row selector and idx (row index).
void set(Column col, uint32_t row, const FF &value)
PrecomputedTraceBuilder precomputed_builder
ExecutionIdManager execution_id_manager
const std::vector< MemoryValue > data
std::unique_ptr< uint8_t[]> buffer
std::vector< MemoryValue > generate_memory_values(const MemoryFuzzerInput &input)
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
size_t LLVMFuzzerCustomMutator(uint8_t *data, size_t size, size_t, unsigned int seed)
const std::array< MemoryTag, 7 > memory_tags
std::vector< MemoryAddress > generate_memory_addresses(const MemoryFuzzerInput &input)
__attribute__((section("__libfuzzer_extra_counters"))) uint8_t num_of_entries=0
AVM range check gadget for witness generation.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept