Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
avm_differential.fuzzer.cpp
Go to the documentation of this file.
1#include <iomanip>
2#include <iostream>
3#include <random>
4#include <string>
5#include <vector>
6
16
18using namespace bb::avm2::fuzzer;
19
20namespace {
21
22FuzzerContext create_context_with_predefined_functions()
23{
25
26 // Register predefined functions
27 for (const auto& function : PREDEFINED_FUNCTIONS) {
28 context.register_contract_from_bytecode(function);
29 }
30
31 return context;
32}
33
34} // namespace
35
38extern "C" int LLVMFuzzerInitialize(int*, char***)
39{
40 const char* simulator_path = std::getenv("AVM_SIMULATOR_BIN");
41 if (simulator_path == nullptr) {
42 throw std::runtime_error("AVM_SIMULATOR_BIN is not set");
43 }
44 std::string simulator_path_str(simulator_path);
45 JsSimulator::initialize(simulator_path_str);
47 return 0;
48}
49
50SimulatorResult fuzz(const uint8_t* buffer, size_t size)
51{
52 FuzzerData deserialized_data;
53 try {
54 msgpack::unpack((reinterpret_cast<const char*>(buffer)), size).get().convert(deserialized_data);
55 } catch (const std::exception& e) {
56 deserialized_data = FuzzerData();
57 }
58
60 ws_mgr->fork();
61 auto context = create_context_with_predefined_functions();
62 auto res = fuzz_against_ts_simulator(deserialized_data, context);
64
65 return res;
66}
67
68extern "C" size_t LLVMFuzzerCustomMutator(uint8_t* serialized_fuzzer_data,
69 size_t serialized_fuzzer_data_size,
70 size_t max_size,
71 unsigned int seed)
72{
73 auto context = create_context_with_predefined_functions();
74 auto rng = std::mt19937_64(seed);
75 FuzzerData deserialized_data;
76 try {
77 msgpack::unpack((reinterpret_cast<const char*>(serialized_fuzzer_data)), serialized_fuzzer_data_size)
78 .get()
79 .convert(deserialized_data);
80 } catch (const std::exception& e) {
81 deserialized_data = FuzzerData();
82 }
83 mutate_fuzzer_data(deserialized_data, rng, context);
84 auto [mutated_serialized_fuzzer_data, mutated_serialized_fuzzer_data_size] =
85 msgpack_encode_buffer(deserialized_data);
86 if (mutated_serialized_fuzzer_data_size > max_size) {
87 delete[] mutated_serialized_fuzzer_data;
88 return 0;
89 }
90
91 memcpy(serialized_fuzzer_data, mutated_serialized_fuzzer_data, mutated_serialized_fuzzer_data_size);
92 delete[] mutated_serialized_fuzzer_data;
93
94 return mutated_serialized_fuzzer_data_size;
95}
96
97extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
98{
99 fuzz(data, size);
100 return 0;
101}
int LLVMFuzzerInitialize(int *, char ***)
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
::FuzzInstruction FuzzInstruction
SimulatorResult fuzz(const uint8_t *buffer, size_t size)
size_t LLVMFuzzerCustomMutator(uint8_t *serialized_fuzzer_data, size_t serialized_fuzzer_data_size, size_t max_size, unsigned int seed)
const std::vector< std::vector< uint8_t > > PREDEFINED_FUNCTIONS
Definition constants.hpp:67
static void initialize(std::string &simulator_path)
static FuzzerWorldStateManager * getInstance()
Definition dbs.hpp:80
world_state::WorldStateRevision fork()
Definition dbs.cpp:204
const std::vector< MemoryValue > data
uint8_t buffer[RANDOM_BUFFER_SIZE]
Definition engine.cpp:34
SimulatorResult fuzz_against_ts_simulator(FuzzerData &fuzzer_data, FuzzerContext &context)
fuzz CPP vs JS simulator with the given fuzzer data
Definition fuzz.cpp:14
FuzzerWorldStateManager * ws_mgr
Definition fuzz.test.cpp:16
std::pair< uint8_t *, size_t > msgpack_encode_buffer(auto &&obj, uint8_t *scratch_buf=nullptr, size_t scratch_size=0)
void mutate_fuzzer_data(FuzzerData &fuzzer_data, std::mt19937_64 &rng, const FuzzerContext &context)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
describes the data which will be used for fuzzing Should contain instructions, calldata,...