add debug stages
This commit is contained in:
parent
2427ae4703
commit
64bff97993
167
fuzzers/FRET/src/debug.rs
Normal file
167
fuzzers/FRET/src/debug.rs
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
use libafl::*;
|
||||||
|
use libafl_bolts::*;
|
||||||
|
use std::borrow::Cow;
|
||||||
|
use serde::*;
|
||||||
|
use serde::ser::Serialize;
|
||||||
|
use libafl::prelude::Feedback;
|
||||||
|
use libafl::prelude::Testcase;
|
||||||
|
use libafl::prelude::*;
|
||||||
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
|
pub struct DebugMetadata {
|
||||||
|
pub val: bool
|
||||||
|
}
|
||||||
|
libafl_bolts::impl_serdeany!(DebugMetadata);
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
|
||||||
|
/// The [`DebugFeedback`] reports the same value, always.
|
||||||
|
/// It can be used to enable or disable feedback results through composition.
|
||||||
|
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
|
pub enum DebugFeedback {
|
||||||
|
/// Always returns `true`
|
||||||
|
True,
|
||||||
|
/// Alsways returns `false`
|
||||||
|
False,
|
||||||
|
}
|
||||||
|
|
||||||
|
static mut counter : usize = 10;
|
||||||
|
|
||||||
|
impl<S> Feedback<S> for DebugFeedback
|
||||||
|
where
|
||||||
|
S: State,
|
||||||
|
{
|
||||||
|
#[inline]
|
||||||
|
#[allow(clippy::wrong_self_convention)]
|
||||||
|
fn is_interesting<EM, OT>(
|
||||||
|
&mut self,
|
||||||
|
_state: &mut S,
|
||||||
|
_manager: &mut EM,
|
||||||
|
_input: &S::Input,
|
||||||
|
_observers: &OT,
|
||||||
|
_exit_kind: &ExitKind,
|
||||||
|
) -> Result<bool, Error>
|
||||||
|
where
|
||||||
|
EM: EventFirer<State = S>,
|
||||||
|
OT: ObserversTuple<S>,
|
||||||
|
{
|
||||||
|
if unsafe { counter } > 0 {
|
||||||
|
unsafe { counter -= 1; }
|
||||||
|
return Ok(true);
|
||||||
|
} else {
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
Ok((*self).into())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "track_hit_feedbacks")]
|
||||||
|
fn last_result(&self) -> Result<bool, Error> {
|
||||||
|
Ok((*self).into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn append_metadata<EM, OT>(
|
||||||
|
&mut self,
|
||||||
|
state: &mut S,
|
||||||
|
_manager: &mut EM,
|
||||||
|
_observers: &OT,
|
||||||
|
testcase: &mut Testcase<<S>::Input>,
|
||||||
|
) -> Result<(), Error>
|
||||||
|
where
|
||||||
|
OT: ObserversTuple<S>,
|
||||||
|
EM: EventFirer<State = S>,
|
||||||
|
{
|
||||||
|
testcase.metadata_map_mut().insert(DebugMetadata { val: true });
|
||||||
|
eprintln!("Attach: {:?}",testcase.metadata::<DebugMetadata>());
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Named for DebugFeedback {
|
||||||
|
#[inline]
|
||||||
|
fn name(&self) -> &Cow<'static, str> {
|
||||||
|
static NAME: Cow<'static, str> = Cow::Borrowed("DebugFeedback");
|
||||||
|
&NAME
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DebugFeedback {
|
||||||
|
/// Creates a new [`DebugFeedback`] from the given boolean
|
||||||
|
#[must_use]
|
||||||
|
pub fn new(val: bool) -> Self {
|
||||||
|
Self::from(val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<bool> for DebugFeedback {
|
||||||
|
fn from(val: bool) -> Self {
|
||||||
|
if val {
|
||||||
|
Self::True
|
||||||
|
} else {
|
||||||
|
Self::False
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<DebugFeedback> for bool {
|
||||||
|
fn from(value: DebugFeedback) -> Self {
|
||||||
|
match value {
|
||||||
|
DebugFeedback::True => true,
|
||||||
|
DebugFeedback::False => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
|
||||||
|
/// The default mutational stage
|
||||||
|
#[derive(Clone, Debug, Default)]
|
||||||
|
pub struct DebugStage<E, OT> {
|
||||||
|
#[allow(clippy::type_complexity)]
|
||||||
|
phantom: PhantomData<(E, OT)>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E, OT> UsesState for DebugStage<E, OT>
|
||||||
|
where
|
||||||
|
E: UsesState,
|
||||||
|
{
|
||||||
|
type State = E::State;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E, OT> DebugStage<E, OT>
|
||||||
|
{
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self { phantom: PhantomData}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E, EM, OT, Z> Stage<E, EM, Z> for DebugStage<E, OT>
|
||||||
|
where
|
||||||
|
E: Executor<EM, Z> + HasObservers<Observers = OT>,
|
||||||
|
EM: EventFirer<State = Self::State>,
|
||||||
|
OT: ObserversTuple<Self::State>,
|
||||||
|
Self::State: HasCorpus + HasMetadata + HasNamedMetadata + HasExecutions,
|
||||||
|
Z: Evaluator<E, EM, State = Self::State>,
|
||||||
|
{
|
||||||
|
fn perform(
|
||||||
|
&mut self,
|
||||||
|
fuzzer: &mut Z,
|
||||||
|
executor: &mut E,
|
||||||
|
state: &mut Self::State,
|
||||||
|
manager: &mut EM
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
// eprintln!("DebugStage {:?}", state.current_testcase());
|
||||||
|
let testcase = state.current_testcase()?;
|
||||||
|
eprintln!("Stage: {:?}",testcase.metadata::<DebugMetadata>());
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn restart_progress_should_run(&mut self, state: &mut Self::State) -> Result<bool, Error> {
|
||||||
|
Ok(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn clear_restart_progress(&mut self, state: &mut Self::State) -> Result<(), Error> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user