Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
fuzzer.hpp File Reference

Go to the source code of this file.

Classes

struct  HavocSettings
 
class  FastRandom
 Class for quickly deterministically creating new random values. We don't care about distribution much here. More...
 
class  ArithmeticFuzzHelper< T >
 A templated class containing most of the fuzzing logic for a generic Arithmetic class. More...
 

Concepts

concept  SimpleRng
 Concept for a simple PRNG which returns a uint32_t when next is called.
 
concept  InstructionArgumentSizes
 Concept for forcing ArgumentSizes to be size_t.
 
concept  HavocConfigConstraint
 Concept for Havoc Configurations.
 
concept  ArithmeticFuzzHelperConstraint
 Concept specifying the class used by the fuzzer.
 
concept  CheckableComposer
 Fuzzer uses only composers with check_circuit function.
 
concept  PostProcessingEnabled
 The fuzzer can use a postprocessing function that is specific to the type being fuzzed.
 
concept  InstructionWeightsEnabled
 This concept is used when we want to limit the number of executions of certain instructions (for example, divisions and multiplications in bigfield start to bog down the fuzzer)
 

Macros

#define PARENS   ()
 
#define EXPAND(arg)   EXPAND1(EXPAND1(EXPAND1(EXPAND1(arg))))
 
#define EXPAND1(arg)   EXPAND2(EXPAND2(EXPAND2(EXPAND2(arg))))
 
#define EXPAND2(arg)   EXPAND3(EXPAND3(EXPAND3(EXPAND3(arg))))
 
#define EXPAND3(arg)   EXPAND4(EXPAND4(EXPAND4(EXPAND4(arg))))
 
#define EXPAND4(arg)   arg
 
#define FOR_EACH(macro, ...)   __VA_OPT__(EXPAND(FOR_EACH_HELPER(macro, __VA_ARGS__)))
 
#define FOR_EACH_HELPER(macro, a1, ...)   macro(a1) __VA_OPT__(FOR_EACH_AGAIN PARENS(macro, __VA_ARGS__))
 
#define FOR_EACH_AGAIN()   FOR_EACH_HELPER
 
#define ALL_POSSIBLE_OPCODES
 
#define MONT_CONVERSION_LOCAL
 
#define INV_MONT_CONVERSION_LOCAL
 
#define PARSE_OPCODE(name)
 
#define PARSE_ALL_OPCODES(...)   FOR_EACH(PARSE_OPCODE, __VA_ARGS__)
 
#define WRITE_OPCODE_IF(name)
 
#define WRITE_ALL_OPCODES(...)   FOR_EACH(WRITE_OPCODE_IF, __VA_ARGS__)
 
#define EXECUTE_OPCODE_IF(name)
 
#define EXECUTE_ALL_OPCODES(...)   FOR_EACH(EXECUTE_OPCODE_IF, __VA_ARGS__)
 

Functions

size_t LLVMFuzzerMutate (uint8_t *Data, size_t Size, size_t MaxSize)
 
uint256_t read_uint256 (const uint8_t *data, size_t buffer_size=32)
 
template<template< typename > class Fuzzer, typename Composer >
constexpr void RunWithBuilder (const uint8_t *Data, const size_t Size, FastRandom &VarianceRNG)
 
template<template< typename > class Fuzzer, uint64_t Composers>
constexpr void RunWithBuilders (const uint8_t *Data, const size_t Size, FastRandom &VarianceRNG)
 

Macro Definition Documentation

◆ ALL_POSSIBLE_OPCODES

#define ALL_POSSIBLE_OPCODES
Value:
CONSTANT, WITNESS, CONSTANT_WITNESS, ADD, SUBTRACT, MULTIPLY, DIVIDE, ADD_TWO, MADD, MULT_MADD, MSUB_DIV, SQR, \
ASSERT_EQUAL, ASSERT_NOT_EQUAL, SQR_ADD, ASSERT_EQUAL, ASSERT_NOT_EQUAL, SQR_ADD, SUBTRACT_WITH_CONSTRAINT, \
DIVIDE_WITH_CONSTRAINTS, SLICE, ASSERT_ZERO, ASSERT_NOT_ZERO, COND_NEGATE, ADD_MULTI, ASSERT_VALID, \
COND_SELECT, DOUBLE, RANDOMSEED, SELECT_IF_ZERO, SELECT_IF_EQ, REVERSE, GET_BIT, SET_BIT, SET, INVERT, AND, \
OR, XOR, MODULO, SHL, SHR, ROL, ROR, NOT, BATCH_MUL, COND_ASSIGN
#define ADD(b)
#define SQR(a)

Definition at line 20 of file fuzzer.hpp.

◆ EXECUTE_ALL_OPCODES

#define EXECUTE_ALL_OPCODES (   ...)    FOR_EACH(EXECUTE_OPCODE_IF, __VA_ARGS__)

◆ EXECUTE_OPCODE_IF

