diff --git a/fuzzers/baby_fuzzer_minimizing/src/main.rs b/fuzzers/baby_fuzzer_minimizing/src/main.rs index 640e8c49e9..cf7baf17e1 100644 --- a/fuzzers/baby_fuzzer_minimizing/src/main.rs +++ b/fuzzers/baby_fuzzer_minimizing/src/main.rs @@ -124,7 +124,7 @@ pub fn main() -> Result<(), Error> { let minimizer = StdScheduledMutator::new(havoc_mutations()); let mut stages = tuple_list!(StdTMinMutationalStage::new( minimizer, - CrashFeedbackFactory::default(), + CrashFeedback::new(), 1 << 10 )); diff --git a/libafl/src/feedbacks/differential.rs b/libafl/src/feedbacks/differential.rs index b375abd391..fd32b31edf 100644 --- a/libafl/src/feedbacks/differential.rs +++ b/libafl/src/feedbacks/differential.rs @@ -13,7 +13,7 @@ use serde::{Deserialize, Serialize}; use crate::{ events::EventFirer, executors::ExitKind, - feedbacks::Feedback, + feedbacks::{Feedback, FeedbackFactory}, inputs::Input, observers::{Observer, ObserversTuple}, state::State, @@ -89,6 +89,26 @@ where } } +impl FeedbackFactory, S, T> + for DiffFeedback +where + F: FnMut(&O1, &O2) -> DiffResult + Clone, + I: Input, + O1: Observer + Named, + O2: Observer + Named, + S: HasMetadata + State, +{ + fn create_feedback(&self, _ctx: &T) -> DiffFeedback { + Self { + name: self.name.clone(), + o1_name: self.o1_name.clone(), + o2_name: self.o2_name.clone(), + compare_fn: self.compare_fn.clone(), + phantomm: self.phantomm, + } + } +} + impl Named for DiffFeedback where F: FnMut(&O1, &O2) -> DiffResult, diff --git a/libafl/src/feedbacks/mod.rs b/libafl/src/feedbacks/mod.rs index 6793833ddd..8d149bb3f7 100644 --- a/libafl/src/feedbacks/mod.rs +++ b/libafl/src/feedbacks/mod.rs @@ -276,6 +276,22 @@ where } } +impl FeedbackFactory, S, T> + for CombinedFeedback +where + A: Feedback + FeedbackFactory, + B: Feedback + FeedbackFactory, + FL: FeedbackLogic, + S: State, +{ + fn create_feedback(&self, ctx: &T) -> CombinedFeedback { + CombinedFeedback::new( + self.first.create_feedback(ctx), + self.second.create_feedback(ctx), + ) + } +} + /// Logical combination of two feedbacks pub trait FeedbackLogic: 'static where @@ -842,8 +858,11 @@ impl Default for CrashFeedback { } } -/// A feedback factory for crash feedbacks -pub type CrashFeedbackFactory = DefaultFeedbackFactory; +impl FeedbackFactory for CrashFeedback { + fn create_feedback(&self, _ctx: &T) -> CrashFeedback { + CrashFeedback::new() + } +} /// A [`TimeoutFeedback`] reduces the timeout value of a run. #[derive(Serialize, Deserialize, Clone, Debug)] diff --git a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/tmin.rs b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/tmin.rs index aae4d56a83..ed38c8ed85 100644 --- a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/tmin.rs +++ b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/tmin.rs @@ -7,7 +7,7 @@ use libafl::{ corpus::{Corpus, HasTestcase, InMemoryCorpus, Testcase}, events::SimpleEventManager, executors::{inprocess_fork::InProcessForkExecutor, ExitKind}, - feedbacks::{CrashFeedbackFactory, TimeoutFeedbackFactory}, + feedbacks::{CrashFeedback, TimeoutFeedbackFactory}, inputs::{BytesInput, HasBytesVec, HasTargetBytes}, mutators::{havoc_mutations_no_crossover, Mutator, StdScheduledMutator}, schedulers::QueueScheduler, @@ -79,7 +79,7 @@ fn minimize_crash_with_mutator>( match exit_kind { ExitKind::Crash => { - let factory = CrashFeedbackFactory::default(); + let factory = CrashFeedback::new(); let tmin = StdTMinMutationalStage::new( mutator, factory,