Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion src/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ pub use self::{
list::List, run::Run, tmin::Tmin,
};

use anyhow::{bail, Error, Result};
use clap::{Parser, ValueEnum};
use std::{fmt as stdfmt, path::PathBuf};
use std::{fmt as stdfmt, path::PathBuf, str::FromStr};

#[derive(Copy, Clone, Debug, Eq, PartialEq, ValueEnum)]
pub enum Sanitizer {
Expand Down Expand Up @@ -279,6 +280,24 @@ impl stdfmt::Display for FuzzDirWrapper {
}
}

#[derive(Clone, Debug)]
pub enum FuzzEngine {
LibFuzzer,
LibAfl,
}

impl FromStr for FuzzEngine {
type Err = Error;

fn from_str(s: &str) -> Result<Self> {
match s {
"libfuzzer" => Ok(Self::LibFuzzer),
"libafl" => Ok(Self::LibAfl),
_ => bail!("invalid fuzz engine: '{s}'. Must be one of: 'libfuzzer', 'libafl'"),
}
}
}

#[cfg(test)]
mod test {
use super::*;
Expand Down
14 changes: 10 additions & 4 deletions src/options/init.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
use crate::{options::FuzzDirWrapper, project::FuzzProject, RunCommand};
use crate::{
options::{FuzzDirWrapper, FuzzEngine},
project::FuzzProject,
RunCommand,
};
use anyhow::Result;
use clap::Parser;

Expand All @@ -12,9 +16,11 @@ pub struct Init {
/// Whether to create a separate workspace for fuzz targets crate
pub fuzzing_workspace: Option<bool>,

#[arg(long, value_parser = clap::builder::BoolishValueParser::new(), default_value = "false")]
/// Whether to use libafl's libfuzzer_sys-compatible API for improved fuzzing performance
pub use_libafl: Option<bool>,
#[arg(long, default_value = "libfuzzer")]
/// The fuzz engine that the project should use.
///
/// Options: libfuzzer, libafl
pub fuzz_engine: FuzzEngine,

#[command(flatten)]
pub fuzz_dir_wrapper: FuzzDirWrapper,
Expand Down
2 changes: 1 addition & 1 deletion src/project.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ impl FuzzProject {
.write_fmt(toml_template!(
manifest.crate_name,
manifest.edition,
init.use_libafl,
init.fuzz_engine,
init.fuzzing_workspace
))
.with_context(|| format!("failed to write to {}", cargo_toml.display()))?;
Expand Down
11 changes: 6 additions & 5 deletions src/templates.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
macro_rules! toml_template {
($name:expr, $edition:expr, $use_libafl:expr, $fuzzing_workspace:expr) => {
($name:expr, $edition:expr, $fuzz_engine:expr, $fuzzing_workspace:expr) => {
format_args!(
r##"[package]
name = "{name}-fuzz"
Expand All @@ -21,10 +21,11 @@ path = ".."
} else {
String::new()
},
libfuzzer_sys_dep = if let Some(true) = $use_libafl {
r##"libfuzzer-sys = { version = "0.15.3", package = "libafl_libfuzzer" }"##
} else {
r##"libfuzzer-sys = "0.4""##
libfuzzer_sys_dep = match $fuzz_engine {
crate::options::FuzzEngine::LibFuzzer => r#"libfuzzer-sys = "0.4""#,
crate::options::FuzzEngine::LibAfl => {
r#"libfuzzer-sys = { version = "0.15.3", package = "libafl_libfuzzer" }"#
}
},
workspace = if let Some(true) = $fuzzing_workspace {
r##"
Expand Down
18 changes: 16 additions & 2 deletions tests/tests/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,21 @@ fn init_defines_correct_dependency() {
let expected_dependency_attrs =
&format!("[dependencies.{name}]\npath = \"..\"", name = project_name);
assert!(cargo_toml.contains(expected_dependency_attrs));
assert!(cargo_toml.contains(r#"libfuzzer-sys = "0.4""#))
assert!(cargo_toml.contains(r#"libfuzzer-sys = "0.4""#));
}

#[test]
fn init_with_libfuzzer() {
let project = project("init_with_libfuzzer").build();
project
.cargo_fuzz()
.arg("init")
.arg("--fuzz-engine=libfuzzer")
.assert()
.success();

let cargo_toml = fs::read_to_string(project.fuzz_cargo_toml()).unwrap();
assert!(cargo_toml.contains(r#"libfuzzer-sys = "0.4""#));
}

#[test]
Expand All @@ -168,7 +182,7 @@ fn init_with_libafl() {
project
.cargo_fuzz()
.arg("init")
.arg("--use-libafl=true")
.arg("--fuzz-engine=libafl")
.assert()
.success();

Expand Down
Loading