executor just executes
This commit is contained in:
parent
c9cc66311a
commit
f125029107
@ -1,14 +1,10 @@
|
|||||||
use alloc::boxed::Box;
|
|
||||||
use alloc::rc::Rc;
|
use alloc::rc::Rc;
|
||||||
use alloc::vec::Vec;
|
|
||||||
use core::cell::RefCell;
|
use core::cell::RefCell;
|
||||||
use core::ffi::c_void;
|
use core::ffi::c_void;
|
||||||
use core::ptr;
|
use core::ptr;
|
||||||
|
|
||||||
use crate::executors::{Executor, ExitKind};
|
use crate::executors::{Executor, ExitKind};
|
||||||
use crate::feedbacks::Feedback;
|
|
||||||
use crate::inputs::Input;
|
use crate::inputs::Input;
|
||||||
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;
|
||||||
@ -17,9 +13,7 @@ pub struct InMemoryExecutor<I>
|
|||||||
where
|
where
|
||||||
I: Input,
|
I: Input,
|
||||||
{
|
{
|
||||||
observers: Vec<Box<dyn Observer>>,
|
|
||||||
harness: HarnessFunction<I>,
|
harness: HarnessFunction<I>,
|
||||||
feedbacks: Vec<Box<dyn Feedback<I>>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<I> Into<Rc<RefCell<Self>>> for InMemoryExecutor<I>
|
impl<I> Into<Rc<RefCell<Self>>> for InMemoryExecutor<I>
|
||||||
@ -48,40 +42,6 @@ where
|
|||||||
}
|
}
|
||||||
Ok(ret)
|
Ok(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn reset_observers(&mut self) -> Result<(), AflError> {
|
|
||||||
for observer in &mut self.observers {
|
|
||||||
observer.reset()?;
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn post_exec_observers(&mut self) -> Result<(), AflError> {
|
|
||||||
self.observers
|
|
||||||
.iter_mut()
|
|
||||||
.map(|x| x.post_exec())
|
|
||||||
.fold(Ok(()), |acc, x| if x.is_err() { x } else { acc })
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add_observer(&mut self, observer: Box<dyn Observer>) {
|
|
||||||
self.observers.push(observer);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn observers(&self) -> &[Box<dyn Observer>] {
|
|
||||||
&self.observers
|
|
||||||
}
|
|
||||||
|
|
||||||
fn feedbacks(&self) -> &[Box<dyn Feedback<I>>] {
|
|
||||||
&self.feedbacks
|
|
||||||
}
|
|
||||||
|
|
||||||
fn feedbacks_mut(&mut self) -> &mut Vec<Box<dyn Feedback<I>>> {
|
|
||||||
&mut self.feedbacks
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add_feedback(&mut self, feedback: Box<dyn Feedback<I>>) {
|
|
||||||
self.feedbacks_mut().push(feedback);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<I> InMemoryExecutor<I>
|
impl<I> InMemoryExecutor<I>
|
||||||
@ -94,8 +54,6 @@ where
|
|||||||
os_signals::setup_crash_handlers::<I>();
|
os_signals::setup_crash_handlers::<I>();
|
||||||
}
|
}
|
||||||
InMemoryExecutor {
|
InMemoryExecutor {
|
||||||
observers: vec![],
|
|
||||||
feedbacks: vec![],
|
|
||||||
harness: harness_fn,
|
harness: harness_fn,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -199,12 +157,9 @@ compile_error!("InMemoryExecutor not yet supported on this OS");
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
|
||||||
use alloc::boxed::Box;
|
|
||||||
|
|
||||||
use crate::executors::inmemory::InMemoryExecutor;
|
use crate::executors::inmemory::InMemoryExecutor;
|
||||||
use crate::executors::{Executor, ExitKind};
|
use crate::executors::{Executor, ExitKind};
|
||||||
use crate::inputs::Input;
|
use crate::inputs::Input;
|
||||||
use crate::observers::Observer;
|
|
||||||
use crate::AflError;
|
use crate::AflError;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
@ -218,17 +173,6 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Nopserver {}
|
|
||||||
|
|
||||||
impl Observer for Nopserver {
|
|
||||||
fn reset(&mut self) -> Result<(), AflError> {
|
|
||||||
Err(AflError::Unknown("Nop reset, testing only".into()))
|
|
||||||
}
|
|
||||||
fn post_exec(&mut self) -> Result<(), AflError> {
|
|
||||||
Err(AflError::Unknown("Nop exec, testing only".into()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
fn test_harness_fn_nop(_executor: &dyn Executor<NopInput>, buf: &[u8]) -> ExitKind {
|
fn test_harness_fn_nop(_executor: &dyn Executor<NopInput>, buf: &[u8]) -> ExitKind {
|
||||||
println!("Fake exec with buf of len {}", buf.len());
|
println!("Fake exec with buf of len {}", buf.len());
|
||||||
@ -240,14 +184,6 @@ mod tests {
|
|||||||
ExitKind::Ok
|
ExitKind::Ok
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_inmem_post_exec() {
|
|
||||||
let mut in_mem_executor = InMemoryExecutor::new(test_harness_fn_nop);
|
|
||||||
let nopserver = Nopserver {};
|
|
||||||
in_mem_executor.add_observer(Box::new(nopserver));
|
|
||||||
assert_eq!(in_mem_executor.post_exec_observers().is_err(), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_inmem_exec() {
|
fn test_inmem_exec() {
|
||||||
let mut in_mem_executor = InMemoryExecutor::new(test_harness_fn_nop);
|
let mut in_mem_executor = InMemoryExecutor::new(test_harness_fn_nop);
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
pub mod inmemory;
|
pub mod inmemory;
|
||||||
|
|
||||||
use alloc::boxed::Box;
|
|
||||||
use alloc::vec::Vec;
|
|
||||||
|
|
||||||
use crate::corpus::Testcase;
|
|
||||||
use crate::feedbacks::Feedback;
|
|
||||||
use crate::inputs::Input;
|
use crate::inputs::Input;
|
||||||
use crate::observers::Observer;
|
|
||||||
use crate::AflError;
|
use crate::AflError;
|
||||||
use alloc::rc::Rc;
|
|
||||||
use core::cell::RefCell;
|
|
||||||
|
|
||||||
pub enum ExitKind {
|
pub enum ExitKind {
|
||||||
Ok,
|
Ok,
|
||||||
@ -26,51 +18,4 @@ where
|
|||||||
{
|
{
|
||||||
/// Instruct the target about the input and run
|
/// Instruct the target about the input and run
|
||||||
fn run_target(&mut self, input: &I) -> Result<ExitKind, AflError>;
|
fn run_target(&mut self, input: &I) -> Result<ExitKind, AflError>;
|
||||||
|
|
||||||
/// Reset the state of all the observes linked to this executor
|
|
||||||
fn reset_observers(&mut self) -> Result<(), AflError>;
|
|
||||||
|
|
||||||
/// Run the post exec hook for all the observes linked to this executor
|
|
||||||
fn post_exec_observers(&mut self) -> Result<(), AflError>;
|
|
||||||
|
|
||||||
/// Add a linked observer
|
|
||||||
fn add_observer(&mut self, observer: Box<dyn Observer>);
|
|
||||||
|
|
||||||
/// Get the linked observers
|
|
||||||
fn observers(&self) -> &[Box<dyn Observer>];
|
|
||||||
|
|
||||||
/// Adds a feedback
|
|
||||||
fn add_feedback(&mut self, feedback: Box<dyn Feedback<I>>);
|
|
||||||
|
|
||||||
/// Returns vector of feebacks
|
|
||||||
fn feedbacks(&self) -> &[Box<dyn Feedback<I>>];
|
|
||||||
|
|
||||||
/// Returns vector of feebacks (mutable)
|
|
||||||
fn feedbacks_mut(&mut self) -> &mut Vec<Box<dyn Feedback<I>>>;
|
|
||||||
|
|
||||||
/// Runs the input and triggers observers and feedback
|
|
||||||
// TODO: Move to another struct, like evaluator?
|
|
||||||
fn evaluate_input(&mut self, input: &I) -> Result<bool, AflError> {
|
|
||||||
self.reset_observers()?;
|
|
||||||
self.run_target(input)?;
|
|
||||||
self.post_exec_observers()?;
|
|
||||||
|
|
||||||
let mut rate_acc = 0;
|
|
||||||
for feedback in self.feedbacks_mut() {
|
|
||||||
rate_acc += feedback.is_interesting(input)?;
|
|
||||||
}
|
|
||||||
|
|
||||||
if rate_acc >= 25 {
|
|
||||||
let testcase = Rc::new(RefCell::new(Testcase::new(input.clone())));
|
|
||||||
for feedback in self.feedbacks_mut() {
|
|
||||||
feedback.append_metadata(testcase.clone())?;
|
|
||||||
}
|
|
||||||
Ok(true)
|
|
||||||
} else {
|
|
||||||
for feedback in self.feedbacks_mut() {
|
|
||||||
feedback.discard_metadata()?;
|
|
||||||
}
|
|
||||||
Ok(false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user