diff --git a/Cargo.toml b/Cargo.toml index 574c3c8763..4877d9eea2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,3 +14,4 @@ xxhash-rust = { version = "0.8.0-beta.4", features = ["xxh3"] } # xxh3 hashing f thiserror = "1.0" # A nicer way to write Errors hashbrown = "0.9" # A faster hashmap, nostd compatible libc = "0.2" # For (*nix) libc +num = "*" \ No newline at end of file diff --git a/src/feedbacks/mod.rs b/src/feedbacks/mod.rs index 6b95341a04..2266de71fa 100644 --- a/src/feedbacks/mod.rs +++ b/src/feedbacks/mod.rs @@ -1,19 +1,22 @@ +extern crate num; + use crate::corpus::Testcase; use crate::executors::Executor; use crate::observers::MapObserver; +use num::Integer; + pub trait Feedback { /// is_interesting should return the "Interestingness" from 0 to 255 (percent times 2.55) fn is_interesting(&mut self, executor: &dyn Executor, entry: &dyn Testcase) -> u8; } -use crate::observers::StaticMapObserver; -pub struct CovFeedback<'a> { - virgin_bits: Vec, - smo: &'a StaticMapObserver, +pub struct CovFeedback<'a, MapT: Integer + Copy> { + virgin_bits: Vec, + smo: &'a MapObserver<'a, MapT>, } -impl<'a> Feedback for CovFeedback<'a> { +impl<'a, MapT: Integer + Copy> Feedback for CovFeedback<'a, MapT> { fn is_interesting(&mut self, _executor: &dyn Executor, _entry: &dyn Testcase) -> u8 { let mut interesting = 0; // TODO: impl. correctly, optimize @@ -30,12 +33,12 @@ impl<'a> Feedback for CovFeedback<'a> { } } -impl<'a> CovFeedback<'a> { +impl<'a, MapT: Integer + Copy> CovFeedback<'a, MapT> { /// Create new CovFeedback using a static map observer - pub fn new(smo: &'a StaticMapObserver) -> Self { + pub fn new(smo: &'a MapObserver) -> Self { CovFeedback { smo: smo, - virgin_bits: vec![0; smo.get_map().len()], + virgin_bits: vec![MapT::zero(); smo.get_map().len()], } } } diff --git a/src/observers/mod.rs b/src/observers/mod.rs index b5a271234f..69e66486fc 100644 --- a/src/observers/mod.rs +++ b/src/observers/mod.rs @@ -1,6 +1,10 @@ +extern crate num; + use crate::AflError; use std::slice::from_raw_parts_mut; +use num::Integer; + /// Observers observe different information about the target. /// They can then be used by various sorts of feedback. pub trait Observer { @@ -15,42 +19,36 @@ pub trait Observer { } } -/// A MapObserver contains a map with values, collected from the child. -pub trait MapObserver: Observer { - fn get_map(&self) -> &[MapT]; - fn get_map_mut(&mut self) -> &mut [MapT]; -} - /// A staticMapObserver observes the static map, as oftentimes used for afl-like coverage information -pub struct StaticMapObserver { - map: &'static mut [u8], +pub struct MapObserver<'a, MapT: Integer + Copy> { + map: &'a mut [MapT], } -impl Observer for StaticMapObserver { +impl<'a, MapT: Integer + Copy> Observer for MapObserver<'a, MapT> { fn reset(&mut self) -> Result<(), AflError> { // Normal memset, see https://rust.godbolt.org/z/Trs5hv for i in self.map.iter_mut() { - *i = 0; + *i = MapT::zero(); } Ok(()) } } -impl MapObserver for StaticMapObserver { - fn get_map(&self) -> &[u8] { +impl<'a, MapT: Integer + Copy> MapObserver<'a, MapT> { + pub fn get_map(&self) -> &[MapT] { self.map } - fn get_map_mut(&mut self) -> &mut [u8] { + pub fn get_map_mut(&mut self) -> &mut [MapT] { self.map } } -impl StaticMapObserver { - /// Creates a new StaticMapObserver from a raw pointer. - pub fn new(map_ptr: *mut u8, len: usize) -> Self { +impl<'a, MapT: Integer + Copy> MapObserver<'a, MapT> { + /// Creates a new MapObserver from a raw pointer. + pub fn new(map_ptr: *mut MapT, len: usize) -> Self { unsafe { - StaticMapObserver { + MapObserver { map: from_raw_parts_mut(map_ptr, len), } }