From b49205144878b78cf85b4dbce55259e1412125fe Mon Sep 17 00:00:00 2001 From: Dominik Maier Date: Thu, 29 Oct 2020 12:20:47 +0100 Subject: [PATCH] initial mapfeedback --- src/feedbacks/mod.rs | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/feedbacks/mod.rs b/src/feedbacks/mod.rs index dabeebe69a..6b95341a04 100644 --- a/src/feedbacks/mod.rs +++ b/src/feedbacks/mod.rs @@ -1,6 +1,41 @@ use crate::corpus::Testcase; use crate::executors::Executor; +use crate::observers::MapObserver; pub trait Feedback { - fn is_interesting(&mut self, executor: &dyn Executor, entry: &dyn Testcase) -> f64; + /// 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, +} + +impl<'a> Feedback for CovFeedback<'a> { + fn is_interesting(&mut self, _executor: &dyn Executor, _entry: &dyn Testcase) -> u8 { + let mut interesting = 0; + // TODO: impl. correctly, optimize + for (virgin, map) in self.virgin_bits.iter_mut().zip(self.smo.get_map().iter()) { + if virgin != map { + *virgin = *map; + if interesting < 250 { + interesting += 25 + } + } + } + + interesting + } +} + +impl<'a> CovFeedback<'a> { + /// Create new CovFeedback using a static map observer + pub fn new(smo: &'a StaticMapObserver) -> Self { + CovFeedback { + smo: smo, + virgin_bits: vec![0; smo.get_map().len()], + } + } }