#define EXECUTE_OPCODE_IF (   name)
Value:
if constexpr (requires { T::ArgSizes::name; }) \
if constexpr (T::ArgSizes::name != size_t(-1)) { \
if (instruction.id == T::Instruction::OPCODE::name) { \
if constexpr (InstructionWeightsEnabled<T>) { \
if (!((total_instruction_weight + T::InstructionWeights::name) > T::InstructionWeights::_LIMIT)) { \
total_instruction_weight += T::InstructionWeights::name; \
if (T::ExecutionHandler::execute_##name(&composer, state, instruction)) { \
return; \
} \
} else { \
return; \
} \
} else { \
\
if (T::ExecutionHandler::execute_##name(&composer, state, instruction)) { \
return; \
} \
} \
} \
}
This concept is used when we want to limit the number of executions of certain instructions (for exam...
Definition fuzzer.hpp:212
Instruction instruction

◆ EXPAND

#define EXPAND (   arg)    EXPAND1(EXPAND1(EXPAND1(EXPAND1(arg))))

Definition at line 10 of file fuzzer.hpp.

◆ EXPAND1

#define EXPAND1 (   arg)    EXPAND2(EXPAND2(EXPAND2(EXPAND2(arg))))

Definition at line 11 of file fuzzer.hpp.

◆ EXPAND2

#define EXPAND2 (   arg)    EXPAND3(EXPAND3(EXPAND3(EXPAND3(arg))))

Definition at line 12 of file fuzzer.hpp.

◆ EXPAND3

#define EXPAND3 (   arg)    EXPAND4(EXPAND4(EXPAND4(EXPAND4(arg))))

Definition at line 13 of file fuzzer.hpp.

◆ EXPAND4

#define EXPAND4 (   arg)    arg

Definition at line 14 of file fuzzer.hpp.

◆ FOR_EACH

#define FOR_EACH (   macro,
  ... 
)    __VA_OPT__(EXPAND(FOR_EACH_HELPER(macro, __VA_ARGS__)))

Definition at line 16 of file fuzzer.hpp.

◆ FOR_EACH_AGAIN

#define FOR_EACH_AGAIN ( )    FOR_EACH_HELPER

Definition at line 18 of file fuzzer.hpp.

◆ FOR_EACH_HELPER

#define FOR_EACH_HELPER (   macro,
  a1,
  ... 
)    macro(a1) __VA_OPT__(FOR_EACH_AGAIN PARENS(macro, __VA_ARGS__))

Definition at line 17 of file fuzzer.hpp.

◆ INV_MONT_CONVERSION_LOCAL

#define INV_MONT_CONVERSION_LOCAL
Value:
if (convert_to_montgomery) { \
e = FF(value_data).from_montgomery_form(); \
} else { \
e = FF(value_data); \
}
bb::fr FF
BB_INLINE constexpr field from_montgomery_form() const noexcept

◆ MONT_CONVERSION_LOCAL

#define MONT_CONVERSION_LOCAL
Value:
if (convert_to_montgomery) { \
value_data = uint256_t(e.to_montgomery_form()); \
} else { \
value_data = uint256_t(e); \
}

◆ PARENS

#define PARENS   ()

Definition at line 7 of file fuzzer.hpp.

◆ PARSE_ALL_OPCODES

#define PARSE_ALL_OPCODES (   ...)    FOR_EACH(PARSE_OPCODE, __VA_ARGS__)

◆ PARSE_OPCODE

#define PARSE_OPCODE (   name)
Value:
if constexpr (requires { T::ArgSizes::name; }) \
if constexpr (T::ArgSizes::name != size_t(-1)) { \
if (chosen_operation == T::Instruction::OPCODE::name) { \
if (size_left < T::ArgSizes::name) { \
return fuzzingInstructions; \
} \
fuzzingInstructions.push_back( \
T::Parser::template parseInstructionArgs<T::Instruction::OPCODE::name>(pData)); \
size_left -= T::ArgSizes::name; \
pData += T::ArgSizes::name; \
continue; \
} \
}

◆ WRITE_ALL_OPCODES

#define WRITE_ALL_OPCODES (   ...)    FOR_EACH(WRITE_OPCODE_IF, __VA_ARGS__)

◆ WRITE_OPCODE_IF

#define WRITE_OPCODE_IF (   name)
Value:
if constexpr (requires { T::ArgSizes::name; }) \
if constexpr (T::ArgSizes::name != (size_t)-1) { \
if (instruction.id == T::Instruction::OPCODE::name) { \
if (size_left >= (T::ArgSizes::name + 1)) { \
T::Parser::template writeInstruction<T::Instruction::OPCODE::name>(instruction, pData); \
size_left -= (T::ArgSizes::name + 1); \
pData += (T::ArgSizes::name + 1); \
} else { \
return MaxSize - size_left; \
} \
continue; \
} \
}

Function Documentation

◆ LLVMFuzzerMutate()

size_t LLVMFuzzerMutate ( uint8_t *  Data,
size_t  Size,
size_t  MaxSize 
)

◆ read_uint256()

uint256_t read_uint256 ( const uint8_t *  data,
size_t  buffer_size = 32 
)

Definition at line 106 of file fuzzer.hpp.

◆ RunWithBuilder()

template<template< typename > class Fuzzer, typename Composer >
constexpr void RunWithBuilder ( const uint8_t *  Data,
const size_t  Size,
FastRandom VarianceRNG 
)
constexpr

Definition at line 717 of file fuzzer.hpp.

◆ RunWithBuilders()

template<template< typename > class Fuzzer, uint64_t Composers>
constexpr void RunWithBuilders ( const uint8_t *  Data,
const size_t  Size,
FastRandom VarianceRNG 
)
constexpr

Definition at line 725 of file fuzzer.hpp.