diff --git a/src/corpus/testcase.rs b/src/corpus/testcase.rs index 007b0dbbae..52550e135b 100644 --- a/src/corpus/testcase.rs +++ b/src/corpus/testcase.rs @@ -4,7 +4,9 @@ use crate::AflError; use hashbrown::HashMap; use std::path::PathBuf; -pub trait TestcaseMetadata {} +pub trait TestcaseMetadata { + fn name(&self) -> &'static str; +} /* pub trait TestcaseTrait { @@ -35,7 +37,7 @@ where { input: Option, // TODO remove box filename: Option, - metadatas: HashMap>, + metadatas: HashMap<&'static str, Box>, } impl Testcase @@ -78,13 +80,13 @@ where } /// Get all the metadatas into an HashMap - pub fn metadatas(&mut self) -> &mut HashMap> { + pub fn metadatas(&mut self) -> &mut HashMap<&'static str, Box> { &mut self.metadatas } /// Add a metadata - pub fn add_metadata(&mut self, name: String, meta: Box) { - self.metadatas.insert(name, meta); + pub fn add_metadata(&mut self, meta: Box) { + self.metadatas.insert(meta.name(), meta); } /// Create a new DefaultTestcase instace given an input diff --git a/src/engines/mod.rs b/src/engines/mod.rs index 41398355b9..f406dd9d8b 100644 --- a/src/engines/mod.rs +++ b/src/engines/mod.rs @@ -1,4 +1,4 @@ -use crate::corpus::testcase::Testcase; +use crate::corpus::testcase::{Testcase, TestcaseMetadata}; use crate::corpus::Corpus; use crate::executors::Executor; use crate::feedbacks::Feedback; @@ -61,36 +61,33 @@ where fn evaluate_input_engine( &mut self, input: &mut I, - entry: Rc>>, + _entry: Rc>>, ) -> Result { self.executor_mut().reset_observers()?; self.executor_mut().run_target(input)?; self.executor_mut().post_exec_observers()?; - // TODO new method for this shit - let mut new_entry: Rc>> = - Rc::new(RefCell::new(Testcase::::default())); // lazy init + let mut metadatas: Vec> = vec![]; let mut rate_acc = 0; for feedback in self.feedbacks_mut() { let (rate, meta) = feedback.is_interesting(input); rate_acc += rate; if let Some(m) = meta { - if let Some(_) = new_entry { - } else { - new_entry = Some(Rc::new(RefCell::new(Testcase::::new(input.clone())))); - } - new_entry - .unwrap() - .borrow_mut() - .add_metadata("test".to_string(), m); + metadatas.push(m); } } if rate_acc >= 25 { - self.corpus_mut().add(new_entry.unwrap().clone()); - } + let new_entry = Rc::new(RefCell::new(Testcase::::new(input.clone()))); + for meta in metadatas { + new_entry.borrow_mut().add_metadata(meta); + } + self.corpus_mut().add(new_entry); - Ok(true) + Ok(true) + } else { + Ok(false) + } } }