Skip to content

Commit f884280

Browse files
committed
feat(avm): gt and field_gt fuzzer
1 parent bea2115 commit f884280

File tree

2 files changed

+108
-1
lines changed

2 files changed

+108
-1
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
#include <cassert>
2+
#include <cstdint>
3+
#include <fuzzer/FuzzedDataProvider.h>
4+
5+
#include "barretenberg/avm_fuzzer/harness/mutation_helper.hpp"
6+
#include "barretenberg/common/serialize.hpp"
7+
#include "barretenberg/numeric/uint256/uint256.hpp"
8+
#include "barretenberg/vm2/common/field.hpp"
9+
#include "barretenberg/vm2/common/memory_types.hpp"
10+
#include "barretenberg/vm2/constraining/testing/check_relation.hpp"
11+
#include "barretenberg/vm2/generated/columns.hpp"
12+
#include "barretenberg/vm2/simulation/events/event_emitter.hpp"
13+
#include "barretenberg/vm2/simulation/events/field_gt_event.hpp"
14+
#include "barretenberg/vm2/simulation/events/gt_event.hpp"
15+
#include "barretenberg/vm2/simulation/events/range_check_event.hpp"
16+
#include "barretenberg/vm2/simulation/gadgets/field_gt.hpp"
17+
#include "barretenberg/vm2/simulation/gadgets/gt.hpp"
18+
#include "barretenberg/vm2/simulation/gadgets/range_check.hpp"
19+
#include "barretenberg/vm2/tooling/debugger.hpp"
20+
#include "barretenberg/vm2/tracegen/field_gt_trace.hpp"
21+
#include "barretenberg/vm2/tracegen/gt_trace.hpp"
22+
#include "barretenberg/vm2/tracegen/precomputed_trace.hpp"
23+
#include "barretenberg/vm2/tracegen/range_check_trace.hpp"
24+
#include "barretenberg/vm2/tracegen/test_trace_container.hpp"
25+
26+
using namespace bb::avm2::simulation;
27+
using namespace bb::avm2::tracegen;
28+
using namespace bb::avm2::constraining;
29+
using namespace bb::avm2::fuzzing;
30+
31+
using bb::avm2::FF;
32+
using bb::avm2::MemoryTag;
33+
using bb::avm2::MemoryValue;
34+
35+
using gt_rel = bb::avm2::gt<FF>;
36+
using ff_gt_rel = bb::avm2::ff_gt<FF>;
37+
38+
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
39+
{
40+
using bb::avm2::MemoryValue;
41+
42+
// two uint256 for memory values
43+
size_t minimum_size = 64;
44+
45+
if (size < minimum_size) {
46+
return 0;
47+
}
48+
49+
// Fuzzed Data Provider helps with extracting typed data from the raw byte stream.
50+
FuzzedDataProvider fuzzed_data(data, size);
51+
52+
MemoryValue a = read_mem_value(fuzzed_data);
53+
MemoryValue b = read_mem_value(fuzzed_data);
54+
55+
if (a.get_tag() != b.get_tag()) {
56+
// For internal use of greater than, tags should match.
57+
b = MemoryValue::from_tag_truncating(a.get_tag(), b.as_ff());
58+
}
59+
60+
// Set up gadgets and event emitters
61+
DeduplicatingEventEmitter<RangeCheckEvent> range_check_emitter;
62+
DeduplicatingEventEmitter<FieldGreaterThanEvent> field_gt_emitter;
63+
DeduplicatingEventEmitter<GreaterThanEvent> greater_than_emitter;
64+
65+
RangeCheck range_check(range_check_emitter);
66+
FieldGreaterThan field_gt(range_check, field_gt_emitter);
67+
GreaterThan greater_than(field_gt, range_check, greater_than_emitter);
68+
69+
// Execute the greater than operation
70+
bool result = false;
71+
try {
72+
result = greater_than.gt(a, b);
73+
// info("A: ", a.to_string(), ", B: ", b.to_string(), ", A > B: ", result);
74+
assert(result == (uint256_t(a.as_ff()) > uint256_t(b.as_ff())));
75+
} catch (const std::exception& e) {
76+
// If any exception occurs, we cannot proceed further.
77+
return 0;
78+
}
79+
80+
// Initialize trace container
81+
auto trace = TestTraceContainer();
82+
83+
// Process the events to build the trace
84+
RangeCheckTraceBuilder range_check_builder;
85+
FieldGreaterThanTraceBuilder field_gt_builder;
86+
GreaterThanTraceBuilder gt_builder;
87+
88+
range_check_builder.process(range_check_emitter.dump_events(), trace);
89+
field_gt_builder.process(field_gt_emitter.dump_events(), trace);
90+
gt_builder.process(greater_than_emitter.dump_events(), trace);
91+
92+
if (getenv("AVM_DEBUG") != nullptr) {
93+
info("Debugging trace:");
94+
bb::avm2::InteractiveDebugger debugger(trace);
95+
debugger.run();
96+
}
97+
98+
// Check the relation
99+
check_relation<gt_rel>(trace);
100+
check_relation<ff_gt_rel>(trace);
101+
check_all_interactions<GreaterThanTraceBuilder>(trace);
102+
check_all_interactions<FieldGreaterThanTraceBuilder>(trace);
103+
104+
return 0;
105+
}

barretenberg/cpp/src/barretenberg/avm_fuzzer/run_fuzzer.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ if [ "$COMMAND" = "list-targets" ]; then
2929
echo " alu - ALU fuzzer (harness_alu_fuzzer)"
3030
echo " bitwise - Bitwise fuzzer (harness_bitwise_fuzzer)"
3131
echo " ecc - ECC fuzzer (harness_ecc_fuzzer)"
32+
echo " gt - Greater Than fuzzer (harness_gt_fuzzer)"
3233
exit 0
3334
fi
3435

@@ -60,9 +61,10 @@ case "$FUZZER_ALIAS" in
6061
alu) FUZZER_TYPE="harness_alu_fuzzer" ;;
6162
bitwise) FUZZER_TYPE="harness_bitwise_fuzzer" ;;
6263
ecc) FUZZER_TYPE="harness_ecc_fuzzer" ;;
64+
gt) FUZZER_TYPE="harness_gt_fuzzer" ;;
6365
*)
6466
echo "Error: Invalid fuzzer type '$FUZZER_ALIAS'"
65-
echo "Valid options: 'avm', 'alu', or 'ecc'"
67+
echo "Valid options: 'avm', 'alu', 'bitwise', 'ecc' or 'gt'"
6668
exit 1
6769
;;
6870
esac

0 commit comments

Comments
 (0)