TestcaseMetadata name()

This commit is contained in:
Andrea Fioraldi 2020-11-05 20:38:26 +01:00
parent 3e6bca34f1
commit 4b16b8a172
2 changed files with 20 additions and 21 deletions

View File

@ -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<I: Input> {
@ -35,7 +37,7 @@ where
{
input: Option<I>, // TODO remove box
filename: Option<PathBuf>,
metadatas: HashMap<String, Box<dyn TestcaseMetadata>>,
metadatas: HashMap<&'static str, Box<dyn TestcaseMetadata>>,
}
impl<I> Testcase<I>
@ -78,13 +80,13 @@ where
}
/// Get all the metadatas into an HashMap
pub fn metadatas(&mut self) -> &mut HashMap<String, Box<dyn TestcaseMetadata>> {
pub fn metadatas(&mut self) -> &mut HashMap<&'static str, Box<dyn TestcaseMetadata>> {
&mut self.metadatas
}
/// Add a metadata
pub fn add_metadata(&mut self, name: String, meta: Box<dyn TestcaseMetadata>) {
self.metadatas.insert(name, meta);
pub fn add_metadata(&mut self, meta: Box<dyn TestcaseMetadata>) {
self.metadatas.insert(meta.name(), meta);
}
/// Create a new DefaultTestcase instace given an input

View File

@ -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<RefCell<Testcase<I>>>,
_entry: Rc<RefCell<Testcase<I>>>,
) -> Result<bool, AflError> {
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<RefCell<Testcase<I>>> =
Rc::new(RefCell::new(Testcase::<I>::default())); // lazy init
let mut metadatas: Vec<Box<dyn TestcaseMetadata>> = 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::<I>::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::<I>::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)
}
}
}