a small cleanup of warns

This commit is contained in:
Andrea Fioraldi 2020-12-09 10:34:59 +01:00
parent 94736f0b31
commit 2c299a1518
9 changed files with 135 additions and 93 deletions

View File

@ -1,9 +1,7 @@
//! The engine is the core piece of every good fuzzer //! The engine is the core piece of every good fuzzer
use alloc::boxed::Box; use alloc::boxed::Box;
use alloc::rc::Rc;
use alloc::vec::Vec; use alloc::vec::Vec;
use core::cell::RefCell;
use core::fmt::Debug; use core::fmt::Debug;
use core::marker::PhantomData; use core::marker::PhantomData;
use hashbrown::HashMap; use hashbrown::HashMap;
@ -14,7 +12,6 @@ use crate::executors::Executor;
use crate::feedbacks::Feedback; use crate::feedbacks::Feedback;
use crate::generators::Generator; use crate::generators::Generator;
use crate::inputs::Input; use crate::inputs::Input;
use crate::observers::Observer;
use crate::stages::Stage; use crate::stages::Stage;
use crate::utils::{current_milliseconds, Rand}; use crate::utils::{current_milliseconds, Rand};
use crate::AflError; use crate::AflError;
@ -199,10 +196,14 @@ where
let input = generator.generate(rand)?; let input = generator.generate(rand)?;
let fitness = self.evaluate_input(&input, engine)?; let fitness = self.evaluate_input(&input, engine)?;
self.add_if_interesting(corpus, input, fitness)?; self.add_if_interesting(corpus, input, fitness)?;
engine.events_manager_mut().fire(Event::LoadInitial { engine.events_manager_mut().fire(
sender_id: 0, Event::LoadInitial {
phantom: PhantomData, sender_id: 0,
}, self, corpus)?; phantom: PhantomData,
},
self,
corpus,
)?;
} }
engine.events_manager_mut().process(self, corpus)?; engine.events_manager_mut().process(self, corpus)?;
Ok(()) Ok(())
@ -324,11 +325,15 @@ where
let cur = current_milliseconds(); let cur = current_milliseconds();
if cur - last > 60 * 100 { if cur - last > 60 * 100 {
last = cur; last = cur;
engine.events_manager_mut().fire(Event::UpdateStats { engine.events_manager_mut().fire(
sender_id: 0, Event::UpdateStats {
new_execs: 1, sender_id: 0,
phantom: PhantomData, new_execs: 1,
}, state, corpus)?; // TODO self.new_execs}); phantom: PhantomData,
},
state,
corpus,
)?; // TODO self.new_execs});
} }
} }
} }
@ -411,7 +416,7 @@ mod tests {
let executor = InMemoryExecutor::<BytesInput>::new(harness); let executor = InMemoryExecutor::<BytesInput>::new(harness);
let mut state = State::new(); let mut state = State::new();
let mut events_manager = LoggerEventManager::new(stderr()); let events_manager = LoggerEventManager::new(stderr());
let mut engine = Engine::new(executor, events_manager); let mut engine = Engine::new(executor, events_manager);
let mut mutator = StdScheduledMutator::new(); let mut mutator = StdScheduledMutator::new();

View File

@ -21,8 +21,8 @@ use crate::corpus::{Corpus, Testcase};
use crate::engines::State; use crate::engines::State;
use crate::executors::Executor; use crate::executors::Executor;
use crate::inputs::Input; use crate::inputs::Input;
use crate::utils::Rand;
use crate::serde_anymap::{Ptr, PtrMut}; use crate::serde_anymap::{Ptr, PtrMut};
use crate::utils::Rand;
use crate::AflError; use crate::AflError;
/// Indicate if an event worked or not /// Indicate if an event worked or not
enum BrokerEventResult { enum BrokerEventResult {
@ -88,7 +88,7 @@ where
NewTestcase2 { NewTestcase2 {
sender_id: u64, sender_id: u64,
input: Ptr<'a, I>, input: Ptr<'a, I>,
observers: PtrMut<'a, crate::observers::observer_serde::NamedSerdeAnyMap> observers: PtrMut<'a, crate::observers::observer_serde::NamedSerdeAnyMap>,
}, },
UpdateStats { UpdateStats {
sender_id: u64, sender_id: u64,
@ -262,7 +262,12 @@ where
fn enabled(&self) -> bool; fn enabled(&self) -> bool;
/// Fire an Event /// Fire an Event
fn fire<'a>(&mut self, event: Event<'a, C, E, I, R>, state: &mut State<I, R>, corpus: &mut C) -> Result<(), AflError>; fn fire<'a>(
&mut self,
event: Event<'a, C, E, I, R>,
state: &mut State<I, R>,
corpus: &mut C,
) -> Result<(), AflError>;
/// Lookup for incoming events and process them. /// Lookup for incoming events and process them.
/// Return the number of processes events or an error /// Return the number of processes events or an error
@ -295,7 +300,7 @@ where
{ {
writer: W, writer: W,
count: usize, count: usize,
phantom: PhantomData<(C, E, I, R)> phantom: PhantomData<(C, E, I, R)>,
} }
#[cfg(feature = "std")] #[cfg(feature = "std")]
@ -312,7 +317,12 @@ where
true true
} }
fn fire<'a>(&mut self, event: Event<'a, C, E, I, R>, state: &mut State<I, R>, corpus: &mut C) -> Result<(), AflError> { fn fire<'a>(
&mut self,
event: Event<'a, C, E, I, R>,
state: &mut State<I, R>,
corpus: &mut C,
) -> Result<(), AflError> {
match event.handle_in_broker(state, corpus)? { match event.handle_in_broker(state, corpus)? {
BrokerEventResult::Forward => event.handle_in_client(state, corpus)?, BrokerEventResult::Forward => event.handle_in_client(state, corpus)?,
// Ignore broker-only events // Ignore broker-only events
@ -321,7 +331,7 @@ where
Ok(()) Ok(())
} }
fn process(&mut self, state: &mut State<I, R>, corpus: &mut C) -> Result<usize, AflError> { fn process(&mut self, _state: &mut State<I, R>, _corpus: &mut C) -> Result<usize, AflError> {
let c = self.count; let c = self.count;
self.count = 0; self.count = 0;
Ok(c) Ok(c)
@ -342,7 +352,7 @@ where
Self { Self {
writer: writer, writer: writer,
count: 0, count: 0,
phantom: PhantomData phantom: PhantomData,
} }
} }
} }

