From a60ef073edf60f60ffc0d654507382a3d13bab3c Mon Sep 17 00:00:00 2001 From: Andrea Fioraldi Date: Wed, 17 Feb 2021 09:32:25 +0100 Subject: [PATCH] tuple for each --- libafl/src/bolts/tuples.rs | 76 ++++++++++++++++++++++++++++++++++++++ libafl/src/corpus/mod.rs | 2 + libafl/src/corpus/queue.rs | 11 ++++++ 3 files changed, 89 insertions(+) diff --git a/libafl/src/bolts/tuples.rs b/libafl/src/bolts/tuples.rs index 3163ee27f1..41df01bb77 100644 --- a/libafl/src/bolts/tuples.rs +++ b/libafl/src/bolts/tuples.rs @@ -181,6 +181,82 @@ where } } +macro_rules! tuple_for_each { + ($fn_name:ident, $trait_name:path, $tuple_name:ident, $body:expr) => { + mod $fn_name { + pub trait ForEach { + fn for_each(&self); + } + + impl ForEach for () { + fn for_each(&self) { } + } + + impl ForEach for (Head, Tail) + where + Head: $trait_name, + Tail: tuple_list::TupleList + ForEach, + { + fn for_each(&self) { + ($body)(&self.0); + self.1.for_each(); + } + } + } + { + use $fn_name::*; + + $tuple_name.for_each(); + }; + }; +} + +macro_rules! tuple_for_each_mut { + ($fn_name:ident, $trait_name:path, $tuple_name:ident, $body:expr) => { + mod $fn_name { + pub trait ForEachMut { + fn for_each_mut(&mut self); + } + + impl ForEachMut for () { + fn for_each_mut(&mut self) { } + } + + impl ForEachMut for (Head, Tail) + where + Head: $trait_name, + Tail: tuple_list::TupleList + ForEachMut, + { + fn for_each_mut(&mut self) { + ($body)(&mut self.0); + self.1.for_each_mut(); + } + } + } + { + use $fn_name::*; + + $tuple_name.for_each_mut(); + }; + }; +} + +/* +pub fn test_macros() { + + let mut t = tuple_list!(1, "a"); + + tuple_for_each!(f1, std::fmt::Display, t, |x| { + println!("{}", x); + }); + + tuple_for_each_mut!(f2, std::fmt::Display, t, |x| { + println!("{}", x); + }); + +} +*/ + /* // Define trait and implement it for several primitive types. diff --git a/libafl/src/corpus/mod.rs b/libafl/src/corpus/mod.rs index 659503a403..14b87341bd 100644 --- a/libafl/src/corpus/mod.rs +++ b/libafl/src/corpus/mod.rs @@ -43,6 +43,8 @@ where fn count(&self) -> usize { self.entries().len() } + + // TODO implement a was_fuzzed counter /// Add an entry to the corpus and return its index #[inline] diff --git a/libafl/src/corpus/queue.rs b/libafl/src/corpus/queue.rs index 08a7fa729f..1e90a6e0ce 100644 --- a/libafl/src/corpus/queue.rs +++ b/libafl/src/corpus/queue.rs @@ -114,6 +114,17 @@ where pub fn pos(&self) -> usize { self.pos } + + // TODO maybe impl HasCorpus + #[inline] + pub fn corpus(&self) -> &C { + &self.corpus + } + + #[inline] + pub fn corpus_mut(&mut self) -> &mut C { + &mut self.corpus + } } #[cfg(test)]