diff --git a/cargo-test-fuzz/src/fuzzer/mod.rs b/cargo-test-fuzz/src/fuzzer/mod.rs index ce6ec97c..30960497 100644 --- a/cargo-test-fuzz/src/fuzzer/mod.rs +++ b/cargo-test-fuzz/src/fuzzer/mod.rs @@ -1,16 +1,23 @@ use super::{Executable, TestFuzz}; -use anyhow::Result; +use anyhow::{ensure, Result}; use internal::Fuzzer; use semver::Version; use std::{path::Path, process::Command}; mod impls; -pub(super) fn instantiate(fuzzer: Fuzzer) -> &'static dyn Interface { +pub(super) fn instantiate(fuzzer: Fuzzer) -> Result<&'static dyn Interface> { match fuzzer { - Fuzzer::Aflplusplus => impls::aflplusplus::instantiate(false), - Fuzzer::AflplusplusPersistent => impls::aflplusplus::instantiate(true), - Fuzzer::Libfuzzer => impls::libfuzzer::instantiate(), + Fuzzer::Aflplusplus => Ok(impls::aflplusplus::instantiate(false)), + Fuzzer::AflplusplusPersistent => { + // smoelius: https://github.com/AFLplusplus/AFLplusplus/blob/7b40d7b9420b2e3adb7d9afa88610199718dedba/include/forkserver.h#L114-L118 + ensure!( + cfg!(not(target_os = "macos")), + "`aflplusplus-persistent` is not supported on macOS" + ); + Ok(impls::aflplusplus::instantiate(true)) + } + Fuzzer::Libfuzzer => Ok(impls::libfuzzer::instantiate()), } } diff --git a/cargo-test-fuzz/src/lib.rs b/cargo-test-fuzz/src/lib.rs index d4c2f1b6..df3097e0 100644 --- a/cargo-test-fuzz/src/lib.rs +++ b/cargo-test-fuzz/src/lib.rs @@ -155,7 +155,7 @@ fn run(opts: TestFuzz) -> Result<()> { }; let fuzzer_env = fuzzer()?; - let fuzzer = fuzzer::instantiate(opts.fuzzer.unwrap_or(fuzzer_env)); + let fuzzer = fuzzer::instantiate(opts.fuzzer.unwrap_or(fuzzer_env))?; if let Some(object) = opts.replay { ensure!( diff --git a/internal/src/fuzzer.rs b/internal/src/fuzzer.rs index aea00274..f15860cb 100644 --- a/internal/src/fuzzer.rs +++ b/internal/src/fuzzer.rs @@ -9,7 +9,7 @@ use strum_macros::{Display, EnumIter}; // command line option. Hence, cargo-test-fuzz needs to know all available fuzzers. This is unlike // the Serde format, which the user selects via a Cargo feature. #[derive( - Clone, Copy, Debug, Display, Deserialize, EnumIter, PartialEq, Eq, Serialize, ValueEnum, + Clone, Copy, Debug, Deserialize, Display, EnumIter, PartialEq, Eq, Serialize, ValueEnum, )] #[remain::sorted] pub enum Fuzzer { diff --git a/test-fuzz/tests/github.rs b/test-fuzz/tests/github.rs index acdd7223..f878107a 100644 --- a/test-fuzz/tests/github.rs +++ b/test-fuzz/tests/github.rs @@ -14,7 +14,7 @@ enum SerdeFormat { Cbor4ii, } -#[derive(Clone, Copy, Debug, Display, EnumIter)] +#[derive(Clone, Copy, Debug, Display, EnumIter, Eq, PartialEq)] enum Environment { UbuntuLatest, MacosLatest, @@ -31,8 +31,8 @@ fn matrix() { let expecteds = std::iter::repeat( Fuzzer::iter() .cartesian_product(Environment::iter()) - .filter(|(fuzzer, environment)| { - *fuzzer != Fuzzer::AflplusplusPersistent || *environment != Environment::MacosLatest + .filter(|&(fuzzer, environment)| { + fuzzer != Fuzzer::AflplusplusPersistent || environment != Environment::MacosLatest }), ) .take(2) @@ -58,6 +58,11 @@ fn matrix() { for (expected, actual) in expecteds.zip(actuals) { let ((expected_fuzzer, expected_environment), (expected_serde_format, expected_toolchain)) = expected; + if expected_fuzzer == Fuzzer::AflplusplusPersistent + && expected_environment == Environment::MacosLatest + { + continue; + } assert_eq!( expected_fuzzer.to_string().to_kebab_case(), actual["fuzzer"].as_str().unwrap()