View File

@ -3,8 +3,8 @@ use core::ptr;
use crate::executors::{Executor, ExitKind}; use crate::executors::{Executor, ExitKind};
use crate::inputs::Input; use crate::inputs::Input;
use crate::observers::Observer;
use crate::observers::observer_serde::NamedSerdeAnyMap; use crate::observers::observer_serde::NamedSerdeAnyMap;
use crate::observers::Observer;
use crate::AflError; use crate::AflError;
type HarnessFunction<I> = fn(&dyn Executor<I>, &[u8]) -> ExitKind; type HarnessFunction<I> = fn(&dyn Executor<I>, &[u8]) -> ExitKind;

View File

@ -1,8 +1,8 @@
pub mod inmemory; pub mod inmemory;
use crate::inputs::Input; use crate::inputs::Input;
use crate::observers::Observer;
use crate::observers::observer_serde::NamedSerdeAnyMap; use crate::observers::observer_serde::NamedSerdeAnyMap;
use crate::observers::Observer;
use crate::AflError; use crate::AflError;
pub enum ExitKind { pub enum ExitKind {

View File

@ -2,10 +2,10 @@ use alloc::vec::Vec;
use core::marker::PhantomData; use core::marker::PhantomData;
use num::Integer; use num::Integer;
use crate::corpus::{Testcase, TestcaseMetadata}; use crate::corpus::Testcase;
use crate::inputs::Input; use crate::inputs::Input;
use crate::observers::{MapObserver, Observer};
use crate::observers::observer_serde::NamedSerdeAnyMap; use crate::observers::observer_serde::NamedSerdeAnyMap;
use crate::observers::MapObserver;
use crate::AflError; use crate::AflError;
pub trait Feedback<I> pub trait Feedback<I>
@ -13,11 +13,7 @@ where
I: Input, I: Input,
{ {
/// is_interesting should return the "Interestingness" from 0 to 255 (percent times 2.55) /// is_interesting should return the "Interestingness" from 0 to 255 (percent times 2.55)
fn is_interesting( fn is_interesting(&mut self, input: &I, observers: &NamedSerdeAnyMap) -> Result<u32, AflError>;
&mut self,
input: &I,
observers: &NamedSerdeAnyMap,
) -> Result<u32, AflError>;
/// Append to the testcase the generated metadata in case of a new corpus item /// Append to the testcase the generated metadata in case of a new corpus item
fn append_metadata(&mut self, _testcase: &mut Testcase<I>) -> Result<(), AflError> { fn append_metadata(&mut self, _testcase: &mut Testcase<I>) -> Result<(), AflError> {

View File

@ -27,18 +27,17 @@ pub trait Observer: SerdeAny + 'static {
crate::create_serde_registry_for_trait!(observer_serde, crate::observers::Observer); crate::create_serde_registry_for_trait!(observer_serde, crate::observers::Observer);
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct NopObserver { pub struct NopObserver {}
}
impl Observer for NopObserver { impl Observer for NopObserver {
fn name(&self) -> &'static str { fn name(&self) -> &'static str {
"aa" "aa"
} }
fn reset(&mut self) -> Result<(), AflError> { Ok(()) } fn reset(&mut self) -> Result<(), AflError> {
Ok(())
}
} }
impl SerdeAny for NopObserver impl SerdeAny for NopObserver {
{
fn as_any(&self) -> &dyn Any { fn as_any(&self) -> &dyn Any {
self self
} }

View File

@ -1,12 +1,7 @@
use hashbrown::HashMap;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use alloc::boxed::Box; use alloc::boxed::Box;
use core::any::{Any, TypeId}; use core::any::{Any, TypeId};
use core::default::Default;
use hashbrown::hash_map::{Keys, Values, ValuesMut};
use crate::AflError;
pub fn pack_type_id(id: u64) -> TypeId { pub fn pack_type_id(id: u64) -> TypeId {
unsafe { *(&id as *const u64 as *const TypeId) } unsafe { *(&id as *const u64 as *const TypeId) }
@ -37,11 +32,17 @@ where
pub type DeserializeCallback<B> = pub type DeserializeCallback<B> =
fn(&mut dyn erased_serde::Deserializer) -> Result<Box<B>, erased_serde::Error>; fn(&mut dyn erased_serde::Deserializer) -> Result<Box<B>, erased_serde::Error>;
pub struct DeserializeCallbackSeed<B> where B: ?Sized { pub struct DeserializeCallbackSeed<B>
where
B: ?Sized,
{
pub cb: DeserializeCallback<B>, pub cb: DeserializeCallback<B>,
} }
impl<'de, B> serde::de::DeserializeSeed<'de> for DeserializeCallbackSeed<B> where B: ?Sized { impl<'de, B> serde::de::DeserializeSeed<'de> for DeserializeCallbackSeed<B>
where
B: ?Sized,
{
type Value = Box<B>; type Value = Box<B>;
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
@ -56,20 +57,21 @@ impl<'de, B> serde::de::DeserializeSeed<'de> for DeserializeCallbackSeed<B> wher
#[macro_export] #[macro_export]
macro_rules! create_serde_registry_for_trait { macro_rules! create_serde_registry_for_trait {
($mod_name:ident, $trait_name:path) => { ($mod_name:ident, $trait_name:path) => {
pub mod $mod_name { pub mod $mod_name {
use alloc::boxed::Box;
use core::fmt;
use core::any::{Any, TypeId};
use serde::{Deserialize, Serialize};
use hashbrown::HashMap;
use hashbrown::hash_map::{Keys, Values, ValuesMut};
use alloc::boxed::Box;
use core::any::{Any, TypeId};
use core::fmt;
use serde::{Deserialize, Serialize};
use hashbrown::hash_map::{Keys, Values, ValuesMut};
use hashbrown::HashMap;
use $crate::serde_anymap::{
pack_type_id, unpack_type_id, DeserializeCallback, DeserializeCallbackSeed,
};
use $crate::AflError; use $crate::AflError;
use $crate::serde_anymap::{DeserializeCallback, DeserializeCallbackSeed, pack_type_id, unpack_type_id};
pub struct BoxDynVisitor {} pub struct BoxDynVisitor {}
impl<'de> serde::de::Visitor<'de> for BoxDynVisitor { impl<'de> serde::de::Visitor<'de> for BoxDynVisitor {
type Value = Box<dyn $trait_name>; type Value = Box<dyn $trait_name>;
@ -82,7 +84,7 @@ macro_rules! create_serde_registry_for_trait {
where where
V: serde::de::SeqAccess<'de>, V: serde::de::SeqAccess<'de>,
{ {
/*let id: u64 = visitor.next_element()?.unwrap(); let id: u64 = visitor.next_element()?.unwrap();
let cb = unsafe { let cb = unsafe {
*REGISTRY *REGISTRY
.deserializers .deserializers
@ -90,14 +92,13 @@ macro_rules! create_serde_registry_for_trait {
.unwrap() .unwrap()
.get(&id) .get(&id)
.expect("Cannot deserialize an unregistered type") .expect("Cannot deserialize an unregistered type")
};*/ };
//let seed = DeserializeCallbackSeed::<dyn $trait_name> { cb: cb }; let seed = DeserializeCallbackSeed::<dyn $trait_name> { cb: cb };
//let obj: Self::Value = visitor.next_element_seed(seed)?.unwrap(); let obj: Self::Value = visitor.next_element_seed(seed)?.unwrap();
let obj = Box::new(crate::observers::NopObserver::new());
Ok(obj) Ok(obj)
} }
} }
struct Registry { struct Registry {
deserializers: Option<HashMap<u64, DeserializeCallback<dyn $trait_name>>>, deserializers: Option<HashMap<u64, DeserializeCallback<dyn $trait_name>>>,
finalized: bool, finalized: bool,
@ -112,7 +113,8 @@ macro_rules! create_serde_registry_for_trait {
panic!("Registry is already finalized!"); panic!("Registry is already finalized!");
} }
let deserializers = self.deserializers.get_or_insert_with(|| HashMap::default()); let deserializers =
self.deserializers.get_or_insert_with(|| HashMap::default());
deserializers.insert(unpack_type_id(TypeId::of::<T>()), |de| { deserializers.insert(unpack_type_id(TypeId::of::<T>()), |de| {
Ok(Box::new(erased_serde::deserialize::<T>(de)?)) Ok(Box::new(erased_serde::deserialize::<T>(de)?))
}); });
@ -145,15 +147,13 @@ macro_rules! create_serde_registry_for_trait {
} }
} }
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct SerdeAnyMap pub struct SerdeAnyMap {
{
map: HashMap<u64, Box<dyn $trait_name>>, map: HashMap<u64, Box<dyn $trait_name>>,
} }
impl SerdeAnyMap impl SerdeAnyMap {
{
pub fn get<T>(&self) -> Option<&T> pub fn get<T>(&self) -> Option<&T>
where where
T: $trait_name, T: $trait_name,
@ -198,22 +198,18 @@ macro_rules! create_serde_registry_for_trait {
} }
} }
impl Default for SerdeAnyMap impl Default for SerdeAnyMap {
{
fn default() -> Self { fn default() -> Self {
Self::new() Self::new()
} }
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct NamedSerdeAnyMap pub struct NamedSerdeAnyMap {
{
map: HashMap<u64, HashMap<u64, Box<dyn $trait_name>>>, map: HashMap<u64, HashMap<u64, Box<dyn $trait_name>>>,
} }
impl NamedSerdeAnyMap impl NamedSerdeAnyMap {
{
pub fn get<T>(&self, name: &'static str) -> Option<&T> pub fn get<T>(&self, name: &'static str) -> Option<&T>
where where
T: Any, T: Any,
@ -226,7 +222,11 @@ macro_rules! create_serde_registry_for_trait {
} }
} }
pub fn by_typeid(&self, name: &'static str, typeid: &TypeId) -> Option<&dyn $trait_name> { pub fn by_typeid(
&self,
name: &'static str,
typeid: &TypeId,
) -> Option<&dyn $trait_name> {
match self.map.get(&unpack_type_id(*typeid)) { match self.map.get(&unpack_type_id(*typeid)) {
None => None, None => None,
Some(h) => h Some(h) => h
@ -247,7 +247,11 @@ macro_rules! create_serde_registry_for_trait {
} }
} }
pub fn by_typeid_mut(&mut self, name: &'static str, typeid: &TypeId) -> Option<&mut dyn $trait_name> { pub fn by_typeid_mut(
&mut self,
name: &'static str,
typeid: &TypeId,
) -> Option<&mut dyn $trait_name> {
match self.map.get_mut(&unpack_type_id(*typeid)) { match self.map.get_mut(&unpack_type_id(*typeid)) {
None => None, None => None,
Some(h) => h Some(h) => h
@ -256,20 +260,34 @@ macro_rules! create_serde_registry_for_trait {
} }
} }
pub fn get_all<T>(&self) -> Option<core::iter::Map<Values<'_, u64, Box<dyn $trait_name>>, fn(&Box<dyn $trait_name>) -> &T>> pub fn get_all<T>(
&self,
) -> Option<
core::iter::Map<
Values<'_, u64, Box<dyn $trait_name>>,
fn(&Box<dyn $trait_name>) -> &T,
>,
>
where where
T: Any, T: Any,
{ {
match self.map.get(&unpack_type_id(TypeId::of::<T>())) { match self.map.get(&unpack_type_id(TypeId::of::<T>())) {
None => None, None => None,
Some(h) => Some(h.values().map(|x| x.as_any().downcast_ref::<T>().unwrap())), Some(h) => {
Some(h.values().map(|x| x.as_any().downcast_ref::<T>().unwrap()))
}
} }
} }
pub fn all_by_typeid( pub fn all_by_typeid(
&self, &self,
typeid: &TypeId, typeid: &TypeId,
) -> Option<core::iter::Map<Values<'_, u64, Box<dyn $trait_name>>, fn(&Box<dyn $trait_name>) -> &dyn $trait_name>> { ) -> Option<
core::iter::Map<
Values<'_, u64, Box<dyn $trait_name>>,
fn(&Box<dyn $trait_name>) -> &dyn $trait_name,
>,
> {
match self.map.get(&unpack_type_id(*typeid)) { match self.map.get(&unpack_type_id(*typeid)) {
None => None, None => None,
Some(h) => Some(h.values().map(|x| x.as_ref())), Some(h) => Some(h.values().map(|x| x.as_ref())),
@ -278,7 +296,12 @@ macro_rules! create_serde_registry_for_trait {
pub fn get_all_mut<T>( pub fn get_all_mut<T>(
&mut self, &mut self,
) -> Option<core::iter::Map<ValuesMut<'_, u64, Box<dyn $trait_name>>, fn(&mut Box<dyn $trait_name>) -> &mut T>> ) -> Option<
core::iter::Map<
ValuesMut<'_, u64, Box<dyn $trait_name>>,
fn(&mut Box<dyn $trait_name>) -> &mut T,
>,
>
where where
T: Any, T: Any,
{ {
@ -294,7 +317,12 @@ macro_rules! create_serde_registry_for_trait {
pub fn all_by_typeid_mut( pub fn all_by_typeid_mut(
&mut self, &mut self,
typeid: &TypeId, typeid: &TypeId,
) -> Option<core::iter::Map<ValuesMut<'_, u64, Box<dyn $trait_name>>, fn(&mut Box<dyn $trait_name>) -> &mut dyn $trait_name>> { ) -> Option<
core::iter::Map<
ValuesMut<'_, u64, Box<dyn $trait_name>>,
fn(&mut Box<dyn $trait_name>) -> &mut dyn $trait_name,
>,
> {
match self.map.get_mut(&unpack_type_id(*typeid)) { match self.map.get_mut(&unpack_type_id(*typeid)) {
None => None, None => None,
Some(h) => Some(h.values_mut().map(|x| x.as_mut())), Some(h) => Some(h.values_mut().map(|x| x.as_mut())),
@ -303,7 +331,10 @@ macro_rules! create_serde_registry_for_trait {
pub fn all_typeids( pub fn all_typeids(
&self, &self,
) -> core::iter::Map<Keys<'_, u64, HashMap<u64, Box<dyn $trait_name>>>, fn(&u64) -> TypeId> { ) -> core::iter::Map<
Keys<'_, u64, HashMap<u64, Box<dyn $trait_name>>>,
fn(&u64) -> TypeId,
> {
self.map.keys().map(|x| pack_type_id(*x)) self.map.keys().map(|x| pack_type_id(*x))
} }
@ -370,15 +401,13 @@ macro_rules! create_serde_registry_for_trait {
} }
} }
impl Default for NamedSerdeAnyMap impl Default for NamedSerdeAnyMap {
{
fn default() -> Self { fn default() -> Self {
Self::new() Self::new()
} }
} }
} }
impl<'a> serde::Serialize for dyn $trait_name { impl<'a> serde::Serialize for dyn $trait_name {
fn serialize<S>(&self, se: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, se: S) -> Result<S::Ok, S::Error>
where where
@ -393,7 +422,7 @@ macro_rules! create_serde_registry_for_trait {
seq.end() seq.end()
} }
} }
impl<'de> serde::Deserialize<'de> for Box<dyn $trait_name> { impl<'de> serde::Deserialize<'de> for Box<dyn $trait_name> {
fn deserialize<D>(deserializer: D) -> Result<Box<dyn $trait_name>, D::Error> fn deserialize<D>(deserializer: D) -> Result<Box<dyn $trait_name>, D::Error>
where where
@ -402,7 +431,6 @@ macro_rules! create_serde_registry_for_trait {
deserializer.deserialize_seq($mod_name::BoxDynVisitor {}) deserializer.deserialize_seq($mod_name::BoxDynVisitor {})
} }
} }
}; };
} }

View File

@ -56,11 +56,15 @@ where
let testcase_maybe = state.testcase_if_interesting(input_mut, fitness)?; let testcase_maybe = state.testcase_if_interesting(input_mut, fitness)?;
if let Some(testcase) = testcase_maybe { if let Some(testcase) = testcase_maybe {
//corpus.entries()[idx] //corpus.entries()[idx]
engine.events_manager_mut().fire(Event::NewTestcase { engine.events_manager_mut().fire(
sender_id: 0, Event::NewTestcase {
testcase: testcase, sender_id: 0,
phantom: PhantomData, testcase: testcase,
}, state, corpus)?; phantom: PhantomData,
},
state,
corpus,
)?;
} }
} }
Ok(()) Ok(())

View File

@ -303,7 +303,7 @@ pub const fn next_pow2(val: u64) -> u64 {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use xxhash_rust::xxh3::xxh3_64_with_seed; //use xxhash_rust::xxh3::xxh3_64_with_seed;
use crate::utils::{next_pow2, Rand, StdRand}; use crate::utils::{next_pow2, Rand, StdRand};