exit kind for the feedback

This commit is contained in:
Andrea Fioraldi 2021-02-15 11:06:04 +01:00
parent 7a75155e6b
commit 05c312b2bd
5 changed files with 17 additions and 10 deletions

View File

@ -21,6 +21,7 @@ use crate::{
feedbacks::FeedbacksTuple, feedbacks::FeedbacksTuple,
inputs::Input, inputs::Input,
state::State, state::State,
executors::ExitKind,
stats::Stats, stats::Stats,
utils::Rand, utils::Rand,
AflError, AflError,
@ -278,7 +279,8 @@ where
#[cfg(feature = "std")] #[cfg(feature = "std")]
println!("Received new Testcase"); println!("Received new Testcase");
let observers = postcard::from_bytes(&observers_buf)?; let observers = postcard::from_bytes(&observers_buf)?;
let interestingness = state.is_interesting(&input, &observers)?; // TODO include ExitKind in NewTestcase
let interestingness = state.is_interesting(&input, &observers, ExitKind::Ok)?;
state.add_if_interesting(input, interestingness)?; state.add_if_interesting(input, interestingness)?;
Ok(()) Ok(())
} }

View File

@ -20,6 +20,7 @@ use crate::{
}; };
/// How an execution finished. /// How an execution finished.
#[derive(Debug, Clone)]
pub enum ExitKind { pub enum ExitKind {
Ok, Ok,
Crash, Crash,

View File

@ -11,6 +11,7 @@ use serde::{Deserialize, Serialize};
use crate::{ use crate::{
bolts::tuples::{Named, TupleList}, bolts::tuples::{Named, TupleList},
executors::ExitKind,
corpus::Testcase, corpus::Testcase,
inputs::Input, inputs::Input,
observers::{MapObserver, Observer, ObserversTuple}, observers::{MapObserver, Observer, ObserversTuple},
@ -35,6 +36,7 @@ where
&mut self, &mut self,
input: &I, input: &I,
observers: &OT, observers: &OT,
exit_kind: ExitKind,
) -> Result<u32, AflError>; ) -> Result<u32, AflError>;
/// Append to the testcase the generated metadata in case of a new corpus item /// Append to the testcase the generated metadata in case of a new corpus item
@ -83,6 +85,7 @@ where
&mut self, &mut self,
input: &I, input: &I,
observers: &OT, observers: &OT,
exit_kind: ExitKind,
) -> Result<u32, AflError>; ) -> Result<u32, AflError>;
/// Write metadata for this testcase /// Write metadata for this testcase
@ -103,7 +106,7 @@ where
I: Input, I: Input,
{ {
#[inline] #[inline]
fn is_interesting_all<OT: ObserversTuple>(&mut self, _: &I, _: &OT) -> Result<u32, AflError> { fn is_interesting_all<OT: ObserversTuple>(&mut self, _: &I, _: &OT, _: ExitKind,) -> Result<u32, AflError> {
Ok(0) Ok(0)
} }
@ -134,9 +137,10 @@ where
&mut self, &mut self,
input: &I, input: &I,
observers: &OT, observers: &OT,
exit_kind: ExitKind,
) -> Result<u32, AflError> { ) -> Result<u32, AflError> {
Ok(self.0.is_interesting(input, observers)? Ok(self.0.is_interesting(input, observers, exit_kind.clone())?
+ self.1.is_interesting_all(input, observers)?) + self.1.is_interesting_all(input, observers, exit_kind)?)
} }
fn append_metadata_all(&mut self, testcase: &mut Testcase<I>) -> Result<(), AflError> { fn append_metadata_all(&mut self, testcase: &mut Testcase<I>) -> Result<(), AflError> {
@ -243,6 +247,7 @@ where
&mut self, &mut self,
_input: &I, _input: &I,
observers: &OT, observers: &OT,
_exit_kind: ExitKind,
) -> Result<u32, AflError> { ) -> Result<u32, AflError> {
let mut interesting = 0; let mut interesting = 0;
// TODO optimize // TODO optimize

View File

@ -81,7 +81,6 @@ where
if fitness > 0 { if fitness > 0 {
let observers_buf = manager.serialize_observers(observers)?; let observers_buf = manager.serialize_observers(observers)?;
// TODO decouple events manager and engine
manager.fire( manager.fire(
state, state,
Event::NewTestcase { Event::NewTestcase {

View File

@ -12,7 +12,7 @@ use crate::{
bolts::serdeany::{SerdeAny, SerdeAnyMap}, bolts::serdeany::{SerdeAny, SerdeAnyMap},
corpus::{Corpus, Testcase}, corpus::{Corpus, Testcase},
events::{Event, EventManager, LogSeverity}, events::{Event, EventManager, LogSeverity},
executors::{Executor, HasObservers}, executors::{Executor, HasObservers, ExitKind},
feedbacks::FeedbacksTuple, feedbacks::FeedbacksTuple,
generators::Generator, generators::Generator,
inputs::Input, inputs::Input,
@ -248,11 +248,11 @@ where
// TODO move some of these, like evaluate_input, to FuzzingEngine // TODO move some of these, like evaluate_input, to FuzzingEngine
#[inline] #[inline]
pub fn is_interesting<OT>(&mut self, input: &I, observers: &OT) -> Result<u32, AflError> pub fn is_interesting<OT>(&mut self, input: &I, observers: &OT, exit_kind: ExitKind) -> Result<u32, AflError>
where where
OT: ObserversTuple, OT: ObserversTuple,
{ {
Ok(self.feedbacks_mut().is_interesting_all(input, observers)?) Ok(self.feedbacks_mut().is_interesting_all(input, observers, exit_kind)?)
} }
/// Runs the input and triggers observers and feedback /// Runs the input and triggers observers and feedback
@ -271,14 +271,14 @@ where
executor.pre_exec_observers()?; executor.pre_exec_observers()?;
executor.pre_exec(self, event_mgr, input)?; executor.pre_exec(self, event_mgr, input)?;
executor.run_target(input)?; let exit_kind = executor.run_target(input)?;
executor.post_exec(&self, event_mgr, input)?; executor.post_exec(&self, event_mgr, input)?;
self.set_executions(self.executions() + 1); self.set_executions(self.executions() + 1);
executor.post_exec_observers()?; executor.post_exec_observers()?;
let observers = executor.observers(); let observers = executor.observers();
let fitness = self.feedbacks_mut().is_interesting_all(&input, observers)?; let fitness = self.feedbacks_mut().is_interesting_all(&input, observers, exit_kind)?;
Ok(fitness) Ok(fitness)
} }