diff --git a/libafl/src/feedbacks/map.rs b/libafl/src/feedbacks/map.rs index 45747204ae..7f78ab0589 100644 --- a/libafl/src/feedbacks/map.rs +++ b/libafl/src/feedbacks/map.rs @@ -23,7 +23,7 @@ use crate::{ feedbacks::{Feedback, HasObserverName}, inputs::UsesInput, monitors::UserStats, - observers::{MapObserver, ObserversTuple}, + observers::{MapObserver, Observer, ObserversTuple, UsesObserver}, state::{HasClientPerfMonitor, HasMetadata, HasNamedMetadata}, Error, }; @@ -370,6 +370,14 @@ pub struct MapFeedback { phantom: PhantomData<(N, O, R, S, T)>, } +impl UsesObserver for MapFeedback +where + S: UsesInput, + O: Observer, +{ + type Observer = O; +} + impl Feedback for MapFeedback where N: IsNovel + Debug, diff --git a/libafl/src/observers/mod.rs b/libafl/src/observers/mod.rs index 3fcd2036e1..743d2c3c8f 100644 --- a/libafl/src/observers/mod.rs +++ b/libafl/src/observers/mod.rs @@ -48,6 +48,15 @@ use crate::{ Error, }; +/// Something that uses observer like mapfeedbacks +pub trait UsesObserver +where + S: UsesInput, +{ + /// The observer type used + type Observer: Observer; +} + /// Observers observe different information about the target. /// They can then be used by various sorts of feedback. pub trait Observer: Named + Debug diff --git a/libafl/src/stages/calibrate.rs b/libafl/src/stages/calibrate.rs index 96102b3b54..6a7300f5ff 100644 --- a/libafl/src/stages/calibrate.rs +++ b/libafl/src/stages/calibrate.rs @@ -15,14 +15,11 @@ use crate::{ corpus::{Corpus, CorpusId, SchedulerTestcaseMetaData}, events::{Event, EventFirer, LogSeverity}, executors::{Executor, ExitKind, HasObservers}, - feedbacks::{ - map::{IsNovel, MapFeedback, MapFeedbackMetadata, Reducer}, - HasObserverName, - }, + feedbacks::{map::MapFeedbackMetadata, HasObserverName}, fuzzer::Evaluator, inputs::UsesInput, monitors::UserStats, - observers::{MapObserver, ObserversTuple}, + observers::{MapObserver, ObserversTuple, UsesObserver}, schedulers::powersched::SchedulerMetadata, stages::Stage, state::{HasClientPerfMonitor, HasCorpus, HasMetadata, HasNamedMetadata, UsesState}, @@ -321,13 +318,10 @@ where { /// Create a new [`CalibrationStage`]. #[must_use] - pub fn new(map_feedback: &MapFeedback) -> Self + pub fn new(map_feedback: &F) -> Self where - O::Entry: - PartialEq + Default + Copy + 'static + Serialize + serde::de::DeserializeOwned + Debug, - R: Reducer, + F: HasObserverName + Named + UsesObserver, for<'it> O: AsIter<'it, Item = O::Entry>, - N: IsNovel, { Self { map_observer_name: map_feedback.observer_name().to_string(), @@ -340,13 +334,10 @@ where /// Create a new [`CalibrationStage`], but without checking stability. #[must_use] - pub fn ignore_stability(map_feedback: &MapFeedback) -> Self + pub fn ignore_stability(map_feedback: &F) -> Self where - O::Entry: - PartialEq + Default + Copy + 'static + Serialize + serde::de::DeserializeOwned + Debug, - R: Reducer, + F: HasObserverName + Named + UsesObserver, for<'it> O: AsIter<'it, Item = O::Entry>, - N: IsNovel, { Self { map_observer_name: map_feedback.observer_name().to_string(),