diff --git a/src/bin/cargo-ziggy/build.rs b/src/bin/cargo-ziggy/build.rs index 7994795..89edd4f 100644 --- a/src/bin/cargo-ziggy/build.rs +++ b/src/bin/cargo-ziggy/build.rs @@ -30,34 +30,23 @@ impl Build { // Add the --release argument if self.release is true if self.release { - assert!(!self.release, "cannot use --release for ASAN builds"); + assert!(!self.asan, "cannot use --release for ASAN builds"); afl_args.push("--release"); } let opt_level = env::var("AFL_OPT_LEVEL").unwrap_or("0".to_string()); let mut rust_flags = env::var("RUSTFLAGS").unwrap_or_default(); let mut rust_doc_flags = env::var("RUSTDOCFLAGS").unwrap_or_default(); - let asan_target_str = format!("--target={ASAN_TARGET}"); - let opt_level_str = format!("-Copt-level={opt_level}"); - - if self.asan { - assert_eq!(opt_level, "0", "AFL_OPT_LEVEL must be 0 for ASAN builds"); - afl_args.push(&asan_target_str); - afl_args.extend(["-Z", "build-std"]); - rust_flags.push_str(" -Zsanitizer=address "); - rust_flags.push_str(&opt_level_str); - rust_doc_flags.push_str(" -Zsanitizer=address ") - }; // First fuzzer we build: AFL++ let run = process::Command::new(cargo.clone()) - .args(afl_args) + .args(&afl_args) .env("AFL_QUIET", "1") // need to specify for afl.rs so that we build with -Copt-level=0 - .env("AFL_OPT_LEVEL", opt_level) + .env("AFL_OPT_LEVEL", &opt_level) .env("AFL_LLVM_CMPLOG", "1") // for afl.rs feature "plugins" - .env("RUSTFLAGS", rust_flags) - .env("RUSTDOCFLAGS", rust_doc_flags) + .env("RUSTFLAGS", &rust_flags) + .env("RUSTDOCFLAGS", &rust_doc_flags) .spawn()? .wait() .context("Error spawning afl build command")?; @@ -69,6 +58,39 @@ impl Build { )); } + let asan_target_str = format!("--target={ASAN_TARGET}"); + let opt_level_str = format!("-Copt-level={opt_level}"); + + // If ASAN is enabled, build both a sanitized binary and a non-sanitized binary. + if self.asan { + eprintln!(" {} afl (ASan)", style("Building").red().bold()); + assert_eq!(opt_level, "0", "AFL_OPT_LEVEL must be 0 for ASAN builds"); + afl_args.push(&asan_target_str); + afl_args.extend(["-Z", "build-std"]); + rust_flags.push_str(" -Zsanitizer=address "); + rust_flags.push_str(&opt_level_str); + rust_doc_flags.push_str(" -Zsanitizer=address "); + + let run = process::Command::new(cargo.clone()) + .args(afl_args) + .env("AFL_QUIET", "1") + // need to specify for afl.rs so that we build with -Copt-level=0 + .env("AFL_OPT_LEVEL", opt_level) + .env("AFL_LLVM_CMPLOG", "1") // for afl.rs feature "plugins" + .env("RUSTFLAGS", rust_flags) + .env("RUSTDOCFLAGS", rust_doc_flags) + .spawn()? + .wait() + .context("Error spawning afl build command")?; + + if !run.success() { + return Err(anyhow!( + "Error building afl fuzzer: Exited with {:?}", + run.code() + )); + } + }; + eprintln!(" {} afl", style("Finished").cyan().bold()); } diff --git a/src/bin/cargo-ziggy/fuzz.rs b/src/bin/cargo-ziggy/fuzz.rs index e5bdbee..7659451 100644 --- a/src/bin/cargo-ziggy/fuzz.rs +++ b/src/bin/cargo-ziggy/fuzz.rs @@ -481,7 +481,7 @@ impl Fuzz { false => { if self.release { format!("./target/afl/release/{}", self.target) - } else if self.asan { + } else if self.asan && job_num == 0 { format!("./target/afl/{ASAN_TARGET}/debug/{}", self.target) } else { format!("./target/afl/debug/{}", self.target)