39 MemoryTag::FF, MemoryTag::U1, MemoryTag::U8, MemoryTag::U16, MemoryTag::U32, MemoryTag::U64, MemoryTag::U128,
101__attribute__((section(
"__libfuzzer_extra_counters"))) uint8_t num_of_entries = 0;
107 values.reserve(num_of_entries);
110 for (
const auto& val : input.init_memory_values) {
111 values.emplace_back(val);
115 for (
size_t i = input.init_memory_values.size(); i < num_of_entries; ++i) {
116 auto entry_idx = (input.selection_encoding >> i) % values.size();
117 auto entry_value = values[entry_idx];
119 FF modified_value = entry_value.as_ff() + input.init_memory_values[i % input.init_memory_values.size()].as_ff();
121 auto should_upcast = (input.upcast_encoding >> i) & 1;
122 auto should_downcast = (input.downcast_encoding >> i) & 1;
123 if (should_upcast == 1) {
125 auto new_tag_index = (
static_cast<uint8_t
>(entry_value.get_tag()) + 1) %
memory_tags.size();
129 if (should_downcast == 1) {
131 auto new_tag_index = (
static_cast<uint8_t
>(entry_value.get_tag()) - 1) %
memory_tags.size();
135 values.emplace_back(entry_value);
143 addresses.reserve(num_of_entries);
147 addresses.emplace_back(addr);
150 for (
size_t i = 0; i < num_of_entries; ++i) {
153 addresses.emplace_back(addr + addr);
170 int mutation_choice = mutation_dist(rng);
172 switch (mutation_choice) {
183 size_t entry_idx = entry_dist(rng);
190 size_t entry_idx = entry_dist(rng);
197 size_t entry_idx = entry_dist(rng);
204 size_t entry_idx = entry_dist(rng);
211 size_t value_idx = value_dist(rng);
214 size_t tag_idx = tag_dist(rng);
218 for (
size_t i = 0; i < 4; ++i) {
219 limbs[i] = dist(rng);
221 auto random_value =
FF(limbs[0], limbs[1], limbs[2], limbs[3]);
228 size_t addr_idx = addr_idx_dist(rng);
230 int new_addr =
static_cast<int>(input.
memory_addresses[addr_idx]) + addr_change(rng);
237 int new_val =
static_cast<int>(input.
space_ids) + context_dist(rng);
238 input.
space_ids =
static_cast<uint8_t
>(new_val);
254 info(
"Input size too small");
276 memories.reserve(num_contexts);
278 for (
size_t i = 0; i < num_contexts; ++i) {
279 memories.push_back(mem_provider.
make_memory(
static_cast<uint8_t
>(i)));
287 for (
size_t i = 0; i < num_of_entries; ++i) {
294 mem->set(addr, memory_contents[i]);
296 running_memory_states[
mem->get_space_id()][addr] = memory_contents[i];
298 auto retrieved_val =
mem->
get(addr);
300 if (running_memory_states[
mem->get_space_id()].contains(addr)) {
301 auto expected_val = running_memory_states[
mem->get_space_id()][addr];
302 assert(retrieved_val == expected_val);
319 for (uint32_t i = 1; i <= num_of_entries; ++i) {
320 trace.
set(avm2::Column::memory_sel_register_op_0_, i, 1);
322 check_relation<memory_rel>(
trace);
DeduplicatingEventEmitter< 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 process(const simulation::EventEmitterInterface< simulation::MemoryEvent >::Container &events, TraceContainer &trace)
void process_misc(TraceContainer &trace, const uint32_t num_rows=MAX_AVM_TRACE_SIZE)
void set(Column col, uint32_t row, const FF &value)
bool get(std::vector< uint8_t > const &key, std::vector< uint8_t > &value)
PrecomputedTraceBuilder precomputed_builder
ExecutionIdManager execution_id_manager
const std::vector< MemoryValue > data
uint8_t buffer[RANDOM_BUFFER_SIZE]
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
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept