From c3a30e63dad679510f77475a88017c715d1b55d2 Mon Sep 17 00:00:00 2001 From: Juanma Date: Tue, 13 Jun 2023 12:11:32 -0300 Subject: [PATCH 01/22] Create fuzzer --- Cargo.toml | 2 +- fuzzer/Cargo.toml | 25 +++++++ fuzzer/src/main.rs | 169 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 fuzzer/Cargo.toml create mode 100644 fuzzer/src/main.rs diff --git a/Cargo.toml b/Cargo.toml index e33723d431..a923ca233a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = [".", "cairo-vm-cli", "felt", "hint_accountant", "./deps/parse-hyperlinks"] +members = [".", "cairo-vm-cli", "felt", "hint_accountant", "./deps/parse-hyperlinks", "fuzzer"] [package] name = "cairo-vm" diff --git a/fuzzer/Cargo.toml b/fuzzer/Cargo.toml new file mode 100644 index 0000000000..a3ba2b1361 --- /dev/null +++ b/fuzzer/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "fuzzer" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +arbitrary = { version = "1.3.0", features = ["derive"] } +cairo-vm-cli = { version = "0.5.2", path = "../cairo-vm-cli" } +honggfuzz = "0.5.55" +bincode = { version = "2.0.0-rc.2", tag = "v2.0.0-rc.2", git = "https://github.com/bincode-org/bincode.git" } +cairo-vm = { path = "..", version = "0.5.2" } +clap = { version = "3.2.5", features = ["derive"] } +mimalloc = { version = "0.1.29", default-features = false, optional = true } +nom = "7" +thiserror = { version = "1.0.32" } + +[dev-dependencies] +assert_matches = "1.5.0" +rstest = "0.17.0" + +[features] +default = ["with_mimalloc"] +with_mimalloc = ["cairo-vm/with_mimalloc", "mimalloc"] diff --git a/fuzzer/src/main.rs b/fuzzer/src/main.rs new file mode 100644 index 0000000000..901fadd209 --- /dev/null +++ b/fuzzer/src/main.rs @@ -0,0 +1,169 @@ +#![deny(warnings)] +#![forbid(unsafe_code)] +use bincode::enc::write::Writer; +use cairo_vm::cairo_run::{self, EncodeTraceError}; +use cairo_vm::hint_processor::builtin_hint_processor::builtin_hint_processor_definition::BuiltinHintProcessor; +use cairo_vm::vm::errors::cairo_run_errors::CairoRunError; +use cairo_vm::vm::errors::trace_errors::TraceError; +use cairo_vm::vm::errors::vm_errors::VirtualMachineError; +use std::io::{self, Write}; +use std::path::PathBuf; +use std::fmt; +use thiserror::Error; +use arbitrary::Arbitrary; +use honggfuzz::fuzz; + +#[cfg(feature = "with_mimalloc")] +use mimalloc::MiMalloc; + +#[cfg(feature = "with_mimalloc")] +#[global_allocator] +static ALLOC: MiMalloc = MiMalloc; + +#[derive(Debug, Arbitrary)] +struct Args { + program_content: Vec, + trace_file: Option, + print_output: bool, + entrypoint: String, + memory_file: Option, + layout: Layout, + proof_mode: bool, + secure_run: Option, +} + +#[derive(Debug, Arbitrary)] +enum Layout { + Plain, + Small, + Dex, + Starknet, + StarknetWithKeccak, + RecursiveLargeOutput, + AllCairo, + AllSolidity, + Dynamic +} + +impl fmt::Display for Layout { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Layout::Plain => write!(f, "plain"), + Layout::Small => write!(f, "small"), + Layout::Dex => write!(f, "dex"), + Layout::Starknet => write!(f, "starknet"), + Layout::StarknetWithKeccak => write!(f, "starknet_with_keccak"), + Layout::RecursiveLargeOutput => write!(f, "recursive_large_output"), + Layout::AllCairo => write!(f, "all_cairo"), + Layout::AllSolidity => write!(f, "all_solidity"), + Layout::Dynamic => write!(f, "dynamic"), + } + } +} + +#[derive(Debug, Error)] +enum Error { + #[error("Invalid arguments")] + Cli(#[from] clap::Error), + #[error("Failed to interact with the file system")] + IO(#[from] std::io::Error), + #[error("The cairo program execution failed")] + Runner(#[from] CairoRunError), + #[error(transparent)] + EncodeTrace(#[from] EncodeTraceError), + #[error(transparent)] + VirtualMachine(#[from] VirtualMachineError), + #[error(transparent)] + Trace(#[from] TraceError), +} + +struct FileWriter { + buf_writer: io::BufWriter, + bytes_written: usize, +} + +impl Writer for FileWriter { + fn write(&mut self, bytes: &[u8]) -> Result<(), bincode::error::EncodeError> { + self.buf_writer + .write_all(bytes) + .map_err(|e| bincode::error::EncodeError::Io { + inner: e, + index: self.bytes_written, + })?; + + self.bytes_written += bytes.len(); + + Ok(()) + } +} + +impl FileWriter { + fn new(buf_writer: io::BufWriter) -> Self { + Self { + buf_writer, + bytes_written: 0, + } + } + + fn flush(&mut self) -> io::Result<()> { + self.buf_writer.flush() + } +} + +fn run(args: Args) -> Result<(), Error> { + let trace_enabled = args.trace_file.is_some(); + let mut hint_executor = BuiltinHintProcessor::new_empty(); + let cairo_run_config = cairo_run::CairoRunConfig { + entrypoint: &args.entrypoint, + trace_enabled, + relocate_mem: args.memory_file.is_some(), + layout: &args.layout.to_string(), + proof_mode: args.proof_mode, + secure_run: args.secure_run, + }; + + let (cairo_runner, mut vm) = + match cairo_run::cairo_run(&args.program_content, &cairo_run_config, &mut hint_executor) { + Ok(runner) => runner, + Err(error) => { + eprintln!("{error}"); + return Err(Error::Runner(error)); + } + }; + + if args.print_output { + let mut output_buffer = "Program Output:\n".to_string(); + vm.write_output(&mut output_buffer)?; + print!("{output_buffer}"); + } + + if let Some(trace_path) = args.trace_file { + let relocated_trace = vm.get_relocated_trace()?; + + let trace_file = std::fs::File::create(trace_path)?; + let mut trace_writer = + FileWriter::new(io::BufWriter::with_capacity(3 * 1024 * 1024, trace_file)); + + cairo_run::write_encoded_trace(relocated_trace, &mut trace_writer)?; + trace_writer.flush()?; + } + + if let Some(memory_path) = args.memory_file { + let memory_file = std::fs::File::create(memory_path)?; + let mut memory_writer = + FileWriter::new(io::BufWriter::with_capacity(5 * 1024 * 1024, memory_file)); + + cairo_run::write_encoded_memory(&cairo_runner.relocated_memory, &mut memory_writer)?; + memory_writer.flush()?; + } + + Ok(()) +} + +fn main() { + loop { + fuzz!(|args: Args| { + let _ = run(args); + }); + } +} From b04e55c7587358dadaf2ea29312684333212f19f Mon Sep 17 00:00:00 2001 From: Juanma Date: Tue, 13 Jun 2023 12:17:54 -0300 Subject: [PATCH 02/22] Remove cli --- fuzzer/Cargo.toml | 2 -- fuzzer/src/main.rs | 10 ++++------ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/fuzzer/Cargo.toml b/fuzzer/Cargo.toml index a3ba2b1361..a864a2d791 100644 --- a/fuzzer/Cargo.toml +++ b/fuzzer/Cargo.toml @@ -7,11 +7,9 @@ edition = "2021" [dependencies] arbitrary = { version = "1.3.0", features = ["derive"] } -cairo-vm-cli = { version = "0.5.2", path = "../cairo-vm-cli" } honggfuzz = "0.5.55" bincode = { version = "2.0.0-rc.2", tag = "v2.0.0-rc.2", git = "https://github.com/bincode-org/bincode.git" } cairo-vm = { path = "..", version = "0.5.2" } -clap = { version = "3.2.5", features = ["derive"] } mimalloc = { version = "0.1.29", default-features = false, optional = true } nom = "7" thiserror = { version = "1.0.32" } diff --git a/fuzzer/src/main.rs b/fuzzer/src/main.rs index 901fadd209..bab29ab37e 100644 --- a/fuzzer/src/main.rs +++ b/fuzzer/src/main.rs @@ -1,17 +1,17 @@ #![deny(warnings)] #![forbid(unsafe_code)] +use arbitrary::Arbitrary; use bincode::enc::write::Writer; use cairo_vm::cairo_run::{self, EncodeTraceError}; use cairo_vm::hint_processor::builtin_hint_processor::builtin_hint_processor_definition::BuiltinHintProcessor; use cairo_vm::vm::errors::cairo_run_errors::CairoRunError; use cairo_vm::vm::errors::trace_errors::TraceError; use cairo_vm::vm::errors::vm_errors::VirtualMachineError; +use honggfuzz::fuzz; +use std::fmt; use std::io::{self, Write}; use std::path::PathBuf; -use std::fmt; use thiserror::Error; -use arbitrary::Arbitrary; -use honggfuzz::fuzz; #[cfg(feature = "with_mimalloc")] use mimalloc::MiMalloc; @@ -42,7 +42,7 @@ enum Layout { RecursiveLargeOutput, AllCairo, AllSolidity, - Dynamic + Dynamic, } impl fmt::Display for Layout { @@ -63,8 +63,6 @@ impl fmt::Display for Layout { #[derive(Debug, Error)] enum Error { - #[error("Invalid arguments")] - Cli(#[from] clap::Error), #[error("Failed to interact with the file system")] IO(#[from] std::io::Error), #[error("The cairo program execution failed")] From 11eaf85fe8c9a71422f40e6fcecdfde0b9128ef5 Mon Sep 17 00:00:00 2001 From: Juanma Date: Wed, 14 Jun 2023 15:39:38 -0300 Subject: [PATCH 03/22] Update fuzzer --- fuzzer/json.dict | 61 ++++++++++++++++++++++++++++++++++++++++++++++ fuzzer/src/main.rs | 2 -- 2 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 fuzzer/json.dict diff --git a/fuzzer/json.dict b/fuzzer/json.dict new file mode 100644 index 0000000000..d2e5252576 --- /dev/null +++ b/fuzzer/json.dict @@ -0,0 +1,61 @@ +# +# AFL dictionary for JSON +# ----------------------- +# +# Just the very basics. +# +# Inspired by a dictionary by Jakub Wilk +# + +"0" +",0" +":0" +"0:" +"-1.2e+3" + +"true" +"false" +"null" + +"\"\"" +",\"\"" +":\"\"" +"\"\":" + +"{}" +",{}" +":{}" +"{\"\":0}" +"{{}}" + +"[]" +",[]" +":[]" +"[0]" +"[[]]" + +"''" +"\\" +"\\b" +"\\f" +"\\n" +"\\r" +"\\t" +"\\u0000" +"\\x00" +"\\0" +"\\uD800\\uDC00" +"\\uDBFF\\uDFFF" + +"\"\":0" +"//" +"/**/" + +"$ref" +"type" +"coordinates" +"@context" +"@id" + +"," +":" \ No newline at end of file diff --git a/fuzzer/src/main.rs b/fuzzer/src/main.rs index bab29ab37e..00366cd5d1 100644 --- a/fuzzer/src/main.rs +++ b/fuzzer/src/main.rs @@ -1,5 +1,3 @@ -#![deny(warnings)] -#![forbid(unsafe_code)] use arbitrary::Arbitrary; use bincode::enc::write::Writer; use cairo_vm::cairo_run::{self, EncodeTraceError}; From dcd5e96ae77532f530c6c292531c198dd42d545c Mon Sep 17 00:00:00 2001 From: Juanma Date: Wed, 14 Jun 2023 15:56:21 -0300 Subject: [PATCH 04/22] Change fuzzer name --- fuzzer/Cargo.toml | 4 ++++ fuzzer/README.md | 3 +++ fuzzer/src/{main.rs => fuzz_json.rs} | 0 3 files changed, 7 insertions(+) create mode 100644 fuzzer/README.md rename fuzzer/src/{main.rs => fuzz_json.rs} (100%) diff --git a/fuzzer/Cargo.toml b/fuzzer/Cargo.toml index a864a2d791..eb337dfd56 100644 --- a/fuzzer/Cargo.toml +++ b/fuzzer/Cargo.toml @@ -21,3 +21,7 @@ rstest = "0.17.0" [features] default = ["with_mimalloc"] with_mimalloc = ["cairo-vm/with_mimalloc", "mimalloc"] + +[[bin]] +name = "fuzz_json" +path = "src/fuzz_json.rs" diff --git a/fuzzer/README.md b/fuzzer/README.md new file mode 100644 index 0000000000..a2b1be9a40 --- /dev/null +++ b/fuzzer/README.md @@ -0,0 +1,3 @@ +## fuzz_json +This fuzzer creates a json file directly from bytes. +`HFUZZ_RUN_ARGS="--dict=json.dict" cargo hfuzz run fuzz_json` diff --git a/fuzzer/src/main.rs b/fuzzer/src/fuzz_json.rs similarity index 100% rename from fuzzer/src/main.rs rename to fuzzer/src/fuzz_json.rs From fd2da3da43cc3963ea19bfb4e79b1efd641392ca Mon Sep 17 00:00:00 2001 From: Juanma Date: Thu, 29 Jun 2023 18:02:07 -0300 Subject: [PATCH 05/22] Add arbitrary --- Cargo.toml | 5 ++++- felt/Cargo.toml | 2 ++ felt/src/bigint_felt.rs | 4 ++++ felt/src/lib_bigint_felt.rs | 4 ++++ fuzzer/Cargo.toml | 2 +- vm/Cargo.toml | 4 ++++ .../hint_processor/hint_processor_definition.rs | 4 ++++ vm/src/serde/deserialize_program.rs | 15 +++++++++++++++ vm/src/types/instruction.rs | 4 ++++ vm/src/types/program.rs | 5 +++++ vm/src/types/relocatable.rs | 5 +++++ 11 files changed, 52 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 63d369949b..e76f1e4fdd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ readme = "README.md" [workspace.dependencies] felt = { package = "cairo-felt", path = "./felt", version = "0.8.0", default-features = false, features = [ - "alloc", + "alloc" ] } cairo-vm = { path = "./vm", version = "0.8.0", default-features = false } mimalloc = { version = "0.1.29", default-features = false } @@ -66,5 +66,8 @@ cairo-lang-casm = { version = "2.0.0-rc5", default-features = false } ark-ff = { version = "0.4.0-alpha.7", default-features = false } ark-std = { version = "0.3.0", default-features = false } +# For fuzzing +arbitrary = { version = "1.3.0", features = ["derive"] } + [profile.release] lto = "fat" diff --git a/felt/Cargo.toml b/felt/Cargo.toml index ab8425fdac..d95c54f94e 100644 --- a/felt/Cargo.toml +++ b/felt/Cargo.toml @@ -12,6 +12,7 @@ default = ["std"] std = [] alloc = [] lambdaworks-felt = ["dep:lambdaworks-math"] +fuzzing = ["arbitrary", "num-bigint/arbitrary"] [dependencies] num-integer = { version = "0.1.45", default-features = false } @@ -22,6 +23,7 @@ lazy_static = { version = "1.4.0", default-features = false, features = [ ] } serde = { version = "1.0", features = ["derive"], default-features = false } lambdaworks-math = { version = "0.1.2", default-features = false, optional = true } +arbitrary = { version = "1.3.0", features = ["derive"], optional = true } [dev-dependencies] proptest = "1.1.0" diff --git a/felt/src/bigint_felt.rs b/felt/src/bigint_felt.rs index 2b036dfa12..dfb12b9f11 100644 --- a/felt/src/bigint_felt.rs +++ b/felt/src/bigint_felt.rs @@ -14,6 +14,9 @@ use core::{ use crate::{lib_bigint_felt::FeltOps, ParseFeltError}; +#[cfg(feature = "fuzzing")] +use arbitrary::Arbitrary; + pub const FIELD_HIGH: u128 = (1 << 123) + (17 << 64); // this is equal to 10633823966279327296825105735305134080 pub const FIELD_LOW: u128 = 1; use lazy_static::lazy_static; @@ -31,6 +34,7 @@ lazy_static! { .expect("Conversion BigUint -> BigInt can't fail"); } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Eq, Hash, PartialEq, PartialOrd, Ord, Clone, Deserialize, Default, Serialize)] pub(crate) struct FeltBigInt { val: BigUint, diff --git a/felt/src/lib_bigint_felt.rs b/felt/src/lib_bigint_felt.rs index f505cb4e04..5f72294da7 100644 --- a/felt/src/lib_bigint_felt.rs +++ b/felt/src/lib_bigint_felt.rs @@ -19,6 +19,9 @@ use core::{ #[cfg(all(not(feature = "std"), feature = "alloc"))] use alloc::{string::String, vec::Vec}; +#[cfg(feature = "fuzzing")] +use arbitrary::Arbitrary; + pub(crate) trait FeltOps { fn new>>(value: T) -> Self; @@ -64,6 +67,7 @@ macro_rules! felt_str { }; } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Eq, Hash, PartialEq, PartialOrd, Ord, Clone, Deserialize, Default, Serialize)] pub struct Felt252 { pub(crate) value: FeltBigInt, diff --git a/fuzzer/Cargo.toml b/fuzzer/Cargo.toml index eb337dfd56..3cf989d387 100644 --- a/fuzzer/Cargo.toml +++ b/fuzzer/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" arbitrary = { version = "1.3.0", features = ["derive"] } honggfuzz = "0.5.55" bincode = { version = "2.0.0-rc.2", tag = "v2.0.0-rc.2", git = "https://github.com/bincode-org/bincode.git" } -cairo-vm = { path = "..", version = "0.5.2" } +cairo-vm = { path = "..", version = "0.5.2", features = ["fuzzing"] } mimalloc = { version = "0.1.29", default-features = false, optional = true } nom = "7" thiserror = { version = "1.0.32" } diff --git a/vm/Cargo.toml b/vm/Cargo.toml index db442cbeaf..2a2ed75ecf 100644 --- a/vm/Cargo.toml +++ b/vm/Cargo.toml @@ -24,6 +24,7 @@ cairo-1-hints = ["dep:cairo-lang-starknet", "dep:cairo-lang-casm", "dep:ark-ff", lambdaworks-felt = [ "felt/lambdaworks-felt" ] +fuzzing = ["arbitrary"] # Note that these features are not retro-compatible with the cairo Python VM. test_utils = [ @@ -69,6 +70,9 @@ cairo-lang-casm = { workspace = true, optional = true } ark-ff = { workspace = true, optional = true } ark-std = { workspace = true, optional = true } +# Enable arbitrary when fuzzing +arbitrary = { workspace = true, features = ["derive"], optional = true } + [dev-dependencies] assert_matches = "1.5.0" rstest = { version = "0.17.0", default-features = false } diff --git a/vm/src/hint_processor/hint_processor_definition.rs b/vm/src/hint_processor/hint_processor_definition.rs index 966a0f9f5f..5d002d555e 100644 --- a/vm/src/hint_processor/hint_processor_definition.rs +++ b/vm/src/hint_processor/hint_processor_definition.rs @@ -14,6 +14,9 @@ use crate::vm::vm_core::VirtualMachine; use super::builtin_hint_processor::builtin_hint_processor_definition::HintProcessorData; use felt::Felt252; +#[cfg(feature = "fuzzing")] +use arbitrary::Arbitrary; + pub trait HintProcessorLogic { //Executes the hint which's data is provided by a dynamic structure previously created by compile_hint fn execute_hint( @@ -75,6 +78,7 @@ fn get_ids_data( Ok(ids_data) } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Debug, PartialEq, Eq, Clone)] pub struct HintReference { pub offset1: OffsetValue, diff --git a/vm/src/serde/deserialize_program.rs b/vm/src/serde/deserialize_program.rs index 3c4155d9b5..1303a64b49 100644 --- a/vm/src/serde/deserialize_program.rs +++ b/vm/src/serde/deserialize_program.rs @@ -21,7 +21,11 @@ use num_traits::{Num, Pow}; use serde::{de, de::MapAccess, de::SeqAccess, Deserialize, Deserializer, Serialize}; use serde_json::Number; +#[cfg(feature = "fuzzing")] +use arbitrary::Arbitrary; + // This enum is used to deserialize program builtins into &str and catch non-valid names +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, PartialEq, Copy, Clone, Eq, Hash)] #[allow(non_camel_case_types)] pub enum BuiltinName { @@ -65,6 +69,7 @@ pub struct ProgramJson { pub debug_info: Option, } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] pub struct HintParams { pub code: String, @@ -72,6 +77,7 @@ pub struct HintParams { pub flow_tracking_data: FlowTrackingData, } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] pub struct FlowTrackingData { pub ap_tracking: ApTracking, @@ -79,6 +85,7 @@ pub struct FlowTrackingData { pub reference_ids: HashMap, } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] pub struct ApTracking { pub group: usize, @@ -100,6 +107,7 @@ impl Default for ApTracking { } } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub struct Identifier { pub pc: Option, @@ -114,12 +122,14 @@ pub struct Identifier { pub cairo_type: Option, } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct Member { pub cairo_type: String, pub offset: usize, } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct Attribute { pub name: String, @@ -129,6 +139,7 @@ pub struct Attribute { pub flow_tracking_data: Option, } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] pub struct Location { pub end_line: u32, @@ -144,17 +155,20 @@ pub struct DebugInfo { instruction_locations: HashMap, } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub struct InstructionLocation { pub inst: Location, pub hints: Vec, } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] pub struct InputFile { pub filename: String, } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub struct HintLocation { pub location: Location, @@ -211,6 +225,7 @@ pub struct Reference { pub value_address: ValueAddress, } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub enum OffsetValue { Immediate(Felt252), diff --git a/vm/src/types/instruction.rs b/vm/src/types/instruction.rs index fff2933c26..2714d55672 100644 --- a/vm/src/types/instruction.rs +++ b/vm/src/types/instruction.rs @@ -4,6 +4,10 @@ use serde::{Deserialize, Serialize}; use crate::vm::decoding::decoder::decode_instruction; +#[cfg(feature = "fuzzing")] +use arbitrary::Arbitrary; + +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Eq)] pub enum Register { AP, diff --git a/vm/src/types/program.rs b/vm/src/types/program.rs index b353acdc97..ceaceec352 100644 --- a/vm/src/types/program.rs +++ b/vm/src/types/program.rs @@ -19,6 +19,9 @@ use felt::{Felt252, PRIME_STR}; #[cfg(feature = "std")] use std::path::Path; +#[cfg(feature = "fuzzing")] +use arbitrary::Arbitrary; + // NOTE: `Program` has been split in two containing some data that will be deep-copied // and some that will be allocated on the heap inside an `Arc<_>`. // This is because it has been reported that cloning the whole structure when creating @@ -40,6 +43,7 @@ use std::path::Path; // exceptional circumstances, such as when reconstructing a backtrace on execution // failures. // Fields in `Program` (other than `SharedProgramData` itself) are used by the main logic. +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Clone, Default, Debug, PartialEq, Eq)] pub(crate) struct SharedProgramData { pub(crate) data: Vec, @@ -54,6 +58,7 @@ pub(crate) struct SharedProgramData { pub(crate) reference_manager: Vec, } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Clone, Debug, PartialEq, Eq)] pub struct Program { pub(crate) shared_program_data: Arc, diff --git a/vm/src/types/relocatable.rs b/vm/src/types/relocatable.rs index 324a48445b..4abc4208cd 100644 --- a/vm/src/types/relocatable.rs +++ b/vm/src/types/relocatable.rs @@ -11,12 +11,17 @@ use felt::Felt252; use num_traits::{ToPrimitive, Zero}; use serde::{Deserialize, Serialize}; +#[cfg(feature = "fuzzing")] +use arbitrary::Arbitrary; + +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Eq, Ord, Hash, PartialEq, PartialOrd, Clone, Copy, Debug, Serialize, Deserialize)] pub struct Relocatable { pub segment_index: isize, pub offset: usize, } +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] #[derive(Eq, Ord, Hash, PartialEq, PartialOrd, Clone, Debug, Serialize, Deserialize)] pub enum MaybeRelocatable { RelocatableValue(Relocatable), From d039d303c91f2c91c8760bcfcc8dbda064ce829d Mon Sep 17 00:00:00 2001 From: Juanma Date: Fri, 30 Jun 2023 10:01:30 -0300 Subject: [PATCH 06/22] Add fuzzer using arbitrary --- fuzzer/Cargo.toml | 9 ++++++++- vm/Cargo.toml | 2 +- vm/src/cairo_run.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/fuzzer/Cargo.toml b/fuzzer/Cargo.toml index 3cf989d387..61a2b202fd 100644 --- a/fuzzer/Cargo.toml +++ b/fuzzer/Cargo.toml @@ -5,11 +5,14 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[workspace] +members = ["."] + [dependencies] arbitrary = { version = "1.3.0", features = ["derive"] } honggfuzz = "0.5.55" bincode = { version = "2.0.0-rc.2", tag = "v2.0.0-rc.2", git = "https://github.com/bincode-org/bincode.git" } -cairo-vm = { path = "..", version = "0.5.2", features = ["fuzzing"] } +cairo-vm = { path = "../vm", features = ["fuzzing"] } mimalloc = { version = "0.1.29", default-features = false, optional = true } nom = "7" thiserror = { version = "1.0.32" } @@ -25,3 +28,7 @@ with_mimalloc = ["cairo-vm/with_mimalloc", "mimalloc"] [[bin]] name = "fuzz_json" path = "src/fuzz_json.rs" + +[[bin]] +name = "fuzz_program" +path = "src/fuzz_program.rs" diff --git a/vm/Cargo.toml b/vm/Cargo.toml index 2a2ed75ecf..e9d281c7c8 100644 --- a/vm/Cargo.toml +++ b/vm/Cargo.toml @@ -24,7 +24,7 @@ cairo-1-hints = ["dep:cairo-lang-starknet", "dep:cairo-lang-casm", "dep:ark-ff", lambdaworks-felt = [ "felt/lambdaworks-felt" ] -fuzzing = ["arbitrary"] +fuzzing = ["arbitrary", "felt/fuzzing"] # Note that these features are not retro-compatible with the cairo Python VM. test_utils = [ diff --git a/vm/src/cairo_run.rs b/vm/src/cairo_run.rs index f1a6ca0bc2..496bf0c9ad 100644 --- a/vm/src/cairo_run.rs +++ b/vm/src/cairo_run.rs @@ -14,6 +14,10 @@ use felt::Felt252; use thiserror_no_std::Error; +#[cfg(feature = "fuzzing")] +use arbitrary::Arbitrary; + +#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] pub struct CairoRunConfig<'a> { pub entrypoint: &'a str, pub trace_enabled: bool, @@ -75,6 +79,44 @@ pub fn cairo_run( Ok((cairo_runner, vm)) } +#[cfg(feature = "fuzzing")] +pub fn cairo_run_parsed_program( + program: Program, + cairo_run_config: &CairoRunConfig, + hint_executor: &mut dyn HintProcessor, +) -> Result<(CairoRunner, VirtualMachine), CairoRunError> { + let secure_run = cairo_run_config + .secure_run + .unwrap_or(!cairo_run_config.proof_mode); + + let mut cairo_runner = CairoRunner::new( + &program, + cairo_run_config.layout, + cairo_run_config.proof_mode, + )?; + + let mut vm = VirtualMachine::new(cairo_run_config.trace_enabled); + let end = cairo_runner.initialize(&mut vm)?; + // check step calculation + + cairo_runner + .run_until_pc(end, &mut vm, hint_executor) + .map_err(|err| VmException::from_vm_error(&cairo_runner, &vm, err))?; + cairo_runner.end_run(false, false, &mut vm, hint_executor)?; + + vm.verify_auto_deductions()?; + cairo_runner.read_return_values(&mut vm)?; + if cairo_run_config.proof_mode { + cairo_runner.finalize_segments(&mut vm)?; + } + if secure_run { + verify_secure_runner(&cairo_runner, true, None, &mut vm)?; + } + cairo_runner.relocate(&mut vm, cairo_run_config.relocate_mem)?; + + Ok((cairo_runner, vm)) +} + #[derive(Debug, Error)] #[error("Failed to encode trace at position {0}, serialize error: {1}")] pub struct EncodeTraceError(usize, bincode::error::EncodeError); From 6f9a8d78ee5c80ce71f48f32051644ad692c2d81 Mon Sep 17 00:00:00 2001 From: Juanma Date: Fri, 30 Jun 2023 10:06:32 -0300 Subject: [PATCH 07/22] Add fuzzer --- fuzzer/src/fuzz_program.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 fuzzer/src/fuzz_program.rs diff --git a/fuzzer/src/fuzz_program.rs b/fuzzer/src/fuzz_program.rs new file mode 100644 index 0000000000..c94b34ce20 --- /dev/null +++ b/fuzzer/src/fuzz_program.rs @@ -0,0 +1,15 @@ +use honggfuzz::fuzz; +use cairo_vm::{ + cairo_run::{CairoRunConfig, cairo_run_parsed_program}, + types::program::Program, + hint_processor::builtin_hint_processor::builtin_hint_processor_definition::BuiltinHintProcessor +}; + +fn main() { + loop { + fuzz!(|data: (CairoRunConfig, Program)| { + let (cairo_config, program) = data; + let _ = cairo_run_parsed_program(program, &cairo_config, &mut BuiltinHintProcessor::new_empty()); + }); + } +} From 65a7e3318737039d1182d03af42d29defe0d3628 Mon Sep 17 00:00:00 2001 From: Juanma Date: Fri, 30 Jun 2023 10:59:14 -0300 Subject: [PATCH 08/22] Use run until steps --- fuzzer/src/fuzz_program.rs | 4 +++- vm/src/cairo_run.rs | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/fuzzer/src/fuzz_program.rs b/fuzzer/src/fuzz_program.rs index c94b34ce20..a72953c725 100644 --- a/fuzzer/src/fuzz_program.rs +++ b/fuzzer/src/fuzz_program.rs @@ -5,11 +5,13 @@ use cairo_vm::{ hint_processor::builtin_hint_processor::builtin_hint_processor_definition::BuiltinHintProcessor }; +const STEPS_LIMIT: usize = 1000000; fn main() { loop { fuzz!(|data: (CairoRunConfig, Program)| { let (cairo_config, program) = data; - let _ = cairo_run_parsed_program(program, &cairo_config, &mut BuiltinHintProcessor::new_empty()); + let _ = cairo_run_parsed_program(program.clone(), &CairoRunConfig::default(), &mut BuiltinHintProcessor::new_empty(), STEPS_LIMIT); + let _ = cairo_run_parsed_program(program, &cairo_config, &mut BuiltinHintProcessor::new_empty(), STEPS_LIMIT); }); } } diff --git a/vm/src/cairo_run.rs b/vm/src/cairo_run.rs index 496bf0c9ad..c5296cc78e 100644 --- a/vm/src/cairo_run.rs +++ b/vm/src/cairo_run.rs @@ -84,6 +84,7 @@ pub fn cairo_run_parsed_program( program: Program, cairo_run_config: &CairoRunConfig, hint_executor: &mut dyn HintProcessor, + steps_limit: usize, ) -> Result<(CairoRunner, VirtualMachine), CairoRunError> { let secure_run = cairo_run_config .secure_run @@ -100,8 +101,11 @@ pub fn cairo_run_parsed_program( // check step calculation cairo_runner - .run_until_pc(end, &mut vm, hint_executor) + .run_until_steps(steps_limit, &mut vm, hint_executor) .map_err(|err| VmException::from_vm_error(&cairo_runner, &vm, err))?; + //cairo_runner + // .run_until_pc(end, &mut vm, hint_executor) + // .map_err(|err| VmException::from_vm_error(&cairo_runner, &vm, err))?; cairo_runner.end_run(false, false, &mut vm, hint_executor)?; vm.verify_auto_deductions()?; From c0b846f4ca7ce129d3f24d14e278fe1b9c881b64 Mon Sep 17 00:00:00 2001 From: Juanma Date: Fri, 30 Jun 2023 11:00:56 -0300 Subject: [PATCH 09/22] Remove end --- vm/src/cairo_run.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/vm/src/cairo_run.rs b/vm/src/cairo_run.rs index c5296cc78e..d491db04a2 100644 --- a/vm/src/cairo_run.rs +++ b/vm/src/cairo_run.rs @@ -97,15 +97,10 @@ pub fn cairo_run_parsed_program( )?; let mut vm = VirtualMachine::new(cairo_run_config.trace_enabled); - let end = cairo_runner.initialize(&mut vm)?; - // check step calculation cairo_runner .run_until_steps(steps_limit, &mut vm, hint_executor) .map_err(|err| VmException::from_vm_error(&cairo_runner, &vm, err))?; - //cairo_runner - // .run_until_pc(end, &mut vm, hint_executor) - // .map_err(|err| VmException::from_vm_error(&cairo_runner, &vm, err))?; cairo_runner.end_run(false, false, &mut vm, hint_executor)?; vm.verify_auto_deductions()?; From fe3b75e444176c810378cff76ca5de775ea01992 Mon Sep 17 00:00:00 2001 From: Juanma Date: Fri, 7 Jul 2023 17:06:59 -0300 Subject: [PATCH 10/22] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2571888305..31209df3c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,8 @@ #### [0.8.1] - 2023-6-29 +* feat: add `arbitrary` feature to enable arbitrary derive in Program + * chore: change mentions of *cairo-rs-py* to *cairo-vm-py* [#1296](https://github.com/lambdaclass/cairo-vm/pull/1296) * rename github repo from https://github.com/lambdaclass/cairo-rs to https://github.com/lambdaclass/cairo-vm [#1289](https://github.com/lambdaclass/cairo-vm/pull/1289) From 9b92c7806ebe00ccd87eff8dc8d597523d97deee Mon Sep 17 00:00:00 2001 From: Juan-M-V <102986292+Juan-M-V@users.noreply.github.com> Date: Fri, 7 Jul 2023 17:18:22 -0300 Subject: [PATCH 11/22] Update CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31209df3c1..79f573c34b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ #### Upcoming Changes +* feat: add `arbitrary` feature to enable arbitrary derive in Program + * feat: add dependency installation script `install.sh` [#1298](https://github.com/lambdaclass/cairo-vm/pull/1298) * fix: specify resolver version 2 in the virtual workspace's manifest [#1311](https://github.com/lambdaclass/cairo-vm/pull/1311) @@ -20,8 +22,6 @@ #### [0.8.1] - 2023-6-29 -* feat: add `arbitrary` feature to enable arbitrary derive in Program - * chore: change mentions of *cairo-rs-py* to *cairo-vm-py* [#1296](https://github.com/lambdaclass/cairo-vm/pull/1296) * rename github repo from https://github.com/lambdaclass/cairo-rs to https://github.com/lambdaclass/cairo-vm [#1289](https://github.com/lambdaclass/cairo-vm/pull/1289) From 5dc2babae2cca945c7ee12e9dc330a956d1a8f69 Mon Sep 17 00:00:00 2001 From: Juan-M-V <102986292+Juan-M-V@users.noreply.github.com> Date: Fri, 7 Jul 2023 17:24:55 -0300 Subject: [PATCH 12/22] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79f573c34b..76fe210361 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ #### Upcoming Changes -* feat: add `arbitrary` feature to enable arbitrary derive in Program +* feat: add `arbitrary` feature to enable arbitrary derive in `Program` and `CairoRunConfig` * feat: add dependency installation script `install.sh` [#1298](https://github.com/lambdaclass/cairo-vm/pull/1298) From 51e5ff5405ae1e520bc13b5057efc8c1df9c30ad Mon Sep 17 00:00:00 2001 From: Juanma Date: Fri, 7 Jul 2023 17:43:08 -0300 Subject: [PATCH 13/22] Change macro cfg --- Cargo.lock | 23 ++++++++++++++++ felt/src/bigint_felt.rs | 4 +-- felt/src/lib_bigint_felt.rs | 4 +-- vm/src/cairo_run.rs | 6 ++--- .../hint_processor_definition.rs | 4 +-- vm/src/serde/deserialize_program.rs | 26 +++++++++---------- vm/src/types/instruction.rs | 4 +-- vm/src/types/program.rs | 6 ++--- vm/src/types/relocatable.rs | 6 ++--- 9 files changed, 53 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 26bce6250b..2e313ead00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -100,6 +100,15 @@ version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" +[[package]] +name = "arbitrary" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "ark-ff" version = "0.4.2" @@ -311,6 +320,7 @@ dependencies = [ name = "cairo-felt" version = "0.8.1" dependencies = [ + "arbitrary", "lambdaworks-math", "lazy_static", "num-bigint", @@ -725,6 +735,7 @@ name = "cairo-vm" version = "0.8.1" dependencies = [ "anyhow", + "arbitrary", "ark-ff", "ark-std", "assert_matches", @@ -1032,6 +1043,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_arbitrary" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.23", +] + [[package]] name = "diff" version = "0.1.13" @@ -1704,6 +1726,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" dependencies = [ + "arbitrary", "autocfg", "num-integer", "num-traits 0.2.15", diff --git a/felt/src/bigint_felt.rs b/felt/src/bigint_felt.rs index dfb12b9f11..ead7592a7a 100644 --- a/felt/src/bigint_felt.rs +++ b/felt/src/bigint_felt.rs @@ -14,7 +14,7 @@ use core::{ use crate::{lib_bigint_felt::FeltOps, ParseFeltError}; -#[cfg(feature = "fuzzing")] +#[cfg(feature = "arbitrary")] use arbitrary::Arbitrary; pub const FIELD_HIGH: u128 = (1 << 123) + (17 << 64); // this is equal to 10633823966279327296825105735305134080 @@ -34,7 +34,7 @@ lazy_static! { .expect("Conversion BigUint -> BigInt can't fail"); } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Eq, Hash, PartialEq, PartialOrd, Ord, Clone, Deserialize, Default, Serialize)] pub(crate) struct FeltBigInt { val: BigUint, diff --git a/felt/src/lib_bigint_felt.rs b/felt/src/lib_bigint_felt.rs index 93025b56af..fccb9f6155 100644 --- a/felt/src/lib_bigint_felt.rs +++ b/felt/src/lib_bigint_felt.rs @@ -19,7 +19,7 @@ use core::{ #[cfg(all(not(feature = "std"), feature = "alloc"))] use alloc::{string::String, vec::Vec}; -#[cfg(feature = "fuzzing")] +#[cfg(feature = "arbitrary")] use arbitrary::Arbitrary; pub(crate) trait FeltOps { @@ -67,7 +67,7 @@ macro_rules! felt_str { }; } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Eq, Hash, PartialEq, PartialOrd, Ord, Clone, Deserialize, Default, Serialize)] pub struct Felt252 { pub(crate) value: FeltBigInt, diff --git a/vm/src/cairo_run.rs b/vm/src/cairo_run.rs index d491db04a2..c47a50138b 100644 --- a/vm/src/cairo_run.rs +++ b/vm/src/cairo_run.rs @@ -14,10 +14,10 @@ use felt::Felt252; use thiserror_no_std::Error; -#[cfg(feature = "fuzzing")] +#[cfg(feature = "arbitrary")] use arbitrary::Arbitrary; -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub struct CairoRunConfig<'a> { pub entrypoint: &'a str, pub trace_enabled: bool, @@ -79,7 +79,7 @@ pub fn cairo_run( Ok((cairo_runner, vm)) } -#[cfg(feature = "fuzzing")] +#[cfg(feature = "arbitrary")] pub fn cairo_run_parsed_program( program: Program, cairo_run_config: &CairoRunConfig, diff --git a/vm/src/hint_processor/hint_processor_definition.rs b/vm/src/hint_processor/hint_processor_definition.rs index 5d002d555e..6e2912af3d 100644 --- a/vm/src/hint_processor/hint_processor_definition.rs +++ b/vm/src/hint_processor/hint_processor_definition.rs @@ -14,7 +14,7 @@ use crate::vm::vm_core::VirtualMachine; use super::builtin_hint_processor::builtin_hint_processor_definition::HintProcessorData; use felt::Felt252; -#[cfg(feature = "fuzzing")] +#[cfg(feature = "arbitrary")] use arbitrary::Arbitrary; pub trait HintProcessorLogic { @@ -78,7 +78,7 @@ fn get_ids_data( Ok(ids_data) } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Debug, PartialEq, Eq, Clone)] pub struct HintReference { pub offset1: OffsetValue, diff --git a/vm/src/serde/deserialize_program.rs b/vm/src/serde/deserialize_program.rs index 1303a64b49..fa9e084ed9 100644 --- a/vm/src/serde/deserialize_program.rs +++ b/vm/src/serde/deserialize_program.rs @@ -21,11 +21,11 @@ use num_traits::{Num, Pow}; use serde::{de, de::MapAccess, de::SeqAccess, Deserialize, Deserializer, Serialize}; use serde_json::Number; -#[cfg(feature = "fuzzing")] +#[cfg(feature = "arbitrary")] use arbitrary::Arbitrary; // This enum is used to deserialize program builtins into &str and catch non-valid names -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, PartialEq, Copy, Clone, Eq, Hash)] #[allow(non_camel_case_types)] pub enum BuiltinName { @@ -69,7 +69,7 @@ pub struct ProgramJson { pub debug_info: Option, } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] pub struct HintParams { pub code: String, @@ -77,7 +77,7 @@ pub struct HintParams { pub flow_tracking_data: FlowTrackingData, } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] pub struct FlowTrackingData { pub ap_tracking: ApTracking, @@ -85,7 +85,7 @@ pub struct FlowTrackingData { pub reference_ids: HashMap, } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] pub struct ApTracking { pub group: usize, @@ -107,7 +107,7 @@ impl Default for ApTracking { } } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub struct Identifier { pub pc: Option, @@ -122,14 +122,14 @@ pub struct Identifier { pub cairo_type: Option, } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct Member { pub cairo_type: String, pub offset: usize, } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct Attribute { pub name: String, @@ -139,7 +139,7 @@ pub struct Attribute { pub flow_tracking_data: Option, } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] pub struct Location { pub end_line: u32, @@ -155,20 +155,20 @@ pub struct DebugInfo { instruction_locations: HashMap, } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub struct InstructionLocation { pub inst: Location, pub hints: Vec, } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] pub struct InputFile { pub filename: String, } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub struct HintLocation { pub location: Location, @@ -225,7 +225,7 @@ pub struct Reference { pub value_address: ValueAddress, } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub enum OffsetValue { Immediate(Felt252), diff --git a/vm/src/types/instruction.rs b/vm/src/types/instruction.rs index 2714d55672..8d1e3f2f9c 100644 --- a/vm/src/types/instruction.rs +++ b/vm/src/types/instruction.rs @@ -4,10 +4,10 @@ use serde::{Deserialize, Serialize}; use crate::vm::decoding::decoder::decode_instruction; -#[cfg(feature = "fuzzing")] +#[cfg(feature = "arbitrary")] use arbitrary::Arbitrary; -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Eq)] pub enum Register { AP, diff --git a/vm/src/types/program.rs b/vm/src/types/program.rs index 1ce3f9e2b0..c41daad7b8 100644 --- a/vm/src/types/program.rs +++ b/vm/src/types/program.rs @@ -19,7 +19,7 @@ use felt::{Felt252, PRIME_STR}; #[cfg(feature = "std")] use std::path::Path; -#[cfg(feature = "fuzzing")] +#[cfg(feature = "arbitrary")] use arbitrary::Arbitrary; // NOTE: `Program` has been split in two containing some data that will be deep-copied @@ -43,7 +43,7 @@ use arbitrary::Arbitrary; // exceptional circumstances, such as when reconstructing a backtrace on execution // failures. // Fields in `Program` (other than `SharedProgramData` itself) are used by the main logic. -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Clone, Default, Debug, PartialEq, Eq)] pub(crate) struct SharedProgramData { pub(crate) data: Vec, @@ -58,7 +58,7 @@ pub(crate) struct SharedProgramData { pub(crate) reference_manager: Vec, } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Clone, Debug, PartialEq, Eq)] pub struct Program { pub(crate) shared_program_data: Arc, diff --git a/vm/src/types/relocatable.rs b/vm/src/types/relocatable.rs index 4abc4208cd..7cf414ce0f 100644 --- a/vm/src/types/relocatable.rs +++ b/vm/src/types/relocatable.rs @@ -11,17 +11,17 @@ use felt::Felt252; use num_traits::{ToPrimitive, Zero}; use serde::{Deserialize, Serialize}; -#[cfg(feature = "fuzzing")] +#[cfg(feature = "arbitrary")] use arbitrary::Arbitrary; -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Eq, Ord, Hash, PartialEq, PartialOrd, Clone, Copy, Debug, Serialize, Deserialize)] pub struct Relocatable { pub segment_index: isize, pub offset: usize, } -#[cfg_attr(feature = "fuzzing", derive(Arbitrary))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Eq, Ord, Hash, PartialEq, PartialOrd, Clone, Debug, Serialize, Deserialize)] pub enum MaybeRelocatable { RelocatableValue(Relocatable), From 6b5a95ad3d61becfb5aa9414e996eb06c03a3bde Mon Sep 17 00:00:00 2001 From: Juanma Date: Mon, 10 Jul 2023 09:39:37 -0300 Subject: [PATCH 14/22] Update bincode --- fuzzer/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fuzzer/Cargo.toml b/fuzzer/Cargo.toml index 7144d35cf5..f1f1c0bfc4 100644 --- a/fuzzer/Cargo.toml +++ b/fuzzer/Cargo.toml @@ -11,7 +11,7 @@ members = ["."] [dependencies] arbitrary = { version = "1.3.0", features = ["derive"] } honggfuzz = "0.5.55" -bincode = { version = "2.0.0-rc.2", tag = "v2.0.0-rc.2", git = "https://github.com/bincode-org/bincode.git" } +bincode = { version = "2.0.0-rc.3", tag = "v2.0.0-rc.3", git = "https://github.com/bincode-org/bincode.git" } cairo-vm = { path = "../vm", features = ["arbitrary"] } mimalloc = { version = "0.1.29", default-features = false, optional = true } nom = "7" From a74be0141312b423402904068f3bedd538c9c511 Mon Sep 17 00:00:00 2001 From: Juanma Date: Mon, 10 Jul 2023 09:52:12 -0300 Subject: [PATCH 15/22] Update Arbitrary deps --- felt/src/bigint_felt.rs | 4 ++-- felt/src/lib_bigint_felt.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/felt/src/bigint_felt.rs b/felt/src/bigint_felt.rs index ead7592a7a..fddcec44f2 100644 --- a/felt/src/bigint_felt.rs +++ b/felt/src/bigint_felt.rs @@ -14,7 +14,7 @@ use core::{ use crate::{lib_bigint_felt::FeltOps, ParseFeltError}; -#[cfg(feature = "arbitrary")] +#[cfg(all(feature = "std", feature = "arbitrary"))] use arbitrary::Arbitrary; pub const FIELD_HIGH: u128 = (1 << 123) + (17 << 64); // this is equal to 10633823966279327296825105735305134080 @@ -34,7 +34,7 @@ lazy_static! { .expect("Conversion BigUint -> BigInt can't fail"); } -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Eq, Hash, PartialEq, PartialOrd, Ord, Clone, Deserialize, Default, Serialize)] pub(crate) struct FeltBigInt { val: BigUint, diff --git a/felt/src/lib_bigint_felt.rs b/felt/src/lib_bigint_felt.rs index fccb9f6155..93652e0290 100644 --- a/felt/src/lib_bigint_felt.rs +++ b/felt/src/lib_bigint_felt.rs @@ -19,7 +19,7 @@ use core::{ #[cfg(all(not(feature = "std"), feature = "alloc"))] use alloc::{string::String, vec::Vec}; -#[cfg(feature = "arbitrary")] +#[cfg(all(feature = "arbitrary", feature = "std"))] use arbitrary::Arbitrary; pub(crate) trait FeltOps { @@ -67,7 +67,7 @@ macro_rules! felt_str { }; } -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Eq, Hash, PartialEq, PartialOrd, Ord, Clone, Deserialize, Default, Serialize)] pub struct Felt252 { pub(crate) value: FeltBigInt, From 9238ce26fa461ce1aac63659546b29c3258eaf15 Mon Sep 17 00:00:00 2001 From: Juanma Date: Mon, 10 Jul 2023 10:04:33 -0300 Subject: [PATCH 16/22] Check for std with arbitrary --- vm/src/serde/deserialize_program.rs | 26 +++++++++++++------------- vm/src/types/program.rs | 6 +++--- vm/src/types/relocatable.rs | 6 +++--- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/vm/src/serde/deserialize_program.rs b/vm/src/serde/deserialize_program.rs index fa9e084ed9..60e59dab48 100644 --- a/vm/src/serde/deserialize_program.rs +++ b/vm/src/serde/deserialize_program.rs @@ -21,11 +21,11 @@ use num_traits::{Num, Pow}; use serde::{de, de::MapAccess, de::SeqAccess, Deserialize, Deserializer, Serialize}; use serde_json::Number; -#[cfg(feature = "arbitrary")] +#[cfg(all(feature = "arbitrary", feature = "std"))] use arbitrary::Arbitrary; // This enum is used to deserialize program builtins into &str and catch non-valid names -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, PartialEq, Copy, Clone, Eq, Hash)] #[allow(non_camel_case_types)] pub enum BuiltinName { @@ -69,7 +69,7 @@ pub struct ProgramJson { pub debug_info: Option, } -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] pub struct HintParams { pub code: String, @@ -77,7 +77,7 @@ pub struct HintParams { pub flow_tracking_data: FlowTrackingData, } -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] pub struct FlowTrackingData { pub ap_tracking: ApTracking, @@ -85,7 +85,7 @@ pub struct FlowTrackingData { pub reference_ids: HashMap, } -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] pub struct ApTracking { pub group: usize, @@ -107,7 +107,7 @@ impl Default for ApTracking { } } -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub struct Identifier { pub pc: Option, @@ -122,14 +122,14 @@ pub struct Identifier { pub cairo_type: Option, } -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct Member { pub cairo_type: String, pub offset: usize, } -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct Attribute { pub name: String, @@ -139,7 +139,7 @@ pub struct Attribute { pub flow_tracking_data: Option, } -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] pub struct Location { pub end_line: u32, @@ -155,20 +155,20 @@ pub struct DebugInfo { instruction_locations: HashMap, } -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub struct InstructionLocation { pub inst: Location, pub hints: Vec, } -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] pub struct InputFile { pub filename: String, } -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub struct HintLocation { pub location: Location, @@ -225,7 +225,7 @@ pub struct Reference { pub value_address: ValueAddress, } -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub enum OffsetValue { Immediate(Felt252), diff --git a/vm/src/types/program.rs b/vm/src/types/program.rs index c41daad7b8..ec9090fdbc 100644 --- a/vm/src/types/program.rs +++ b/vm/src/types/program.rs @@ -19,7 +19,7 @@ use felt::{Felt252, PRIME_STR}; #[cfg(feature = "std")] use std::path::Path; -#[cfg(feature = "arbitrary")] +#[cfg(all(feature = "arbitrary", feature = "std"))] use arbitrary::Arbitrary; // NOTE: `Program` has been split in two containing some data that will be deep-copied @@ -43,7 +43,7 @@ use arbitrary::Arbitrary; // exceptional circumstances, such as when reconstructing a backtrace on execution // failures. // Fields in `Program` (other than `SharedProgramData` itself) are used by the main logic. -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Clone, Default, Debug, PartialEq, Eq)] pub(crate) struct SharedProgramData { pub(crate) data: Vec, @@ -58,7 +58,7 @@ pub(crate) struct SharedProgramData { pub(crate) reference_manager: Vec, } -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Clone, Debug, PartialEq, Eq)] pub struct Program { pub(crate) shared_program_data: Arc, diff --git a/vm/src/types/relocatable.rs b/vm/src/types/relocatable.rs index 7cf414ce0f..14f3c1bbdf 100644 --- a/vm/src/types/relocatable.rs +++ b/vm/src/types/relocatable.rs @@ -11,17 +11,17 @@ use felt::Felt252; use num_traits::{ToPrimitive, Zero}; use serde::{Deserialize, Serialize}; -#[cfg(feature = "arbitrary")] +#[cfg(all(feature = "arbitrary", feature = "std"))] use arbitrary::Arbitrary; -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Eq, Ord, Hash, PartialEq, PartialOrd, Clone, Copy, Debug, Serialize, Deserialize)] pub struct Relocatable { pub segment_index: isize, pub offset: usize, } -#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(Arbitrary))] #[derive(Eq, Ord, Hash, PartialEq, PartialOrd, Clone, Debug, Serialize, Deserialize)] pub enum MaybeRelocatable { RelocatableValue(Relocatable), From b7593395e11ffefdeceda7df9f2c2d286052ec91 Mon Sep 17 00:00:00 2001 From: Juanma Date: Mon, 10 Jul 2023 10:23:45 -0300 Subject: [PATCH 17/22] Update Cargo.toml --- vm/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vm/Cargo.toml b/vm/Cargo.toml index a22a06ec12..b6a9cb1460 100644 --- a/vm/Cargo.toml +++ b/vm/Cargo.toml @@ -25,7 +25,7 @@ cairo-1-hints = [ "dep:ark-ff", "dep:ark-std", ] -arbitrary = ["dep:arbitrary", "felt/arbitrary"] +arbitrary = ["dep:arbitrary", "felt/arbitrary", "felt/std"] lambdaworks-felt = ["felt/lambdaworks-felt"] # Note that these features are not retro-compatible with the cairo Python VM. From 19e9326b694bc67f13f1e4a263f20477a57ec9b1 Mon Sep 17 00:00:00 2001 From: Juanma Date: Mon, 10 Jul 2023 15:05:21 -0300 Subject: [PATCH 18/22] Revert "Update bincode" This reverts commit 6b5a95ad3d61becfb5aa9414e996eb06c03a3bde. --- fuzzer/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fuzzer/Cargo.toml b/fuzzer/Cargo.toml index f1f1c0bfc4..7144d35cf5 100644 --- a/fuzzer/Cargo.toml +++ b/fuzzer/Cargo.toml @@ -11,7 +11,7 @@ members = ["."] [dependencies] arbitrary = { version = "1.3.0", features = ["derive"] } honggfuzz = "0.5.55" -bincode = { version = "2.0.0-rc.3", tag = "v2.0.0-rc.3", git = "https://github.com/bincode-org/bincode.git" } +bincode = { version = "2.0.0-rc.2", tag = "v2.0.0-rc.2", git = "https://github.com/bincode-org/bincode.git" } cairo-vm = { path = "../vm", features = ["arbitrary"] } mimalloc = { version = "0.1.29", default-features = false, optional = true } nom = "7" From 559d474a5a1f703be3119b4efbd77476173c8e58 Mon Sep 17 00:00:00 2001 From: Juanma Date: Mon, 10 Jul 2023 15:07:10 -0300 Subject: [PATCH 19/22] Revert to update bincode --- fuzzer/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fuzzer/Cargo.toml b/fuzzer/Cargo.toml index 7144d35cf5..f1f1c0bfc4 100644 --- a/fuzzer/Cargo.toml +++ b/fuzzer/Cargo.toml @@ -11,7 +11,7 @@ members = ["."] [dependencies] arbitrary = { version = "1.3.0", features = ["derive"] } honggfuzz = "0.5.55" -bincode = { version = "2.0.0-rc.2", tag = "v2.0.0-rc.2", git = "https://github.com/bincode-org/bincode.git" } +bincode = { version = "2.0.0-rc.3", tag = "v2.0.0-rc.3", git = "https://github.com/bincode-org/bincode.git" } cairo-vm = { path = "../vm", features = ["arbitrary"] } mimalloc = { version = "0.1.29", default-features = false, optional = true } nom = "7" From 2505c941a1d53b5bcd5fde76f16ee615a9110717 Mon Sep 17 00:00:00 2001 From: Juanma Date: Mon, 10 Jul 2023 17:03:45 -0300 Subject: [PATCH 20/22] Fix arbitrary imports --- Cargo.lock | 2 +- felt/src/lib_lambdaworks.rs | 11 +++++++++++ vm/Cargo.toml | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d3fdfe4b19..1efd8fa29a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1040,7 +1040,7 @@ checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.23", + "syn 2.0.25", ] [[package]] diff --git a/felt/src/lib_lambdaworks.rs b/felt/src/lib_lambdaworks.rs index 2d1545aa21..88997f3d43 100644 --- a/felt/src/lib_lambdaworks.rs +++ b/felt/src/lib_lambdaworks.rs @@ -22,8 +22,19 @@ use serde::{Deserialize, Serialize}; #[cfg(all(not(feature = "std"), feature = "alloc"))] use alloc::{string::String, vec::Vec}; +#[cfg(feature = "arbitrary")] +use arbitrary::{Arbitrary, Unstructured}; + use crate::{ParseFeltError, FIELD_HIGH, FIELD_LOW}; +#[cfg(feature = "arbitrary")] +impl<'a> Arbitrary<'a> for Felt252 { + fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { + let num: BigUint = BigUint::arbitrary(u)?; + Ok(Felt252::from(num)) + } +} + lazy_static! { pub static ref CAIRO_PRIME_BIGUINT: BigUint = (Into::::into(FIELD_HIGH) << 128) + Into::::into(FIELD_LOW); diff --git a/vm/Cargo.toml b/vm/Cargo.toml index b6a9cb1460..d3937a0d02 100644 --- a/vm/Cargo.toml +++ b/vm/Cargo.toml @@ -25,7 +25,7 @@ cairo-1-hints = [ "dep:ark-ff", "dep:ark-std", ] -arbitrary = ["dep:arbitrary", "felt/arbitrary", "felt/std"] +arbitrary = ["dep:arbitrary", "felt/arbitrary", "felt/std", "std"] lambdaworks-felt = ["felt/lambdaworks-felt"] # Note that these features are not retro-compatible with the cairo Python VM. From aad7a1260db20dea18e594ba829e02d1880f0e4f Mon Sep 17 00:00:00 2001 From: Juanma Date: Tue, 11 Jul 2023 16:39:25 -0300 Subject: [PATCH 21/22] Run linter --- fuzzer/src/fuzz_program.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/fuzzer/src/fuzz_program.rs b/fuzzer/src/fuzz_program.rs index a72953c725..4d5e4ca4ce 100644 --- a/fuzzer/src/fuzz_program.rs +++ b/fuzzer/src/fuzz_program.rs @@ -1,17 +1,27 @@ -use honggfuzz::fuzz; use cairo_vm::{ - cairo_run::{CairoRunConfig, cairo_run_parsed_program}, + cairo_run::{cairo_run_parsed_program, CairoRunConfig}, + hint_processor::builtin_hint_processor::builtin_hint_processor_definition::BuiltinHintProcessor, types::program::Program, - hint_processor::builtin_hint_processor::builtin_hint_processor_definition::BuiltinHintProcessor }; +use honggfuzz::fuzz; const STEPS_LIMIT: usize = 1000000; fn main() { loop { fuzz!(|data: (CairoRunConfig, Program)| { let (cairo_config, program) = data; - let _ = cairo_run_parsed_program(program.clone(), &CairoRunConfig::default(), &mut BuiltinHintProcessor::new_empty(), STEPS_LIMIT); - let _ = cairo_run_parsed_program(program, &cairo_config, &mut BuiltinHintProcessor::new_empty(), STEPS_LIMIT); + let _ = cairo_run_parsed_program( + program.clone(), + &CairoRunConfig::default(), + &mut BuiltinHintProcessor::new_empty(), + STEPS_LIMIT, + ); + let _ = cairo_run_parsed_program( + program, + &cairo_config, + &mut BuiltinHintProcessor::new_empty(), + STEPS_LIMIT, + ); }); } } From 56a1b01a6bd36f644a5fdef2a6b392997c1c310b Mon Sep 17 00:00:00 2001 From: Juanma Date: Tue, 11 Jul 2023 16:43:29 -0300 Subject: [PATCH 22/22] Run linter --- fuzzer/src/fuzz_program.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/fuzzer/src/fuzz_program.rs b/fuzzer/src/fuzz_program.rs index 4d5e4ca4ce..0358ded6ee 100644 --- a/fuzzer/src/fuzz_program.rs +++ b/fuzzer/src/fuzz_program.rs @@ -11,15 +11,15 @@ fn main() { fuzz!(|data: (CairoRunConfig, Program)| { let (cairo_config, program) = data; let _ = cairo_run_parsed_program( - program.clone(), - &CairoRunConfig::default(), - &mut BuiltinHintProcessor::new_empty(), + program.clone(), + &CairoRunConfig::default(), + &mut BuiltinHintProcessor::new_empty(), STEPS_LIMIT, ); let _ = cairo_run_parsed_program( - program, - &cairo_config, - &mut BuiltinHintProcessor::new_empty(), + program, + &cairo_config, + &mut BuiltinHintProcessor::new_empty(), STEPS_LIMIT, ); });