From 238d3260bd4cd8c8c7f272d49dc2fa497d2d8cbe Mon Sep 17 00:00:00 2001 From: Andrea Fioraldi Date: Thu, 10 Dec 2020 10:29:42 +0100 Subject: [PATCH] now serde of observers really works --- afl/Cargo.toml | 1 + afl/src/executors/mod.rs | 4 ++-- afl/src/feedbacks/mod.rs | 14 ++++++------- afl/src/observers/mod.rs | 45 ++++++++++++++++++++++------------------ afl/src/serde_anymap.rs | 12 +++++------ 5 files changed, 41 insertions(+), 35 deletions(-) diff --git a/afl/Cargo.toml b/afl/Cargo.toml index 15287084c6..81e5d8741c 100644 --- a/afl/Cargo.toml +++ b/afl/Cargo.toml @@ -11,6 +11,7 @@ criterion = "0.3" # Benchmarking ahash = "0.6.1" # another hash fxhash = "0.2.1" # yet another hash xxhash-rust = { version = "0.8.0", features = ["const_xxh3", "xxh3"] } # xxh3 hashing for rust +serde_json = "1.0.60" [[bench]] name = "rand_speeds" diff --git a/afl/src/executors/mod.rs b/afl/src/executors/mod.rs index a1b39f0feb..4ce0fd0a6c 100644 --- a/afl/src/executors/mod.rs +++ b/afl/src/executors/mod.rs @@ -31,8 +31,8 @@ where /// Add a linked observer fn add_observer(&mut self, observer: Box) { - let name = observer.name(); - self.observers_mut().insert(observer, name); + let name = observer.name().clone(); + self.observers_mut().insert(observer, &name); } /// Reset the state of all the observes linked to this executor diff --git a/afl/src/feedbacks/mod.rs b/afl/src/feedbacks/mod.rs index d187fe95c6..7d6e2e4758 100644 --- a/afl/src/feedbacks/mod.rs +++ b/afl/src/feedbacks/mod.rs @@ -35,7 +35,7 @@ where } /// The name of this feedback - fn name(&self) -> &'static str; + fn name(&self) -> &String; } /// A Reducer function is used to aggregate values for the novelty search @@ -96,7 +96,7 @@ where /// Contains information about untouched entries history_map: Vec, /// Name identifier of this instance - name: &'static str, + name: String, /// Phantom Data of Reducer phantom: PhantomData<(R, O)>, } @@ -115,7 +115,7 @@ where ) -> Result { let mut interesting = 0; // TODO optimize - let observer = observers.get::(self.name).unwrap(); + let observer = observers.get::(&self.name).unwrap(); let size = observer.map().len(); for i in 0..size { let history = self.history_map[i]; @@ -130,8 +130,8 @@ where Ok(interesting) } - fn name(&self) -> &'static str { - self.name + fn name(&self) -> &String { + &self.name } } @@ -145,7 +145,7 @@ where pub fn new(name: &'static str, map_size: usize) -> Self { Self { history_map: vec![T::default(); map_size], - name: name, + name: name.to_string(), phantom: PhantomData, } } @@ -162,7 +162,7 @@ where pub fn with_history_map(name: &'static str, history_map: Vec) -> Self { Self { history_map: history_map, - name: name, + name: name.to_string(), phantom: PhantomData, } } diff --git a/afl/src/observers/mod.rs b/afl/src/observers/mod.rs index 670c39339c..edae702e81 100644 --- a/afl/src/observers/mod.rs +++ b/afl/src/observers/mod.rs @@ -24,7 +24,7 @@ pub trait Observer: SerdeAny + 'static { Ok(()) } - fn name(&self) -> &'static str; + fn name(&self) -> &String; } crate::create_serde_registry_for_trait!(observer_serde, crate::observers::Observer); @@ -63,14 +63,15 @@ where /// The Map Observer retrieves the state of a map, /// that will get updated by the target. /// A well-known example is the AFL-Style coverage map. -#[derive(Serialize)] +#[derive(Serialize, Deserialize)] +#[serde(bound = "T: serde::de::DeserializeOwned")] pub struct StdMapObserver where T: Default + Copy + 'static + serde::Serialize + serde::de::DeserializeOwned, { map: ArrayMut, initial: T, - name: &'static str, + name: String, } impl Observer for StdMapObserver @@ -81,8 +82,8 @@ where self.reset_map() } - fn name(&self) -> &'static str { - self.name + fn name(&self) -> &String { + &self.name } } @@ -123,19 +124,6 @@ where } } -impl<'de, T> Deserialize<'de> for StdMapObserver -where - T: Default + Copy + 'static + serde::Serialize + serde::de::DeserializeOwned, -{ - fn deserialize(de: D) -> Result - where - D: serde::Deserializer<'de>, - { - let mut erased = erased_serde::Deserializer::erase(de); - erased_serde::deserialize(&mut erased).map_err(serde::de::Error::custom) - } -} - impl StdMapObserver where T: Default + Copy + 'static + serde::Serialize + serde::de::DeserializeOwned, @@ -147,7 +135,7 @@ where Self { map: ArrayMut::Cptr((map.as_mut_ptr(), map.len())), initial: initial, - name: name, + name: name.to_string(), } } @@ -159,8 +147,25 @@ where StdMapObserver { map: ArrayMut::Cptr((map_ptr, len)), initial: initial, - name: name, + name: name.to_string(), } } } } + +#[cfg(feature = "std")] +#[cfg(test)] +mod tests { + + use crate::observers::{Observer, StdMapObserver}; + static mut map: [u32; 4] = [0; 4]; + + #[test] + fn test_observer_serde() { + let o: Box = Box::new(StdMapObserver::::new("test", unsafe { &mut map })); + let s = serde_json::to_string(&o).unwrap(); + println!("{}", s); + let d: Box = serde_json::from_str(&s).unwrap(); + assert_eq!(d.name(), o.name()); + } +} diff --git a/afl/src/serde_anymap.rs b/afl/src/serde_anymap.rs index 30101d1f3f..9583f177ca 100644 --- a/afl/src/serde_anymap.rs +++ b/afl/src/serde_anymap.rs @@ -211,7 +211,7 @@ macro_rules! create_serde_registry_for_trait { } impl NamedSerdeAnyMap { - pub fn get(&self, name: &'static str) -> Option<&T> + pub fn get(&self, name: &String) -> Option<&T> where T: Any, { @@ -225,7 +225,7 @@ macro_rules! create_serde_registry_for_trait { pub fn by_typeid( &self, - name: &'static str, + name: &String, typeid: &TypeId, ) -> Option<&dyn $trait_name> { match self.map.get(&unpack_type_id(*typeid)) { @@ -236,7 +236,7 @@ macro_rules! create_serde_registry_for_trait { } } - pub fn get_mut(&mut self, name: &'static str) -> Option<&mut T> + pub fn get_mut(&mut self, name: &String) -> Option<&mut T> where T: Any, { @@ -250,7 +250,7 @@ macro_rules! create_serde_registry_for_trait { pub fn by_typeid_mut( &mut self, - name: &'static str, + name: &String, typeid: &TypeId, ) -> Option<&mut dyn $trait_name> { match self.map.get_mut(&unpack_type_id(*typeid)) { @@ -363,7 +363,7 @@ macro_rules! create_serde_registry_for_trait { Ok(()) } - pub fn insert(&mut self, val: Box, name: &'static str) { + pub fn insert(&mut self, val: Box, name: &String) { let id = unpack_type_id(val.type_id()); if !self.map.contains_key(&id) { self.map.insert(id, HashMap::default()); @@ -385,7 +385,7 @@ macro_rules! create_serde_registry_for_trait { self.map.contains_key(&unpack_type_id(TypeId::of::())) } - pub fn contains(&self, name: &'static str) -> bool + pub fn contains(&self, name: &String) -> bool where T: Any, {