Trait libafl::stages::Stage

source ·
pub trait Stage<E, EM, Z>: UsesState
where E: UsesState<State = Self::State>, EM: UsesState<State = Self::State>, Z: UsesState<State = Self::State>,
{ // Required methods fn restart_progress_should_run( &mut self, state: &mut Self::State ) -> Result<bool, Error>; fn clear_restart_progress( &mut self, state: &mut Self::State ) -> Result<(), Error>; fn perform( &mut self, fuzzer: &mut Z, executor: &mut E, state: &mut Self::State, manager: &mut EM ) -> Result<(), Error>; // Provided method fn perform_restartable( &mut self, fuzzer: &mut Z, executor: &mut E, state: &mut Self::State, manager: &mut EM ) -> Result<(), Error> { ... } }
Expand description

A stage is one step in the fuzzing process. Multiple stages will be scheduled one by one for each input.

Required Methods§

source

fn restart_progress_should_run( &mut self, state: &mut Self::State ) -> Result<bool, Error>

This method will be called before every call to Stage::perform. Initialize the restart tracking for this stage, if it is not yet initialized. On restart, this will be called again. As long as Stage::clear_restart_progress, all subsequent calls happen on restart. Returns true, if the stage’s Stage::perform method should run, else false.

source

fn clear_restart_progress( &mut self, state: &mut Self::State ) -> Result<(), Error>

Clear the current status tracking of the associated stage

source

fn perform( &mut self, fuzzer: &mut Z, executor: &mut E, state: &mut Self::State, manager: &mut EM ) -> Result<(), Error>

Run the stage.

Before a call to perform, Stage::restart_progress_should_run will be (must be!) called. After returning (so non-target crash or timeout in a restarting case), Stage::clear_restart_progress gets called. A call to Stage::perform_restartable will do these things implicitly.

Provided Methods§

source

fn perform_restartable( &mut self, fuzzer: &mut Z, executor: &mut E, state: &mut Self::State, manager: &mut EM ) -> Result<(), Error>

Run the stage, calling Stage::restart_progress_should_run and Stage::clear_restart_progress appropriately

Implementors§

source§

impl<C, E, EM, O, OT, Z> Stage<E, EM, Z> for CalibrationStage<C, O, OT, E::State>
where E: Executor<EM, Z> + HasObservers<Observers = OT>, EM: EventFirer<State = E::State>, O: MapObserver, C: AsRef<O>, for<'de> <O as MapObserver>::Entry: Serialize + Deserialize<'de> + 'static, OT: ObserversTuple<E::State>, E::State: HasCorpus + HasMetadata + HasNamedMetadata + HasExecutions, Z: Evaluator<E, EM, State = E::State>,

source§

impl<C, E, EM, O, Z> Stage<E, EM, Z> for ColorizationStage<C, E, EM, O, Z>
where EM: UsesState<State = E::State> + EventFirer, E: HasObservers + Executor<EM, Z>, E::State: HasCorpus + HasMetadata + HasRand + HasNamedMetadata, E::Input: HasBytesVec, O: MapObserver, C: AsRef<O> + Named, Z: UsesState<State = E::State>,

source§

impl<C, E, EM, O, Z> Stage<E, EM, Z> for GeneralizationStage<C, EM, O, E::Observers, Z>

source§

impl<CB, E, EM, ST1, ST2, Z> Stage<E, EM, Z> for IfElseStage<CB, E, EM, ST1, ST2, Z>
where CB: FnMut(&mut Z, &mut E, &mut E::State, &mut EM) -> Result<bool, Error>, E: UsesState, EM: UsesState<State = E::State>, ST1: StagesTuple<E, EM, E::State, Z>, ST2: StagesTuple<E, EM, E::State, Z>, Z: UsesState<State = E::State>, E::State: HasNestedStageStatus,

source§

impl<CB, E, EM, ST, Z> Stage<E, EM, Z> for IfStage<CB, E, EM, ST, Z>
where CB: FnMut(&mut Z, &mut E, &mut E::State, &mut EM) -> Result<bool, Error>, E: UsesState, EM: UsesState<State = E::State>, ST: StagesTuple<E, EM, E::State, Z>, Z: UsesState<State = E::State>, E::State: HasNestedStageStatus,

source§

impl<CB, E, EM, ST, Z> Stage<E, EM, Z> for WhileStage<CB, E, EM, ST, Z>
where CB: FnMut(&mut Z, &mut E, &mut E::State, &mut EM) -> Result<bool, Error>, E: UsesState, EM: UsesState<State = E::State>, ST: StagesTuple<E, EM, E::State, Z>, Z: UsesState<State = E::State>, E::State: HasNestedStageStatus,

source§

impl<CB, E, EM, Z> Stage<E, EM, Z> for DumpToDiskStage<CB, EM, Z>
where CB: FnMut(&<Z::State as UsesInput>::Input, &Z::State) -> Vec<u8>, EM: UsesState<State = Z::State>, E: UsesState<State = Z::State>, Z: UsesState, Z::State: HasCorpus + HasSolutions + HasRand + HasMetadata,

source§

impl<CB, E, EM, Z> Stage<E, EM, Z> for ClosureStage<CB, E, EM, Z>
where CB: FnMut(&mut Z, &mut E, &mut E::State, &mut EM) -> Result<(), Error>, E: UsesState, EM: UsesState<State = E::State>, Z: UsesState<State = E::State>, E::State: HasNamedMetadata,

source§

impl<CB, E, EM, Z> Stage<E, EM, Z> for SyncFromDiskStage<CB, E, EM, Z>
where CB: FnMut(&mut Z, &mut Z::State, &Path) -> Result<<Z::State as UsesInput>::Input, Error>, E: UsesState<State = Z::State>, EM: UsesState<State = Z::State>, Z: Evaluator<E, EM>, Z::State: HasCorpus + HasRand + HasMetadata + HasNamedMetadata,

source§

impl<CS, E, EM, F1, F2, FF, I, IP, M, OT, Z> Stage<E, EM, Z> for StdTMinMutationalStage<CS, E, EM, F1, F2, FF, I, IP, M, OT, Z>
where CS: Scheduler + RemovableScheduler, CS::State: HasCorpus + HasSolutions + HasExecutions + HasMaxSize + HasMetadata, <CS::State as UsesInput>::Input: HasLen + Hash, E: Executor<EM, Z> + HasObservers<Observers = OT, State = CS::State>, EM: EventFirer<State = CS::State>, F1: Feedback<CS::State>, F2: Feedback<CS::State>, FF: FeedbackFactory<F2, CS::State, OT>, M: Mutator<I, CS::State>, OT: ObserversTuple<CS::State>, Z: ExecutionProcessor<OT, State = CS::State> + ExecutesInput<E, EM> + HasFeedback<Feedback = F1> + HasScheduler<Scheduler = CS>, IP: MutatedTransformPost<CS::State> + Clone, I: MutatedTransform<CS::Input, CS::State, Post = IP> + Clone,

source§

impl<CS, E, EM, OT, PS, Z> Stage<E, EM, Z> for PushStageAdapter<CS, EM, OT, PS, Z>
where CS: Scheduler, CS::State: HasExecutions + HasMetadata + HasRand + HasCorpus + HasLastReportTime + HasCurrentCorpusIdx, E: Executor<EM, Z> + HasObservers<Observers = OT, State = CS::State>, EM: EventFirer<State = CS::State> + EventRestarter + HasEventManagerId + ProgressReporter<State = CS::State>, OT: ObserversTuple<CS::State>, PS: PushStage<CS, EM, OT, Z>, Z: ExecutesInput<E, EM, State = CS::State> + ExecutionProcessor<OT, State = CS::State> + EvaluatorObservers<OT> + HasScheduler<Scheduler = CS>,

source§

impl<E, EM, I, M, Z> Stage<E, EM, Z> for MultiMutationalStage<E, EM, I, M, Z>
where E: UsesState<State = Z::State>, EM: UsesState<State = Z::State>, M: MultiMutator<I, Z::State>, Z: Evaluator<E, EM>, Z::State: HasCorpus + HasRand + HasNamedMetadata, I: MutatedTransform<Self::Input, Self::State> + Clone,

source§

impl<E, EM, I, M, Z> Stage<E, EM, Z> for StdMutationalStage<E, EM, I, M, Z>
where E: UsesState<State = Z::State>, EM: UsesState<State = Z::State>, M: Mutator<I, Z::State>, Z: Evaluator<E, EM>, Z::State: HasCorpus + HasRand + HasMetadata + HasExecutions, I: MutatedTransform<Self::Input, Self::State> + Clone,

source§

impl<E, EM, I, M, Z> Stage<E, EM, Z> for TuneableMutationalStage<E, EM, I, M, Z>
where E: UsesState<State = Z::State>, EM: UsesState<State = Z::State>, M: Mutator<I, Z::State>, Z: Evaluator<E, EM>, Z::State: HasCorpus + HasRand + HasNamedMetadata + HasMetadata + HasExecutions, I: MutatedTransform<Z::Input, Z::State> + Clone,

source§

impl<E, EM, IC, ICB, DI, S, SP, Z> Stage<E, EM, Z> for SyncFromBrokerStage<DI, IC, ICB, S, SP>
where EM: UsesState<State = S> + EventFirer, S: State + HasExecutions + HasCorpus + HasRand + HasMetadata + HasTestcase, SP: ShMemProvider, E: HasObservers<State = S> + Executor<EM, Z>, for<'a> E::Observers: Deserialize<'a>, Z: EvaluatorObservers<E::Observers, State = S> + ExecutionProcessor<E::Observers, State = S>, IC: InputConverter<From = S::Input, To = DI>, ICB: InputConverter<From = DI, To = S::Input>, DI: Input,

source§

impl<E, EM, SOT, Z> Stage<ShadowExecutor<E, SOT>, EM, Z> for ShadowTracingStage<E, EM, SOT, Z>
where E: Executor<EM, Z> + HasObservers, EM: UsesState<State = E::State>, SOT: ObserversTuple<E::State>, Z: UsesState<State = E::State>, E::State: State + HasExecutions + HasCorpus + HasNamedMetadata + Debug,

source§

impl<E, EM, ST, Z> Stage<E, EM, Z> for OptionalStage<E, EM, ST, Z>
where E: UsesState, EM: UsesState<State = E::State>, ST: StagesTuple<E, EM, E::State, Z>, Z: UsesState<State = E::State>, E::State: HasNestedStageStatus,

source§

impl<E, EM, TE, Z> Stage<E, EM, Z> for ConcolicTracingStage<EM, TE, Z>
where E: UsesState<State = TE::State>, EM: UsesState<State = TE::State>, TE: Executor<EM, Z> + HasObservers, TE::State: HasExecutions + HasCorpus + HasNamedMetadata, Z: UsesState<State = TE::State>,

source§

impl<E, EM, TE, Z> Stage<E, EM, Z> for TracingStage<EM, TE, Z>
where E: UsesState<State = TE::State>, TE: Executor<EM, Z> + HasObservers, TE::State: HasExecutions + HasCorpus + HasNamedMetadata, EM: UsesState<State = TE::State>, Z: UsesState<State = TE::State>,

source§

impl<E, EM, Z> Stage<E, EM, Z> for SimpleConcolicMutationalStage<Z>
where E: UsesState<State = Z::State>, EM: UsesState<State = Z::State>, Z: Evaluator<E, EM>, Z::Input: HasBytesVec, Z::State: State + HasExecutions + HasCorpus + HasMetadata,

source§

impl<E, EM, Z> Stage<E, EM, Z> for AflStatsStage<E, EM, Z>
where E: UsesState, EM: EventFirer<State = E::State>, Z: UsesState<State = E::State>, E::State: HasImported + HasCorpus + HasMetadata,

source§

impl<E, F, EM, I, M, Z> Stage<E, EM, Z> for PowerMutationalStage<E, F, EM, I, M, Z>
where E: Executor<EM, Z> + HasObservers, EM: UsesState<State = E::State>, F: TestcaseScore<E::State>, M: Mutator<I, E::State>, E::State: HasCorpus + HasMetadata + HasRand + HasExecutions, Z: Evaluator<E, EM, State = E::State>, I: MutatedTransform<E::Input, E::State> + Clone,

source§

impl<S, E, EM, Z> Stage<E, EM, Z> for StringIdentificationStage<S>
where S: HasTestcase<Input = BytesInput> + HasCorpus + State, E: UsesState<State = S>, EM: UsesState<State = S>, Z: UsesState<State = S>,