libfuzzer_libpng wrappers

This commit is contained in:
Andrea Fioraldi 2021-03-24 15:28:58 +01:00
parent 1c8cdc76a8
commit 8d2713c4d9
3 changed files with 54 additions and 12 deletions

View File

@ -3,11 +3,17 @@ use std::env;
fn main() { fn main() {
let args: Vec<String> = env::args().collect(); let args: Vec<String> = env::args().collect();
if args.len() > 1 {
let mut dir = env::current_exe().unwrap();
dir.pop();
ClangWrapper::new("clang", "clang++") ClangWrapper::new("clang", "clang++")
.from_args(&args) .from_args(&args)
.unwrap() .unwrap()
.add_arg("-fsanitize=trace-pc-guard".into()) .add_arg("-fsanitize-coverage=trace-pc-guard".into())
.unwrap()
.add_link_arg(dir.join("liblibfuzzer_libpng.a").display().to_string())
.unwrap() .unwrap()
.run() .run()
.unwrap(); .unwrap();
} }
}

View File

@ -0,0 +1,20 @@
use libafl_cc::{ClangWrapper, CompilerWrapper};
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() > 1 {
let mut dir = env::current_exe().unwrap();
dir.pop();
ClangWrapper::new("clang", "clang++")
.is_cpp()
.from_args(&args)
.unwrap()
.add_arg("-fsanitize-coverage=trace-pc-guard".into())
.unwrap()
.add_link_arg(dir.join("liblibfuzzer_libpng.a").display().to_string())
.unwrap()
.run()
.unwrap();
}
}

View File

@ -1,8 +1,9 @@
use std::{string::String, vec::Vec}; use std::{process::Command, string::String, vec::Vec};
#[derive(Debug)] #[derive(Debug)]
pub enum Error { pub enum Error {
InvalidArguments(String), InvalidArguments(String),
IOError(std::io::Error),
Unknown(String), Unknown(String),
} }
@ -28,9 +29,18 @@ pub trait CompilerWrapper {
/// Run the compiler /// Run the compiler
fn run(&mut self) -> Result<(), Error> { fn run(&mut self) -> Result<(), Error> {
// TODO subproc
let args = self.command()?; let args = self.command()?;
println!("{:?}", args); dbg!(&args);
if args.len() < 1 {
return Err(Error::InvalidArguments(
"The number of arguments cannot be 0".into(),
));
}
let status = match Command::new(&args[0]).args(&args[1..]).status() {
Ok(s) => s,
Err(e) => return Err(Error::IOError(e)),
};
dbg!(status);
Ok(()) Ok(())
} }
} }
@ -63,12 +73,7 @@ impl CompilerWrapper for ClangWrapper {
self.name = args[0].clone(); self.name = args[0].clone();
// Detect C++ compiler looking at the wrapper name // Detect C++ compiler looking at the wrapper name
self.is_cpp = self.name.ends_with("++"); self.is_cpp = self.is_cpp || self.name.ends_with("++");
if self.is_cpp {
new_args.push(self.wrapped_cxx.clone());
} else {
new_args.push(self.wrapped_cc.clone());
}
// Sancov flag // Sancov flag
// new_args.push("-fsanitize-coverage=trace-pc-guard".into()); // new_args.push("-fsanitize-coverage=trace-pc-guard".into());
@ -122,7 +127,13 @@ impl CompilerWrapper for ClangWrapper {
} }
fn command(&mut self) -> Result<Vec<String>, Error> { fn command(&mut self) -> Result<Vec<String>, Error> {
let mut args = self.base_args.clone(); let mut args = vec![];
if self.is_cpp {
args.push(self.wrapped_cxx.clone());
} else {
args.push(self.wrapped_cc.clone());
}
args.extend_from_slice(self.base_args.as_slice());
if self.linking { if self.linking {
if self.x_set { if self.x_set {
args.push("-x".into()); args.push("-x".into());
@ -163,6 +174,11 @@ impl ClangWrapper {
self.optimize = false; self.optimize = false;
self self
} }
pub fn is_cpp<'a>(&'a mut self) -> &'a mut Self {
self.is_cpp = true;
self
}
} }
#[cfg(test)] #[cfg(test)]