diff --git a/src/bin/cargo-ziggy/build.rs b/src/bin/cargo-ziggy/build.rs index 57bf36a..2da548c 100644 --- a/src/bin/cargo-ziggy/build.rs +++ b/src/bin/cargo-ziggy/build.rs @@ -17,15 +17,22 @@ impl Build { if !self.no_afl { eprintln!(" {} afl", style("Building").red().bold()); + let mut afl_args = vec![ + "afl", + "build", + "--features=ziggy/afl", + "--target-dir=target/afl", + ]; + + // Add the --release argument if self.release is true + if self.release { + afl_args.push("--release"); + info!("Building in release mode"); + } // Second fuzzer we build: AFL++ let run = process::Command::new(cargo.clone()) - .args([ - "afl", - "build", - "--features=ziggy/afl", - "--target-dir=target/afl", - ]) + .args(afl_args) .env("AFL_QUIET", "1") .env("AFL_LLVM_CMPGLOG", "1") // for afl.rs feature "plugins" .env("RUSTFLAGS", env::var("RUSTFLAGS").unwrap_or_default()) @@ -46,9 +53,17 @@ impl Build { if !self.no_honggfuzz { eprintln!(" {} honggfuzz", style("Building").red().bold()); + let mut hfuzz_args = vec!["hfuzz", "build"]; + + // Add the --release argument if self.release is true + if self.release { + hfuzz_args.push("--release"); + info!("Building in release mode"); + } + // Third fuzzer we build: Honggfuzz let run = process::Command::new(cargo) - .args(["hfuzz", "build"]) + .args(hfuzz_args) .env("CARGO_TARGET_DIR", "./target/honggfuzz") .env("HFUZZ_BUILD_ARGS", "--features=ziggy/honggfuzz") .env("RUSTFLAGS", env::var("RUSTFLAGS").unwrap_or_default()) diff --git a/src/bin/cargo-ziggy/fuzz.rs b/src/bin/cargo-ziggy/fuzz.rs index 9bba873..d7112a8 100644 --- a/src/bin/cargo-ziggy/fuzz.rs +++ b/src/bin/cargo-ziggy/fuzz.rs @@ -68,6 +68,7 @@ impl Fuzz { let build = Build { no_afl: !self.afl(), no_honggfuzz: !self.honggfuzz(), + release: self.release, }; build.build().context("Failed to build the fuzzers")?; @@ -790,6 +791,7 @@ impl FuzzingConfig { } use std::fmt; + impl fmt::Display for FuzzingConfig { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:?}", self) diff --git a/src/bin/cargo-ziggy/main.rs b/src/bin/cargo-ziggy/main.rs index 455b9e9..ef58019 100644 --- a/src/bin/cargo-ziggy/main.rs +++ b/src/bin/cargo-ziggy/main.rs @@ -95,6 +95,10 @@ pub struct Build { /// No honggfuzz (Fuzz only with AFL++) #[clap(long = "no-honggfuzz", action)] no_honggfuzz: bool, + + /// Compile in release mode (--release) + #[clap(long = "release", action)] + release: bool, } #[derive(Args)] @@ -111,8 +115,14 @@ pub struct Fuzz { #[clap(short, long, value_parser, value_name = "DIR")] initial_corpus: Option, + /// Compile in release mode (--release) + #[clap(long = "release", action)] + release: bool, + /// Fuzzers output directory - #[clap(short, long, env="ZIGGY_OUTPUT", value_parser, value_name = "DIR", default_value=DEFAULT_OUTPUT_DIR)] + #[clap( + short, long, env = "ZIGGY_OUTPUT", value_parser, value_name = "DIR", default_value = DEFAULT_OUTPUT_DIR + )] ziggy_output: PathBuf, /// Number of concurent fuzzing jobs @@ -148,7 +158,7 @@ pub struct Fuzz { no_honggfuzz: bool, // This value helps us create a global timer for our display - #[clap(skip=std::time::Instant::now())] + #[clap(skip = std::time::Instant::now())] start_time: std::time::Instant, /// Pass flags to AFL++ directly @@ -179,7 +189,9 @@ pub struct Run { recursive: bool, /// Fuzzers output directory - #[clap(short, long, env="ZIGGY_OUTPUT", value_parser, value_name = "DIR", default_value=DEFAULT_OUTPUT_DIR)] + #[clap( + short, long, env = "ZIGGY_OUTPUT", value_parser, value_name = "DIR", default_value = DEFAULT_OUTPUT_DIR + )] ziggy_output: PathBuf, } @@ -198,7 +210,9 @@ pub struct Minimize { output_corpus: PathBuf, /// Fuzzers output directory - #[clap(short, long, env="ZIGGY_OUTPUT", value_parser, value_name = "DIR", default_value=DEFAULT_OUTPUT_DIR)] + #[clap( + short, long, env = "ZIGGY_OUTPUT", value_parser, value_name = "DIR", default_value = DEFAULT_OUTPUT_DIR + )] ziggy_output: PathBuf, /// Number of concurent minimizing jobs (AFL++ only) @@ -224,7 +238,9 @@ pub struct Cover { input: PathBuf, /// Fuzzers output directory - #[clap(short, long, env="ZIGGY_OUTPUT", value_parser, value_name = "DIR", default_value=DEFAULT_OUTPUT_DIR)] + #[clap( + short, long, env = "ZIGGY_OUTPUT", value_parser, value_name = "DIR", default_value = DEFAULT_OUTPUT_DIR + )] ziggy_output: PathBuf, /// Source directory of covered code @@ -255,7 +271,9 @@ pub struct Plot { output: PathBuf, /// Fuzzers output directory - #[clap(short, long, env="ZIGGY_OUTPUT", value_parser, value_name = "DIR", default_value=DEFAULT_OUTPUT_DIR)] + #[clap( + short, long, env = "ZIGGY_OUTPUT", value_parser, value_name = "DIR", default_value = DEFAULT_OUTPUT_DIR + )] ziggy_output: PathBuf, } @@ -274,7 +292,9 @@ pub struct Triage { jobs: u32, /// Fuzzers output directory - #[clap(short, long, env="ZIGGY_OUTPUT", value_parser, value_name = "DIR", default_value=DEFAULT_OUTPUT_DIR)] + #[clap( + short, long, env = "ZIGGY_OUTPUT", value_parser, value_name = "DIR", default_value = DEFAULT_OUTPUT_DIR + )] ziggy_output: PathBuf, /* future feature, wait for casr /// Crash directory to be sourced from @@ -294,7 +314,9 @@ pub struct AddSeeds { input: PathBuf, /// Fuzzers output directory - #[clap(short, long, env="ZIGGY_OUTPUT", value_parser, value_name = "DIR", default_value=DEFAULT_OUTPUT_DIR)] + #[clap( + short, long, env = "ZIGGY_OUTPUT", value_parser, value_name = "DIR", default_value = DEFAULT_OUTPUT_DIR + )] ziggy_output: PathBuf, } diff --git a/src/bin/cargo-ziggy/minimize.rs b/src/bin/cargo-ziggy/minimize.rs index 2e92c12..ff2f7a8 100644 --- a/src/bin/cargo-ziggy/minimize.rs +++ b/src/bin/cargo-ziggy/minimize.rs @@ -7,6 +7,7 @@ impl Minimize { let build = Build { no_afl: self.engine == FuzzingEngines::Honggfuzz, no_honggfuzz: self.engine == FuzzingEngines::AFLPlusPlus, + release: false, }; build.build().context("Failed to build the fuzzers")?;