Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
avm.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
14
16using namespace bb::avm2::fuzzer;
17
20extern "C" int LLVMFuzzerInitialize(int*, char***)
21{
22 const char* simulator_path = std::getenv("AVM_SIMULATOR_BIN");
23 if (simulator_path == nullptr) {
24 throw std::runtime_error("AVM_SIMULATOR_BIN is not set");
25 }
26 std::string simulator_path_str(simulator_path);
27 JsSimulator::initialize(simulator_path_str);
29 return 0;
30}
31
32SimulatorResult fuzz(const uint8_t* buffer, size_t size)
33{
34 FuzzerData deserialized_data;
35 try {
36 msgpack::unpack((reinterpret_cast<const char*>(buffer)), size).get().convert(deserialized_data);
37 } catch (const std::exception& e) {
38 deserialized_data = FuzzerData();
39 }
40
42 ws_mgr->fork();
43 auto res = fuzz(deserialized_data);
44 ws_mgr->reset_world_state();
45
46 return res;
47}
48
49extern "C" size_t LLVMFuzzerCustomMutator(uint8_t* serialized_fuzzer_data,
50 size_t serialized_fuzzer_data_size,
51 size_t max_size,
52 unsigned int seed)
53{
54 auto rng = std::mt19937_64(seed);
55 FuzzerData deserialized_data;
56 try {
57 msgpack::unpack((reinterpret_cast<const char*>(serialized_fuzzer_data)), serialized_fuzzer_data_size)
58 .get()
59 .convert(deserialized_data);
60 } catch (const std::exception& e) {
61 deserialized_data = FuzzerData();
62 }
63 mutate_fuzzer_data(deserialized_data, rng);
64 auto [mutated_serialized_fuzzer_data, mutated_serialized_fuzzer_data_size] =
65 msgpack_encode_buffer(deserialized_data);
66 if (mutated_serialized_fuzzer_data_size > max_size) {
67 delete[] mutated_serialized_fuzzer_data;
68 return 0;
69 }
70
71 memcpy(serialized_fuzzer_data, mutated_serialized_fuzzer_data, mutated_serialized_fuzzer_data_size);
72 delete[] mutated_serialized_fuzzer_data;
73
74 return mutated_serialized_fuzzer_data_size;
75}
76
77extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
78{
79 fuzz(data, size);
80 return 0;
81}
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)
static void initialize(std::string &simulator_path)
static FuzzerWorldStateManager * getInstance()
Definition dbs.hpp:108
world_state::WorldStateRevision fork()
Definition dbs.cpp:272
const std::vector< MemoryValue > data
uint8_t buffer[RANDOM_BUFFER_SIZE]
Definition engine.cpp:34
void mutate_fuzzer_data(FuzzerData &fuzzer_data, std::mt19937_64 &rng)
std::pair< uint8_t *, size_t > msgpack_encode_buffer(auto &&obj, uint8_t *scratch_buf=nullptr, size_t scratch_size=0)
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,...