diff --git a/fuzzers/tutorial/src/metadata.rs b/fuzzers/tutorial/src/metadata.rs index cc410cdbdd..785a0e701c 100644 --- a/fuzzers/tutorial/src/metadata.rs +++ b/fuzzers/tutorial/src/metadata.rs @@ -3,10 +3,9 @@ use libafl::{ events::EventFirer, executors::ExitKind, feedbacks::{Feedback, MapIndexesMetadata}, - inputs::UsesInput, observers::ObserversTuple, schedulers::{MinimizerScheduler, TestcaseScore}, - state::{HasClientPerfMonitor, HasCorpus, HasMetadata}, + state::{HasCorpus, HasMetadata, State}, Error, }; use libafl_bolts::{Named, SerdeAny}; @@ -43,7 +42,7 @@ pub struct PacketLenFeedback { impl Feedback for PacketLenFeedback where - S: UsesInput + HasClientPerfMonitor, + S: State, { #[inline] fn is_interesting( diff --git a/libafl/Cargo.toml b/libafl/Cargo.toml index 91c01fdcfb..6572692380 100644 --- a/libafl/Cargo.toml +++ b/libafl/Cargo.toml @@ -29,6 +29,9 @@ std = ["serde_json", "serde_json/std", "nix", "serde/std", "bincode", "wait-time ## Collects performance statistics of the fuzzing pipeline and displays it on `Monitor` components introspection = [] +## Collects stats about scalability +scalability_introspecition = [] + ## Will build the `pyo3` bindings python = ["pyo3", "concat-idents", "libafl_bolts/python"] diff --git a/libafl/src/events/centralized.rs b/libafl/src/events/centralized.rs index 1258439842..c0ecf669b3 100644 --- a/libafl/src/events/centralized.rs +++ b/libafl/src/events/centralized.rs @@ -29,7 +29,7 @@ use crate::{ fuzzer::{EvaluatorObservers, ExecutionProcessor}, inputs::{Input, UsesInput}, observers::ObserversTuple, - state::{HasClientPerfMonitor, HasExecutions, HasLastReportTime, HasMetadata, UsesState}, + state::{HasExecutions, HasLastReportTime, HasMetadata, UsesState}, Error, }; @@ -417,7 +417,7 @@ where impl EventManager for CentralizedEventManager where EM: EventStatsCollector + EventManager, - EM::State: HasClientPerfMonitor + HasExecutions + HasMetadata + HasLastReportTime, + EM::State: HasExecutions + HasMetadata + HasLastReportTime, E: HasObservers + Executor, for<'a> E::Observers: Deserialize<'a>, Z: EvaluatorObservers @@ -445,7 +445,7 @@ where impl ProgressReporter for CentralizedEventManager where EM: EventStatsCollector + ProgressReporter + HasEventManagerId, - EM::State: HasClientPerfMonitor + HasMetadata + HasExecutions + HasLastReportTime, + EM::State: HasMetadata + HasExecutions + HasLastReportTime, SP: ShMemProvider + 'static, { } @@ -652,13 +652,27 @@ where } => { log::info!("Received new Testcase from {client_id:?} ({client_config:?}, forward {forward_id:?})"); + #[cfg(feature = "scalability_introspection")] + println!( + "{} {}", + state.scalability_monitor().testcase_with_observers, + state.scalability_monitor().testcase_without_observers + ); let res = if client_config.match_with(&self.configuration()) && observers_buf.is_some() { let observers: E::Observers = postcard::from_bytes(observers_buf.as_ref().unwrap())?; + #[cfg(feature = "scalability_introspection")] + { + state.scalability_monitor_mut().testcase_with_observers += 1; + } fuzzer.process_execution(state, self, input, &observers, &exit_kind, true)? } else { + #[cfg(feature = "scalability_introspection")] + { + state.scalability_monitor_mut().testcase_without_observers += 1; + } let res = fuzzer.evaluate_input_with_observers::( state, executor, diff --git a/libafl/src/events/launcher.rs b/libafl/src/events/launcher.rs index 3c45c62b03..a91d3408c2 100644 --- a/libafl/src/events/launcher.rs +++ b/libafl/src/events/launcher.rs @@ -38,18 +38,15 @@ use libafl_bolts::{ shmem::ShMemProvider, }; #[cfg(feature = "std")] -use serde::de::DeserializeOwned; -#[cfg(feature = "std")] use typed_builder::TypedBuilder; #[cfg(all(unix, feature = "std", feature = "fork"))] use crate::events::{CentralizedEventManager, CentralizedLlmpEventBroker}; -use crate::inputs::UsesInput; #[cfg(feature = "std")] use crate::{ events::{EventConfig, LlmpRestartingEventManager, ManagerKind, RestartingMgr}, monitors::Monitor, - state::{HasClientPerfMonitor, HasExecutions}, + state::{HasExecutions, State}, Error, }; @@ -76,7 +73,7 @@ where S::Input: 'a, MT: Monitor, SP: ShMemProvider + 'static, - S: DeserializeOwned + UsesInput + 'a, + S: State + 'a, { /// The ShmemProvider to use shmem_provider: SP, @@ -121,7 +118,7 @@ where CF: FnOnce(Option, LlmpRestartingEventManager, CoreId) -> Result<(), Error>, MT: Monitor + Clone, SP: ShMemProvider + 'static, - S: DeserializeOwned + UsesInput, + S: State, { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { f.debug_struct("Launcher") @@ -141,7 +138,7 @@ impl<'a, CF, MT, S, SP> Launcher<'a, CF, MT, S, SP> where CF: FnOnce(Option, LlmpRestartingEventManager, CoreId) -> Result<(), Error>, MT: Monitor + Clone, - S: DeserializeOwned + UsesInput + HasExecutions + HasClientPerfMonitor, + S: State + HasExecutions, SP: ShMemProvider + 'static, { /// Launch the broker and the clients and fuzz @@ -401,7 +398,7 @@ where S::Input: 'a, MT: Monitor, SP: ShMemProvider + 'static, - S: DeserializeOwned + UsesInput + 'a, + S: State + 'a, { /// The ShmemProvider to use shmem_provider: SP, @@ -454,7 +451,7 @@ where ) -> Result<(), Error>, MT: Monitor + Clone, SP: ShMemProvider + 'static, - S: DeserializeOwned + UsesInput, + S: State, { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { f.debug_struct("Launcher") @@ -478,7 +475,7 @@ where CoreId, ) -> Result<(), Error>, MT: Monitor + Clone, - S: DeserializeOwned + UsesInput + HasExecutions + HasClientPerfMonitor, + S: State + HasExecutions, SP: ShMemProvider + 'static, { /// Launch the broker and the clients and fuzz diff --git a/libafl/src/events/llmp.rs b/libafl/src/events/llmp.rs index 53d0718ca0..939ceda89b 100644 --- a/libafl/src/events/llmp.rs +++ b/libafl/src/events/llmp.rs @@ -52,7 +52,7 @@ use crate::{ inputs::{Input, InputConverter, UsesInput}, monitors::Monitor, observers::ObserversTuple, - state::{HasClientPerfMonitor, HasExecutions, HasLastReportTime, HasMetadata, UsesState}, + state::{HasExecutions, HasLastReportTime, HasMetadata, State, UsesState}, Error, }; @@ -345,7 +345,7 @@ pub trait EventStatsCollector {} /// using low-level message passing, [`libafl_bolts::llmp`]. pub struct LlmpEventManager where - S: UsesInput, + S: State, SP: ShMemProvider + 'static, { /// The LLMP client for inter process communication @@ -373,7 +373,7 @@ where impl EventStatsCollector for LlmpEventManager where SP: ShMemProvider + 'static, - S: UsesInput, + S: State, { fn serialization_time(&self) -> Duration { self.serialization_time @@ -405,7 +405,7 @@ where impl core::fmt::Debug for LlmpEventManager where SP: ShMemProvider + 'static, - S: UsesInput, + S: State, { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { let mut debug_struct = f.debug_struct("LlmpEventManager"); @@ -423,7 +423,7 @@ where impl Drop for LlmpEventManager where SP: ShMemProvider + 'static, - S: UsesInput, + S: State, { /// LLMP clients will have to wait until their pages are mapped by somebody. fn drop(&mut self) { @@ -433,7 +433,7 @@ where impl LlmpEventManager where - S: UsesInput, + S: State, SP: ShMemProvider + 'static, { /// Create a manager from a raw LLMP client @@ -549,7 +549,7 @@ where impl LlmpEventManager where - S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata, + S: State + HasExecutions + HasMetadata, SP: ShMemProvider + 'static, { // Handle arriving events in the client @@ -591,9 +591,16 @@ where { self.deserialization_time = current_time() - start; } - + #[cfg(feature = "scalability_introspection")] + { + state.scalability_monitor_mut().testcase_with_observers += 1; + } fuzzer.process_execution(state, self, input, &observers, &exit_kind, false)? } else { + #[cfg(feature = "scalability_introspection")] + { + state.scalability_monitor_mut().testcase_without_observers += 1; + } fuzzer.evaluate_input_with_observers::( state, executor, self, input, false, )? @@ -619,7 +626,7 @@ where } } -impl LlmpEventManager { +impl LlmpEventManager { /// Send information that this client is exiting. /// The other side may free up all allocated memory. /// We are no longer allowed to send anything afterwards. @@ -630,7 +637,7 @@ impl LlmpEventManager { impl UsesState for LlmpEventManager where - S: UsesInput, + S: State, SP: ShMemProvider, { type State = S; @@ -638,7 +645,7 @@ where impl EventFirer for LlmpEventManager where - S: UsesInput, + S: State, SP: ShMemProvider, { #[cfg(feature = "llmp_compression")] @@ -732,7 +739,7 @@ where impl EventRestarter for LlmpEventManager where - S: UsesInput, + S: State, SP: ShMemProvider, { /// The LLMP client needs to wait until a broker has mapped all pages before shutting down. @@ -745,7 +752,7 @@ where impl EventProcessor for LlmpEventManager where - S: UsesInput + HasClientPerfMonitor + HasExecutions + HasMetadata, + S: State + HasExecutions + HasMetadata, SP: ShMemProvider, E: HasObservers + Executor, for<'a> E::Observers: Deserialize<'a>, @@ -792,7 +799,7 @@ impl EventManager for LlmpEventManager where E: HasObservers + Executor, for<'a> E::Observers: Deserialize<'a>, - S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime, + S: State + HasExecutions + HasMetadata + HasLastReportTime, SP: ShMemProvider, Z: EvaluatorObservers + ExecutionProcessor, { @@ -800,7 +807,7 @@ where impl HasCustomBufHandlers for LlmpEventManager where - S: UsesInput, + S: State, SP: ShMemProvider, { fn add_custom_buf_handler( @@ -813,14 +820,14 @@ where impl ProgressReporter for LlmpEventManager where - S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime, + S: State + HasExecutions + HasMetadata + HasLastReportTime, SP: ShMemProvider, { } impl HasEventManagerId for LlmpEventManager where - S: UsesInput, + S: State, SP: ShMemProvider, { /// Gets the id assigned to this staterestorer. @@ -834,7 +841,7 @@ where #[derive(Debug)] pub struct LlmpRestartingEventManager where - S: UsesInput, + S: State, SP: ShMemProvider + 'static, //CE: CustomEvent, { @@ -850,7 +857,7 @@ where impl EventStatsCollector for LlmpRestartingEventManager where SP: ShMemProvider + 'static, - S: UsesInput, + S: State, { fn serialization_time(&self) -> Duration { self.llmp_mgr.serialization_time() @@ -883,14 +890,14 @@ where impl EventStatsCollector for LlmpRestartingEventManager where SP: ShMemProvider + 'static, - S: UsesInput, + S: State, { } #[cfg(feature = "std")] impl UsesState for LlmpRestartingEventManager where - S: UsesInput, + S: State, SP: ShMemProvider + 'static, { type State = S; @@ -899,12 +906,7 @@ where #[cfg(feature = "std")] impl ProgressReporter for LlmpRestartingEventManager where - S: UsesInput - + HasExecutions - + HasClientPerfMonitor - + HasMetadata - + HasLastReportTime - + Serialize, + S: State + HasExecutions + HasMetadata + HasLastReportTime, SP: ShMemProvider, { } @@ -913,7 +915,7 @@ where impl EventFirer for LlmpRestartingEventManager where SP: ShMemProvider, - S: UsesInput, + S: State, //CE: CustomEvent, { fn fire( @@ -940,7 +942,7 @@ where #[cfg(feature = "std")] impl EventRestarter for LlmpRestartingEventManager where - S: UsesInput + HasExecutions + HasClientPerfMonitor + Serialize, + S: State + HasExecutions, SP: ShMemProvider, //CE: CustomEvent, { @@ -978,7 +980,7 @@ impl EventProcessor for LlmpRestartingEventManager where E: HasObservers + Executor, Z>, for<'a> E::Observers: Deserialize<'a>, - S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata, + S: State + HasExecutions + HasMetadata, SP: ShMemProvider + 'static, Z: EvaluatorObservers + ExecutionProcessor, //CE: CustomEvent, { @@ -992,12 +994,7 @@ impl EventManager for LlmpRestartingEventManager where E: HasObservers + Executor, Z>, for<'a> E::Observers: Deserialize<'a>, - S: UsesInput - + HasExecutions - + HasClientPerfMonitor - + HasMetadata - + HasLastReportTime - + Serialize, + S: State + HasExecutions + HasMetadata + HasLastReportTime, SP: ShMemProvider + 'static, Z: EvaluatorObservers + ExecutionProcessor, //CE: CustomEvent, { @@ -1006,7 +1003,7 @@ where #[cfg(feature = "std")] impl HasEventManagerId for LlmpRestartingEventManager where - S: UsesInput + Serialize, + S: State, SP: ShMemProvider + 'static, { fn mgr_id(&self) -> EventManagerId { @@ -1023,7 +1020,7 @@ const _ENV_FUZZER_BROKER_CLIENT_INITIAL: &str = "_AFL_ENV_FUZZER_BROKER_CLIENT"; #[cfg(feature = "std")] impl LlmpRestartingEventManager where - S: UsesInput, + S: State, SP: ShMemProvider + 'static, //CE: CustomEvent, { @@ -1087,7 +1084,7 @@ pub fn setup_restarting_mgr_std( ) -> Result<(Option, LlmpRestartingEventManager), Error> where MT: Monitor + Clone, - S: DeserializeOwned + UsesInput + HasClientPerfMonitor + HasExecutions, + S: State + HasExecutions, { RestartingMgr::builder() .shmem_provider(StdShMemProvider::new()?) @@ -1148,7 +1145,7 @@ where impl RestartingMgr where SP: ShMemProvider, - S: UsesInput + HasExecutions + HasClientPerfMonitor + DeserializeOwned, + S: State + HasExecutions, MT: Monitor + Clone, { /// Launch the restarting manager @@ -1412,7 +1409,7 @@ where impl LlmpEventConverter where - S: UsesInput + HasExecutions + HasClientPerfMonitor, + S: UsesInput + HasExecutions, SP: ShMemProvider + 'static, IC: InputConverter, ICB: InputConverter, @@ -1605,7 +1602,7 @@ where impl UsesState for LlmpEventConverter where - S: UsesInput, + S: State, SP: ShMemProvider, IC: InputConverter, ICB: InputConverter, @@ -1616,7 +1613,7 @@ where impl EventFirer for LlmpEventConverter where - S: UsesInput, + S: State, SP: ShMemProvider, IC: InputConverter, ICB: InputConverter, diff --git a/libafl/src/events/mod.rs b/libafl/src/events/mod.rs index d7961f1d81..e1979757dc 100644 --- a/libafl/src/events/mod.rs +++ b/libafl/src/events/mod.rs @@ -38,12 +38,14 @@ use serde::{Deserialize, Serialize}; #[cfg(feature = "std")] use uuid::Uuid; +#[cfg(feature = "introspection")] +use crate::state::HasClientPerfMonitor; use crate::{ executors::ExitKind, inputs::Input, monitors::UserStats, observers::ObserversTuple, - state::{HasClientPerfMonitor, HasExecutions, HasLastReportTime, HasMetadata}, + state::{HasExecutions, HasLastReportTime, HasMetadata, State}, Error, }; @@ -462,7 +464,7 @@ pub trait EventFirer: UsesState { /// [`ProgressReporter`] report progress to the broker. pub trait ProgressReporter: EventFirer where - Self::State: HasClientPerfMonitor + HasMetadata + HasExecutions + HasLastReportTime, + Self::State: HasMetadata + HasExecutions + HasLastReportTime, { /// Given the last time, if `monitor_timeout` seconds passed, send off an info/monitor/heartbeat message to the broker. /// Returns the new `last` time (so the old one, unless `monitor_timeout` time has passed and monitor have been sent) @@ -574,7 +576,7 @@ pub trait HasEventManagerId { pub trait EventManager: EventFirer + EventProcessor + EventRestarter + HasEventManagerId + ProgressReporter where - Self::State: HasClientPerfMonitor + HasMetadata + HasExecutions + HasLastReportTime, + Self::State: HasMetadata + HasExecutions + HasLastReportTime, { } @@ -606,14 +608,14 @@ impl NopEventManager { impl UsesState for NopEventManager where - S: UsesInput, + S: State, { type State = S; } impl EventFirer for NopEventManager where - S: UsesInput, + S: State, { fn fire( &mut self, @@ -624,11 +626,11 @@ where } } -impl EventRestarter for NopEventManager where S: UsesInput {} +impl EventRestarter for NopEventManager where S: State {} impl EventProcessor for NopEventManager where - S: UsesInput + HasClientPerfMonitor + HasExecutions, + S: State + HasExecutions, { fn process( &mut self, @@ -641,13 +643,13 @@ where } impl EventManager for NopEventManager where - S: UsesInput + HasClientPerfMonitor + HasExecutions + HasLastReportTime + HasMetadata + S: State + HasExecutions + HasLastReportTime + HasMetadata { } impl HasCustomBufHandlers for NopEventManager where - S: UsesInput, + S: State, { fn add_custom_buf_handler( &mut self, @@ -659,7 +661,7 @@ where } impl ProgressReporter for NopEventManager where - S: UsesInput + HasClientPerfMonitor + HasExecutions + HasLastReportTime + HasMetadata + S: State + HasExecutions + HasLastReportTime + HasMetadata { } diff --git a/libafl/src/events/simple.rs b/libafl/src/events/simple.rs index 137b800e50..278c616d00 100644 --- a/libafl/src/events/simple.rs +++ b/libafl/src/events/simple.rs @@ -38,7 +38,7 @@ use crate::{ }, inputs::UsesInput, monitors::Monitor, - state::{HasClientPerfMonitor, HasExecutions, HasLastReportTime, HasMetadata, UsesState}, + state::{HasExecutions, HasLastReportTime, HasMetadata, State, UsesState}, Error, }; #[cfg(feature = "std")] @@ -83,7 +83,7 @@ where impl UsesState for SimpleEventManager where - S: UsesInput, + S: State, { type State = S; } @@ -91,7 +91,7 @@ where impl EventFirer for SimpleEventManager where MT: Monitor, - S: UsesInput, + S: State, { fn fire( &mut self, @@ -109,14 +109,14 @@ where impl EventRestarter for SimpleEventManager where MT: Monitor, - S: UsesInput, + S: State, { } impl EventProcessor for SimpleEventManager where MT: Monitor, - S: UsesInput, + S: State, { fn process( &mut self, @@ -135,14 +135,14 @@ where impl EventManager for SimpleEventManager where MT: Monitor, - S: UsesInput + HasClientPerfMonitor + HasExecutions + HasLastReportTime + HasMetadata, + S: State + HasExecutions + HasLastReportTime + HasMetadata, { } impl HasCustomBufHandlers for SimpleEventManager where MT: Monitor, //CE: CustomEvent, - S: UsesInput, + S: State, { /// Adds a custom buffer handler that will run for each incoming `CustomBuf` event. fn add_custom_buf_handler( @@ -158,7 +158,7 @@ where impl ProgressReporter for SimpleEventManager where MT: Monitor, - S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime, + S: State + HasExecutions + HasMetadata + HasLastReportTime, { } @@ -320,7 +320,7 @@ where #[cfg(feature = "std")] impl UsesState for SimpleRestartingEventManager where - S: UsesInput, + S: State, SP: ShMemProvider, { type State = S; @@ -330,7 +330,7 @@ where impl EventFirer for SimpleRestartingEventManager where MT: Monitor, - S: UsesInput, + S: State, SP: ShMemProvider, { fn fire( @@ -346,7 +346,7 @@ where impl EventRestarter for SimpleRestartingEventManager where MT: Monitor, - S: UsesInput + Serialize, + S: State, SP: ShMemProvider, { /// Reset the single page (we reuse it over and over from pos 0), then send the current state to the next runner. @@ -370,7 +370,7 @@ where impl EventProcessor for SimpleRestartingEventManager where MT: Monitor, - S: UsesInput + HasClientPerfMonitor + HasExecutions + Serialize, + S: State + HasExecutions, SP: ShMemProvider, { fn process( @@ -387,12 +387,7 @@ where impl EventManager for SimpleRestartingEventManager where MT: Monitor, - S: UsesInput - + HasExecutions - + HasClientPerfMonitor - + HasMetadata - + HasLastReportTime - + Serialize, + S: State + HasExecutions + HasMetadata + HasLastReportTime + Serialize, SP: ShMemProvider, { } @@ -401,7 +396,7 @@ where impl HasCustomBufHandlers for SimpleRestartingEventManager where MT: Monitor, - S: UsesInput, + S: State, SP: ShMemProvider, { fn add_custom_buf_handler( @@ -416,7 +411,7 @@ where impl ProgressReporter for SimpleRestartingEventManager where MT: Monitor, - S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime, + S: State + HasExecutions + HasMetadata + HasLastReportTime, SP: ShMemProvider, { } diff --git a/libafl/src/events/tcp.rs b/libafl/src/events/tcp.rs index 31ff6e7209..f4eed28188 100644 --- a/libafl/src/events/tcp.rs +++ b/libafl/src/events/tcp.rs @@ -28,7 +28,7 @@ use libafl_bolts::os::{fork, ForkResult}; use libafl_bolts::{shmem::ShMemProvider, ClientId}; #[cfg(feature = "std")] use libafl_bolts::{shmem::StdShMemProvider, staterestore::StateRestorer}; -use serde::{de::DeserializeOwned, Deserialize, Serialize}; +use serde::{de::DeserializeOwned, Deserialize}; use tokio::{ io::{AsyncReadExt, AsyncWriteExt}, sync::{broadcast, broadcast::error::RecvError, mpsc}, @@ -49,7 +49,7 @@ use crate::{ fuzzer::{EvaluatorObservers, ExecutionProcessor}, inputs::{Input, UsesInput}, monitors::Monitor, - state::{HasClientPerfMonitor, HasExecutions, HasLastReportTime, HasMetadata, UsesState}, + state::{HasExecutions, HasLastReportTime, HasMetadata, State, UsesState}, Error, }; @@ -407,7 +407,7 @@ where /// An [`EventManager`] that forwards all events to other attached via tcp. pub struct TcpEventManager where - S: UsesInput, + S: State, { /// The TCP stream for inter process communication tcp: TcpStream, @@ -426,7 +426,7 @@ where impl core::fmt::Debug for TcpEventManager where - S: UsesInput, + S: State, { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { let mut debug_struct = f.debug_struct("TcpEventManager"); @@ -443,7 +443,7 @@ where impl Drop for TcpEventManager where - S: UsesInput, + S: State, { /// TCP clients will have to wait until their pages are mapped by somebody. fn drop(&mut self) { @@ -453,7 +453,7 @@ where impl TcpEventManager where - S: UsesInput + HasExecutions + HasClientPerfMonitor, + S: State + HasExecutions, { /// Create a manager from a raw TCP client specifying the client id pub fn existing( @@ -560,8 +560,16 @@ where { let observers: E::Observers = postcard::from_bytes(observers_buf.as_ref().unwrap())?; + #[cfg(feature = "scalability_introspection")] + { + state.scalability_monitor_mut().testcase_with_observers += 1; + } fuzzer.process_execution(state, self, input, &observers, &exit_kind, false)? } else { + #[cfg(feature = "scalability_introspection")] + { + state.scalability_monitor_mut().testcase_without_observers += 1; + } fuzzer.evaluate_input_with_observers::( state, executor, self, input, false, )? @@ -589,7 +597,7 @@ where impl TcpEventManager where - S: UsesInput, + S: State, { /// Send information that this client is exiting. /// The other side may free up all allocated memory. @@ -603,14 +611,14 @@ where impl UsesState for TcpEventManager where - S: UsesInput, + S: State, { type State = S; } impl EventFirer for TcpEventManager where - S: UsesInput, + S: State, { #[cfg(feature = "tcp_compression")] fn fire( @@ -657,7 +665,7 @@ where impl EventRestarter for TcpEventManager where - S: UsesInput, + S: State, { /// The TCP client needs to wait until a broker has mapped all pages before shutting down. /// Otherwise, the OS may already have removed the shared maps. @@ -669,7 +677,7 @@ where impl EventProcessor for TcpEventManager where - S: UsesInput + HasClientPerfMonitor + HasExecutions, + S: State + HasExecutions, E: HasObservers + Executor, for<'a> E::Observers: Deserialize<'a>, Z: EvaluatorObservers + ExecutionProcessor, @@ -732,14 +740,14 @@ impl EventManager for TcpEventManager where E: HasObservers + Executor, for<'a> E::Observers: Deserialize<'a>, - S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime, + S: State + HasExecutions + HasMetadata + HasLastReportTime, Z: EvaluatorObservers + ExecutionProcessor, { } impl HasCustomBufHandlers for TcpEventManager where - S: UsesInput, + S: State, { fn add_custom_buf_handler( &mut self, @@ -750,13 +758,13 @@ where } impl ProgressReporter for TcpEventManager where - S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime + S: State + HasExecutions + HasMetadata + HasLastReportTime { } impl HasEventManagerId for TcpEventManager where - S: UsesInput, + S: State, { /// Gets the id assigned to this staterestorer. fn mgr_id(&self) -> EventManagerId { @@ -769,7 +777,7 @@ where #[derive(Debug)] pub struct TcpRestartingEventManager where - S: UsesInput, + S: State, SP: ShMemProvider + 'static, //CE: CustomEvent, { @@ -784,7 +792,7 @@ where #[cfg(feature = "std")] impl UsesState for TcpRestartingEventManager where - S: UsesInput, + S: State, SP: ShMemProvider + 'static, { type State = S; @@ -793,12 +801,7 @@ where #[cfg(feature = "std")] impl ProgressReporter for TcpRestartingEventManager where - S: UsesInput - + HasExecutions - + HasClientPerfMonitor - + HasMetadata - + HasLastReportTime - + Serialize, + S: State + HasExecutions + HasMetadata + HasLastReportTime, SP: ShMemProvider, { } @@ -807,7 +810,7 @@ where impl EventFirer for TcpRestartingEventManager where SP: ShMemProvider, - S: UsesInput, + S: State, //CE: CustomEvent, { fn fire( @@ -827,7 +830,7 @@ where #[cfg(feature = "std")] impl EventRestarter for TcpRestartingEventManager where - S: UsesInput + HasExecutions + HasClientPerfMonitor + Serialize, + S: State + HasExecutions, SP: ShMemProvider, //CE: CustomEvent, { @@ -864,7 +867,7 @@ impl EventProcessor for TcpRestartingEventManager where E: HasObservers + Executor, Z>, for<'a> E::Observers: Deserialize<'a>, - S: UsesInput + HasExecutions + HasClientPerfMonitor, + S: State + HasExecutions, SP: ShMemProvider + 'static, Z: EvaluatorObservers + ExecutionProcessor, //CE: CustomEvent, { @@ -878,12 +881,7 @@ impl EventManager for TcpRestartingEventManager where E: HasObservers + Executor, Z>, for<'a> E::Observers: Deserialize<'a>, - S: UsesInput - + HasExecutions - + HasClientPerfMonitor - + HasMetadata - + HasLastReportTime - + Serialize, + S: State + HasExecutions + HasMetadata + HasLastReportTime, SP: ShMemProvider + 'static, Z: EvaluatorObservers + ExecutionProcessor, //CE: CustomEvent, { @@ -892,7 +890,7 @@ where #[cfg(feature = "std")] impl HasEventManagerId for TcpRestartingEventManager where - S: UsesInput + Serialize, + S: State, SP: ShMemProvider + 'static, { fn mgr_id(&self) -> EventManagerId { @@ -909,7 +907,7 @@ const _ENV_FUZZER_BROKER_CLIENT_INITIAL: &str = "_AFL_ENV_FUZZER_BROKER_CLIENT"; #[cfg(feature = "std")] impl TcpRestartingEventManager where - S: UsesInput, + S: State, SP: ShMemProvider + 'static, //CE: CustomEvent, { @@ -973,7 +971,7 @@ pub fn setup_restarting_mgr_tcp( ) -> Result<(Option, TcpRestartingEventManager), Error> where MT: Monitor + Clone, - S: DeserializeOwned + UsesInput + HasClientPerfMonitor + HasExecutions, + S: State + HasExecutions, { RestartingMgr::builder() .shmem_provider(StdShMemProvider::new()?) @@ -1034,7 +1032,7 @@ where impl RestartingMgr where SP: ShMemProvider, - S: UsesInput + HasExecutions + HasClientPerfMonitor + DeserializeOwned, + S: State + HasExecutions, MT: Monitor + Clone, { /// Launch the restarting manager diff --git a/libafl/src/executors/command.rs b/libafl/src/executors/command.rs index 28d83550ad..b0a0af18d9 100644 --- a/libafl/src/executors/command.rs +++ b/libafl/src/executors/command.rs @@ -30,7 +30,7 @@ use crate::{inputs::Input, Error}; use crate::{ inputs::{HasTargetBytes, UsesInput}, observers::{ObserversTuple, UsesObservers}, - state::{HasExecutions, UsesState}, + state::{HasExecutions, State, UsesState}, std::borrow::ToOwned, }; @@ -313,7 +313,7 @@ where impl Executor for CommandExecutor where EM: UsesState, - S: UsesInput + HasExecutions, + S: State + HasExecutions, S::Input: HasTargetBytes, T: CommandConfigurator, OT: Debug + MatchName + ObserversTuple, @@ -378,7 +378,7 @@ where impl UsesState for CommandExecutor where - S: UsesInput, + S: State, { type State = S; } @@ -386,14 +386,14 @@ where impl UsesObservers for CommandExecutor where OT: ObserversTuple, - S: UsesInput, + S: State, { type Observers = OT; } impl HasObservers for CommandExecutor where - S: UsesInput, + S: State, T: Debug, OT: ObserversTuple, { diff --git a/libafl/src/executors/forkserver.rs b/libafl/src/executors/forkserver.rs index c7b76d305e..d228e2e17f 100644 --- a/libafl/src/executors/forkserver.rs +++ b/libafl/src/executors/forkserver.rs @@ -39,7 +39,7 @@ use crate::{ inputs::{HasTargetBytes, Input, UsesInput}, mutators::Tokens, observers::{MapObserver, Observer, ObserversTuple, UsesObservers}, - state::{HasExecutions, UsesState}, + state::{HasExecutions, State, UsesState}, Error, }; @@ -1213,7 +1213,7 @@ impl Executor for ForkserverExecutor where OT: ObserversTuple, SP: ShMemProvider, - S: UsesInput + HasExecutions, + S: State + HasExecutions, S::Input: HasTargetBytes, EM: UsesState, Z: UsesState, @@ -1321,7 +1321,7 @@ where impl UsesState for ForkserverExecutor where - S: UsesInput, + S: State, SP: ShMemProvider, { type State = S; @@ -1330,7 +1330,7 @@ where impl UsesObservers for ForkserverExecutor where OT: ObserversTuple, - S: UsesInput, + S: State, SP: ShMemProvider, { type Observers = OT; @@ -1339,7 +1339,7 @@ where impl HasObservers for ForkserverExecutor where OT: ObserversTuple, - S: UsesInput, + S: State, SP: ShMemProvider, { #[inline] diff --git a/libafl/src/executors/inprocess.rs b/libafl/src/executors/inprocess.rs index 8f399e4c65..46d366fd88 100644 --- a/libafl/src/executors/inprocess.rs +++ b/libafl/src/executors/inprocess.rs @@ -53,7 +53,7 @@ use crate::{ fuzzer::HasObjective, inputs::UsesInput, observers::{ObserversTuple, UsesObservers}, - state::{HasClientPerfMonitor, HasCorpus, HasExecutions, HasSolutions, UsesState}, + state::{HasCorpus, HasExecutions, HasSolutions, State, UsesState}, Error, }; @@ -75,7 +75,7 @@ where H: FnMut(&S::Input) -> ExitKind + ?Sized, HB: BorrowMut, OT: ObserversTuple, - S: UsesInput, + S: State, { /// The harness function, being executed for each fuzzing loop execution harness_fn: HB, @@ -91,7 +91,7 @@ where H: FnMut(&S::Input) -> ExitKind + ?Sized, HB: BorrowMut, OT: ObserversTuple + Debug, - S: UsesInput, + S: State, { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { f.debug_struct("GenericInProcessExecutor") @@ -106,7 +106,7 @@ where H: ?Sized + FnMut(&S::Input) -> ExitKind, HB: BorrowMut, OT: ObserversTuple, - S: UsesInput, + S: State, { type State = S; } @@ -116,7 +116,7 @@ where H: ?Sized + FnMut(&S::Input) -> ExitKind, HB: BorrowMut, OT: ObserversTuple, - S: UsesInput, + S: State, { type Observers = OT; } @@ -127,7 +127,7 @@ where HB: BorrowMut, EM: UsesState, OT: ObserversTuple, - S: UsesInput + HasExecutions, + S: State + HasExecutions, Z: UsesState, { fn run_target( @@ -153,7 +153,7 @@ where H: FnMut(&S::Input) -> ExitKind + ?Sized, HB: BorrowMut, OT: ObserversTuple, - S: UsesInput, + S: State, { #[inline] fn observers(&self) -> &OT { @@ -171,7 +171,7 @@ where H: FnMut(&::Input) -> ExitKind + ?Sized, HB: BorrowMut, OT: ObserversTuple, - S: HasExecutions + HasSolutions + HasClientPerfMonitor + HasCorpus, + S: HasExecutions + HasSolutions + HasCorpus + State, { /// Create a new in mem executor. /// Caution: crash and restart in one of them will lead to odd behavior if multiple are used, @@ -190,6 +190,7 @@ where Self: Executor, EM: EventFirer + EventRestarter, OF: Feedback, + S: State, Z: HasObjective, { let handlers = InProcessHandlers::new::()?; @@ -255,7 +256,7 @@ where H: FnMut(&::Input) -> ExitKind + ?Sized, HB: BorrowMut, OT: ObserversTuple, - S: HasExecutions + HasSolutions + HasClientPerfMonitor + HasCorpus, + S: State + HasExecutions + HasSolutions + HasCorpus, { /// the timeout handler #[inline] @@ -350,7 +351,7 @@ impl InProcessHandlers { E: Executor + HasObservers, EM: EventFirer + EventRestarter, OF: Feedback, - E::State: HasExecutions + HasSolutions + HasClientPerfMonitor + HasCorpus, + E::State: HasExecutions + HasSolutions + HasCorpus, Z: HasObjective, { #[cfg(unix)] @@ -380,7 +381,7 @@ impl InProcessHandlers { E: Executor + HasObservers + HasInProcessHandlers, EM: EventFirer + EventRestarter, OF: Feedback, - E::State: HasExecutions + HasSolutions + HasClientPerfMonitor + HasCorpus, + E::State: State + HasExecutions + HasSolutions + HasCorpus, Z: HasObjective, { unsafe { @@ -591,7 +592,7 @@ pub fn run_observers_and_save_state( E: HasObservers, EM: EventFirer + EventRestarter, OF: Feedback, - E::State: HasExecutions + HasSolutions + HasClientPerfMonitor + HasCorpus, + E::State: HasExecutions + HasSolutions + HasCorpus, Z: HasObjective, { let observers = executor.observers_mut(); @@ -657,7 +658,7 @@ pub mod unix_signal_handler { feedbacks::Feedback, fuzzer::HasObjective, inputs::UsesInput, - state::{HasClientPerfMonitor, HasCorpus, HasExecutions, HasSolutions}, + state::{HasCorpus, HasExecutions, HasSolutions}, }; pub(crate) type HandlerFuncPtr = unsafe fn( @@ -727,7 +728,7 @@ pub mod unix_signal_handler { E: HasObservers, EM: EventFirer + EventRestarter, OF: Feedback, - E::State: HasExecutions + HasSolutions + HasClientPerfMonitor + HasCorpus, + E::State: HasExecutions + HasSolutions + HasCorpus, Z: HasObjective, { let old_hook = panic::take_hook(); @@ -775,7 +776,7 @@ pub mod unix_signal_handler { E: HasObservers, EM: EventFirer + EventRestarter, OF: Feedback, - E::State: HasExecutions + HasSolutions + HasClientPerfMonitor + HasCorpus, + E::State: HasExecutions + HasSolutions + HasCorpus, Z: HasObjective, { if !data.timeout_executor_ptr.is_null() @@ -825,7 +826,7 @@ pub mod unix_signal_handler { E: Executor + HasObservers, EM: EventFirer + EventRestarter, OF: Feedback, - E::State: HasExecutions + HasSolutions + HasClientPerfMonitor + HasCorpus, + E::State: HasExecutions + HasSolutions + HasCorpus, Z: HasObjective, { #[cfg(all(target_os = "android", target_arch = "aarch64"))] @@ -937,7 +938,7 @@ pub mod windows_asan_handler { feedbacks::Feedback, fuzzer::HasObjective, inputs::UsesInput, - state::{HasClientPerfMonitor, HasCorpus, HasExecutions, HasSolutions}, + state::{HasCorpus, HasExecutions, HasSolutions}, }; /// # Safety @@ -947,7 +948,7 @@ pub mod windows_asan_handler { E: Executor + HasObservers, EM: EventFirer + EventRestarter, OF: Feedback, - E::State: HasExecutions + HasSolutions + HasClientPerfMonitor + HasCorpus, + E::State: HasExecutions + HasSolutions + HasCorpus, Z: HasObjective, { let data = &mut GLOBAL_STATE; @@ -1050,7 +1051,7 @@ pub mod windows_exception_handler { feedbacks::Feedback, fuzzer::HasObjective, inputs::UsesInput, - state::{HasClientPerfMonitor, HasCorpus, HasExecutions, HasSolutions}, + state::{HasCorpus, HasExecutions, HasSolutions, State}, }; pub(crate) type HandlerFuncPtr = @@ -1094,7 +1095,7 @@ pub mod windows_exception_handler { E: HasObservers, EM: EventFirer + EventRestarter, OF: Feedback, - E::State: HasExecutions + HasSolutions + HasClientPerfMonitor + HasCorpus, + E::State: HasExecutions + HasSolutions + HasCorpus, Z: HasObjective, { let old_hook = panic::take_hook(); @@ -1158,7 +1159,7 @@ pub mod windows_exception_handler { E: HasObservers + HasInProcessHandlers, EM: EventFirer + EventRestarter, OF: Feedback, - E::State: HasExecutions + HasSolutions + HasClientPerfMonitor + HasCorpus, + E::State: State + HasExecutions + HasSolutions + HasCorpus, Z: HasObjective, { let data: &mut InProcessExecutorHandlerData = @@ -1225,7 +1226,7 @@ pub mod windows_exception_handler { E: Executor + HasObservers, EM: EventFirer + EventRestarter, OF: Feedback, - E::State: HasExecutions + HasSolutions + HasClientPerfMonitor + HasCorpus, + E::State: HasExecutions + HasSolutions + HasCorpus, Z: HasObjective, { // Have we set a timer_before? @@ -1645,7 +1646,7 @@ impl<'a, H, OT, S, SP> UsesState for InProcessForkExecutor<'a, H, OT, S, SP> where H: ?Sized + FnMut(&S::Input) -> ExitKind, OT: ObserversTuple, - S: UsesInput, + S: State, SP: ShMemProvider, { type State = S; @@ -1656,7 +1657,7 @@ impl<'a, H, OT, S, SP> UsesState for TimeoutInProcessForkExecutor<'a, H, OT, S, where H: ?Sized + FnMut(&S::Input) -> ExitKind, OT: ObserversTuple, - S: UsesInput, + S: State, SP: ShMemProvider, { type State = S; @@ -1668,7 +1669,7 @@ where EM: UsesState, H: FnMut(&S::Input) -> ExitKind + ?Sized, OT: ObserversTuple, - S: UsesInput + HasExecutions, + S: State + HasExecutions, SP: ShMemProvider, Z: UsesState, { @@ -1737,7 +1738,7 @@ where EM: UsesState, H: FnMut(&S::Input) -> ExitKind + ?Sized, OT: ObserversTuple, - S: UsesInput + HasExecutions, + S: State + HasExecutions, SP: ShMemProvider, Z: UsesState, { @@ -1841,7 +1842,7 @@ impl<'a, H, OT, S, SP> InProcessForkExecutor<'a, H, OT, S, SP> where H: FnMut(&S::Input) -> ExitKind + ?Sized, OT: ObserversTuple, - S: UsesInput, + S: State, SP: ShMemProvider, { /// Creates a new [`InProcessForkExecutor`] @@ -1856,7 +1857,7 @@ where where EM: EventFirer + EventRestarter, OF: Feedback, - S: HasSolutions + HasClientPerfMonitor, + S: HasSolutions, Z: HasObjective, { let handlers = InChildProcessHandlers::new::()?; @@ -1886,7 +1887,7 @@ where impl<'a, H, OT, S, SP> TimeoutInProcessForkExecutor<'a, H, OT, S, SP> where H: FnMut(&S::Input) -> ExitKind + ?Sized, - S: UsesInput, + S: State, OT: ObserversTuple, SP: ShMemProvider, { @@ -1904,7 +1905,7 @@ where where EM: EventFirer + EventRestarter, OF: Feedback, - S: HasSolutions + HasClientPerfMonitor, + S: HasSolutions, Z: HasObjective, { let handlers = InChildProcessHandlers::with_timeout::()?; @@ -1946,7 +1947,7 @@ where where EM: EventFirer + EventRestarter, OF: Feedback, - S: HasSolutions + HasClientPerfMonitor, + S: HasSolutions, Z: HasObjective, { let handlers = InChildProcessHandlers::with_timeout::()?; @@ -1992,7 +1993,7 @@ impl<'a, H, OT, S, SP> UsesObservers for InProcessForkExecutor<'a, H, OT, S, SP> where H: ?Sized + FnMut(&S::Input) -> ExitKind, OT: ObserversTuple, - S: UsesInput, + S: State, SP: ShMemProvider, { type Observers = OT; @@ -2003,7 +2004,7 @@ impl<'a, H, OT, S, SP> UsesObservers for TimeoutInProcessForkExecutor<'a, H, OT, where H: ?Sized + FnMut(&S::Input) -> ExitKind, OT: ObserversTuple, - S: UsesInput, + S: State, SP: ShMemProvider, { type Observers = OT; @@ -2013,7 +2014,7 @@ where impl<'a, H, OT, S, SP> HasObservers for InProcessForkExecutor<'a, H, OT, S, SP> where H: FnMut(&S::Input) -> ExitKind + ?Sized, - S: UsesInput, + S: State, OT: ObserversTuple, SP: ShMemProvider, { @@ -2032,7 +2033,7 @@ where impl<'a, H, OT, S, SP> HasObservers for TimeoutInProcessForkExecutor<'a, H, OT, S, SP> where H: FnMut(&S::Input) -> ExitKind + ?Sized, - S: UsesInput, + S: State, OT: ObserversTuple, SP: ShMemProvider, { diff --git a/libafl/src/executors/mod.rs b/libafl/src/executors/mod.rs index 1214085713..74953313f0 100644 --- a/libafl/src/executors/mod.rs +++ b/libafl/src/executors/mod.rs @@ -39,9 +39,9 @@ use libafl_bolts::AsSlice; use serde::{Deserialize, Serialize}; use crate::{ - inputs::{HasTargetBytes, UsesInput}, + inputs::HasTargetBytes, observers::{ObserversTuple, UsesObservers}, - state::{HasExecutions, UsesState}, + state::{HasExecutions, State, UsesState}, Error, }; @@ -158,7 +158,7 @@ struct NopExecutor { impl UsesState for NopExecutor where - S: UsesInput, + S: State, { type State = S; } @@ -166,7 +166,7 @@ where impl Executor for NopExecutor where EM: UsesState, - S: UsesInput + HasExecutions, + S: State + HasExecutions, S::Input: HasTargetBytes, Z: UsesState, { diff --git a/libafl/src/feedbacks/concolic.rs b/libafl/src/feedbacks/concolic.rs index 33126fcf8d..42f16b433a 100644 --- a/libafl/src/feedbacks/concolic.rs +++ b/libafl/src/feedbacks/concolic.rs @@ -15,7 +15,7 @@ use crate::{ feedbacks::Feedback, inputs::UsesInput, observers::{concolic::ConcolicObserver, ObserversTuple}, - state::{HasClientPerfMonitor, HasMetadata}, + state::{HasMetadata, State}, Error, }; @@ -49,7 +49,7 @@ impl Named for ConcolicFeedback { impl Feedback for ConcolicFeedback where - S: UsesInput + HasClientPerfMonitor, + S: State, { #[allow(clippy::wrong_self_convention)] fn is_interesting( diff --git a/libafl/src/feedbacks/differential.rs b/libafl/src/feedbacks/differential.rs index 117e960dd0..523b6daeb7 100644 --- a/libafl/src/feedbacks/differential.rs +++ b/libafl/src/feedbacks/differential.rs @@ -16,7 +16,7 @@ use crate::{ feedbacks::Feedback, inputs::Input, observers::{Observer, ObserversTuple}, - state::{HasClientPerfMonitor, HasMetadata, State}, + state::{HasMetadata, State}, Error, }; @@ -119,7 +119,7 @@ impl Feedback for DiffFeedback where F: FnMut(&O1, &O2) -> DiffResult, I: Input, - S: HasMetadata + HasClientPerfMonitor + State, + S: HasMetadata + State, O1: Observer + PartialEq, O2: Observer, { @@ -163,7 +163,7 @@ mod tests { feedbacks::{differential::DiffResult, DiffFeedback, Feedback}, inputs::{BytesInput, UsesInput}, observers::Observer, - state::{NopState, UsesState}, + state::{NopState, State, UsesState}, }; #[derive(Debug)] @@ -196,13 +196,13 @@ mod tests { } impl UsesState for NopEventFirer where - S: UsesInput, + S: State, { type State = S; } impl EventFirer for NopEventFirer where - S: UsesInput, + S: State, { fn fire( &mut self, diff --git a/libafl/src/feedbacks/map.rs b/libafl/src/feedbacks/map.rs index 95f4b89346..ffb5bc0524 100644 --- a/libafl/src/feedbacks/map.rs +++ b/libafl/src/feedbacks/map.rs @@ -24,7 +24,7 @@ use crate::{ inputs::UsesInput, monitors::UserStats, observers::{MapObserver, Observer, ObserversTuple, UsesObserver}, - state::{HasClientPerfMonitor, HasMetadata, HasNamedMetadata}, + state::{HasMetadata, HasNamedMetadata, State}, Error, }; @@ -395,7 +395,7 @@ where N: IsNovel, O: MapObserver + for<'it> AsIter<'it, Item = T>, R: Reducer, - S: UsesInput + HasClientPerfMonitor + HasNamedMetadata, + S: State + HasNamedMetadata, T: Default + Copy + Serialize + for<'de> Deserialize<'de> + PartialEq + Debug + 'static, { fn init_state(&mut self, state: &mut S) -> Result<(), Error> { @@ -496,7 +496,7 @@ impl Feedback for MapFeedback where O: MapObserver + AsSlice, for<'it> O: AsIter<'it, Item = u8>, - S: UsesInput + HasNamedMetadata + HasClientPerfMonitor, + S: State + HasNamedMetadata, { #[allow(clippy::wrong_self_convention)] #[allow(clippy::needless_range_loop)] @@ -664,7 +664,7 @@ where O: MapObserver, for<'it> O: AsIter<'it, Item = T>, N: IsNovel, - S: UsesInput + HasNamedMetadata + HasClientPerfMonitor, + S: UsesInput + HasNamedMetadata, { /// Create new `MapFeedback` #[must_use] @@ -875,7 +875,7 @@ where impl Feedback for ReachabilityFeedback where - S: UsesInput + HasClientPerfMonitor, + S: State, O: MapObserver, for<'it> O: AsIter<'it, Item = usize>, { diff --git a/libafl/src/feedbacks/mod.rs b/libafl/src/feedbacks/mod.rs index e156d24f4a..cefec5bfce 100644 --- a/libafl/src/feedbacks/mod.rs +++ b/libafl/src/feedbacks/mod.rs @@ -38,9 +38,8 @@ use crate::{ corpus::Testcase, events::EventFirer, executors::ExitKind, - inputs::UsesInput, observers::{ListObserver, ObserversTuple, TimeObserver}, - state::HasClientPerfMonitor, + state::State, Error, }; @@ -49,7 +48,7 @@ use crate::{ /// indicating the "interestingness" of the last run. pub trait Feedback: Named where - S: UsesInput + HasClientPerfMonitor, + S: State, { /// Initializes the feedback state. /// This method is called after that the `State` is created. @@ -140,7 +139,7 @@ where A: Feedback, B: Feedback, FL: FeedbackLogic, - S: UsesInput + HasClientPerfMonitor, + S: State, { /// First [`Feedback`] pub first: A, @@ -155,7 +154,7 @@ where A: Feedback, B: Feedback, FL: FeedbackLogic, - S: UsesInput + HasClientPerfMonitor, + S: State, { fn name(&self) -> &str { self.name.as_ref() @@ -167,7 +166,7 @@ where A: Feedback, B: Feedback, FL: FeedbackLogic, - S: UsesInput + HasClientPerfMonitor, + S: State, { /// Create a new combined feedback pub fn new(first: A, second: B) -> Self { @@ -186,7 +185,7 @@ where A: Feedback, B: Feedback, FL: FeedbackLogic, - S: UsesInput + HasClientPerfMonitor, + S: State, { fn init_state(&mut self, state: &mut S) -> Result<(), Error> { self.first.init_state(state)?; @@ -269,7 +268,7 @@ pub trait FeedbackLogic: 'static where A: Feedback, B: Feedback, - S: UsesInput + HasClientPerfMonitor, + S: State, { /// The name of this combination fn name() -> &'static str; @@ -310,7 +309,7 @@ where pub trait FeedbackFactory where F: Feedback, - S: UsesInput + HasClientPerfMonitor, + S: State, { /// Create the feedback from the provided context fn create_feedback(&self, ctx: &T) -> F; @@ -320,7 +319,7 @@ impl FeedbackFactory for FU where FU: Fn(&T) -> FE, FE: Feedback, - S: UsesInput + HasClientPerfMonitor, + S: State, { fn create_feedback(&self, ctx: &T) -> FE { self(ctx) @@ -350,7 +349,7 @@ where impl FeedbackFactory for DefaultFeedbackFactory where F: Feedback + Default, - S: UsesInput + HasClientPerfMonitor, + S: State, { fn create_feedback(&self, _ctx: &T) -> F { F::default() @@ -377,7 +376,7 @@ impl FeedbackLogic for LogicEagerOr where A: Feedback, B: Feedback, - S: UsesInput + HasClientPerfMonitor, + S: State, { fn name() -> &'static str { "Eager OR" @@ -427,7 +426,7 @@ impl FeedbackLogic for LogicFastOr where A: Feedback, B: Feedback, - S: UsesInput + HasClientPerfMonitor, + S: State, { fn name() -> &'static str { "Fast OR" @@ -483,7 +482,7 @@ impl FeedbackLogic for LogicEagerAnd where A: Feedback, B: Feedback, - S: UsesInput + HasClientPerfMonitor, + S: State, { fn name() -> &'static str { "Eager AND" @@ -533,7 +532,7 @@ impl FeedbackLogic for LogicFastAnd where A: Feedback, B: Feedback, - S: UsesInput + HasClientPerfMonitor, + S: State, { fn name() -> &'static str { "Fast AND" @@ -608,7 +607,7 @@ pub type FastOrFeedback = CombinedFeedback; pub struct NotFeedback where A: Feedback, - S: UsesInput + HasClientPerfMonitor, + S: State, { /// The feedback to invert pub first: A, @@ -620,7 +619,7 @@ where impl Debug for NotFeedback where A: Feedback + Debug, - S: UsesInput + HasClientPerfMonitor, + S: State, { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { f.debug_struct("NotFeedback") @@ -633,7 +632,7 @@ where impl Feedback for NotFeedback where A: Feedback, - S: UsesInput + HasClientPerfMonitor, + S: State, { fn init_state(&mut self, state: &mut S) -> Result<(), Error> { self.first.init_state(state) @@ -679,7 +678,7 @@ where impl Named for NotFeedback where A: Feedback, - S: UsesInput + HasClientPerfMonitor, + S: State, { #[inline] fn name(&self) -> &str { @@ -690,7 +689,7 @@ where impl NotFeedback where A: Feedback, - S: UsesInput + HasClientPerfMonitor, + S: State, { /// Creates a new [`NotFeedback`]. pub fn new(first: A) -> Self { @@ -758,7 +757,7 @@ macro_rules! feedback_not { /// Hack to use () as empty Feedback impl Feedback for () where - S: UsesInput + HasClientPerfMonitor, + S: State, { #[allow(clippy::wrong_self_convention)] fn is_interesting( @@ -783,7 +782,7 @@ pub struct CrashFeedback {} impl Feedback for CrashFeedback where - S: UsesInput + HasClientPerfMonitor, + S: State, { #[allow(clippy::wrong_self_convention)] fn is_interesting( @@ -836,7 +835,7 @@ pub struct TimeoutFeedback {} impl Feedback for TimeoutFeedback where - S: UsesInput + HasClientPerfMonitor, + S: State, { #[allow(clippy::wrong_self_convention)] fn is_interesting( @@ -893,7 +892,7 @@ pub struct TimeFeedback { impl Feedback for TimeFeedback where - S: UsesInput + HasClientPerfMonitor, + S: State, { #[allow(clippy::wrong_self_convention)] fn is_interesting( @@ -973,7 +972,7 @@ where impl Feedback for ListFeedback where - S: UsesInput + HasClientPerfMonitor, + S: State, T: Debug + Serialize + serde::de::DeserializeOwned, { #[allow(clippy::wrong_self_convention)] @@ -1045,7 +1044,7 @@ pub enum ConstFeedback { impl Feedback for ConstFeedback where - S: UsesInput + HasClientPerfMonitor, + S: State, { #[inline] #[allow(clippy::wrong_self_convention)] diff --git a/libafl/src/feedbacks/nautilus.rs b/libafl/src/feedbacks/nautilus.rs index aac145ae98..bfde84436f 100644 --- a/libafl/src/feedbacks/nautilus.rs +++ b/libafl/src/feedbacks/nautilus.rs @@ -14,9 +14,9 @@ use crate::{ executors::ExitKind, feedbacks::Feedback, generators::NautilusContext, - inputs::{NautilusInput, UsesInput}, + inputs::NautilusInput, observers::ObserversTuple, - state::{HasClientPerfMonitor, HasCorpus, HasMetadata}, + state::{HasCorpus, HasMetadata, State}, Error, }; @@ -82,10 +82,7 @@ impl<'a, S> Named for NautilusFeedback<'a, S> { impl<'a, S> Feedback for NautilusFeedback<'a, S> where - S: HasMetadata - + HasClientPerfMonitor - + UsesInput - + HasCorpus, + S: HasMetadata + HasCorpus + State, { #[allow(clippy::wrong_self_convention)] fn is_interesting( diff --git a/libafl/src/feedbacks/new_hash_feedback.rs b/libafl/src/feedbacks/new_hash_feedback.rs index 1b508ac418..13b7f31742 100644 --- a/libafl/src/feedbacks/new_hash_feedback.rs +++ b/libafl/src/feedbacks/new_hash_feedback.rs @@ -13,7 +13,7 @@ use crate::{ feedbacks::{Feedback, HasObserverName}, inputs::UsesInput, observers::{ObserverWithHashField, ObserversTuple}, - state::{HasClientPerfMonitor, HasNamedMetadata}, + state::{HasNamedMetadata, State}, Error, }; @@ -88,7 +88,7 @@ pub struct NewHashFeedback { impl Feedback for NewHashFeedback where O: ObserverWithHashField + Named, - S: UsesInput + HasNamedMetadata + HasClientPerfMonitor, + S: State + HasNamedMetadata, { fn init_state(&mut self, state: &mut S) -> Result<(), Error> { state.add_named_metadata( diff --git a/libafl/src/fuzzer/mod.rs b/libafl/src/fuzzer/mod.rs index 5ad4e6ad38..96185c2f88 100644 --- a/libafl/src/fuzzer/mod.rs +++ b/libafl/src/fuzzer/mod.rs @@ -8,8 +8,6 @@ use serde::{de::DeserializeOwned, Serialize}; #[cfg(test)] use crate::inputs::Input; -#[cfg(feature = "introspection")] -use crate::monitors::PerfFeature; #[cfg(test)] use crate::state::NopState; use crate::{ @@ -24,11 +22,13 @@ use crate::{ stages::StagesTuple, start_timer, state::{ - HasClientPerfMonitor, HasCorpus, HasExecutions, HasImported, HasLastReportTime, - HasMetadata, HasSolutions, UsesState, + HasCorpus, HasExecutions, HasImported, HasLastReportTime, HasMetadata, HasSolutions, + UsesState, }, Error, }; +#[cfg(feature = "introspection")] +use crate::{monitors::PerfFeature, state::HasClientPerfMonitor}; /// Send a monitor update all 15 (or more) seconds const STATS_TIMEOUT_DEFAULT: Duration = Duration::from_secs(15); @@ -49,10 +49,7 @@ where } /// Holds an feedback -pub trait HasFeedback: UsesState -where - Self::State: HasClientPerfMonitor, -{ +pub trait HasFeedback: UsesState { /// The feedback type type Feedback: Feedback; @@ -64,10 +61,7 @@ where } /// Holds an objective feedback -pub trait HasObjective: UsesState -where - Self::State: HasClientPerfMonitor, -{ +pub trait HasObjective: UsesState { /// The type of the [`Feedback`] used to find objectives for this fuzzer type Objective: Feedback; @@ -158,7 +152,7 @@ where /// The main fuzzer trait. pub trait Fuzzer: Sized + UsesState where - Self::State: HasClientPerfMonitor + HasMetadata + HasExecutions + HasLastReportTime, + Self::State: HasMetadata + HasExecutions + HasLastReportTime, E: UsesState, EM: ProgressReporter, ST: StagesTuple, @@ -255,7 +249,7 @@ where CS: Scheduler, F: Feedback, OF: Feedback, - CS::State: HasClientPerfMonitor + HasCorpus, + CS::State: HasCorpus, { scheduler: CS, feedback: F, @@ -268,7 +262,7 @@ where CS: Scheduler, F: Feedback, OF: Feedback, - CS::State: HasClientPerfMonitor + HasCorpus, + CS::State: HasCorpus, { type State = CS::State; } @@ -278,7 +272,7 @@ where CS: Scheduler, F: Feedback, OF: Feedback, - CS::State: HasClientPerfMonitor + HasCorpus, + CS::State: HasCorpus, { type Scheduler = CS; @@ -296,7 +290,7 @@ where CS: Scheduler, F: Feedback, OF: Feedback, - CS::State: HasClientPerfMonitor + HasCorpus, + CS::State: HasCorpus, { type Feedback = F; @@ -314,7 +308,7 @@ where CS: Scheduler, F: Feedback, OF: Feedback, - CS::State: HasClientPerfMonitor + HasCorpus, + CS::State: HasCorpus, { type Objective = OF; @@ -333,8 +327,7 @@ where F: Feedback, OF: Feedback, OT: ObserversTuple + Serialize + DeserializeOwned, - CS::State: - HasCorpus + HasSolutions + HasClientPerfMonitor + HasExecutions + HasCorpus + HasImported, + CS::State: HasCorpus + HasSolutions + HasExecutions + HasCorpus + HasImported, { /// Evaluate if a set of observation channels has an interesting state fn process_execution( @@ -454,7 +447,7 @@ where OT: ObserversTuple + Serialize + DeserializeOwned, F: Feedback, OF: Feedback, - CS::State: HasCorpus + HasSolutions + HasClientPerfMonitor + HasExecutions + HasImported, + CS::State: HasCorpus + HasSolutions + HasExecutions + HasImported, { /// Process one input, adding to the respective corpora if needed and firing the right events #[inline] @@ -487,7 +480,7 @@ where F: Feedback, OF: Feedback, OT: ObserversTuple + Serialize + DeserializeOwned, - CS::State: HasCorpus + HasSolutions + HasClientPerfMonitor + HasExecutions + HasImported, + CS::State: HasCorpus + HasSolutions + HasExecutions + HasImported, { /// Process one input, adding to the respective corpora if needed and firing the right events #[inline] @@ -590,13 +583,8 @@ where EM: ProgressReporter + EventProcessor, F: Feedback, OF: Feedback, - CS::State: HasClientPerfMonitor - + HasExecutions - + HasMetadata - + HasCorpus - + HasTestcase - + HasImported - + HasLastReportTime, + CS::State: + HasExecutions + HasMetadata + HasCorpus + HasTestcase + HasImported + HasLastReportTime, ST: StagesTuple, { fn fuzz_one( @@ -650,7 +638,7 @@ where CS: Scheduler, F: Feedback, OF: Feedback, - CS::State: UsesInput + HasExecutions + HasClientPerfMonitor + HasCorpus, + CS::State: UsesInput + HasExecutions + HasCorpus, { /// Create a new `StdFuzzer` with standard behavior. pub fn new(scheduler: CS, feedback: F, objective: OF) -> Self { @@ -716,7 +704,7 @@ where OF: Feedback, E: Executor + HasObservers, EM: UsesState, - CS::State: UsesInput + HasExecutions + HasClientPerfMonitor + HasCorpus, + CS::State: UsesInput + HasExecutions + HasCorpus, { /// Runs the input and triggers observers and feedback fn execute_input( diff --git a/libafl/src/monitors/mod.rs b/libafl/src/monitors/mod.rs index eba5a8e291..d79eb496c2 100644 --- a/libafl/src/monitors/mod.rs +++ b/libafl/src/monitors/mod.rs @@ -611,6 +611,26 @@ pub struct ClientPerfMonitor { timer_start: Option, } +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +/// Count the imported testcase from other nodes that came with observers +pub struct ScalabilityMonitor { + /// Imported testcase received with observer + pub testcase_with_observers: usize, + /// Imported testcase received without observer + pub testcase_without_observers: usize, +} + +impl ScalabilityMonitor { + /// Constructor + #[must_use] + pub fn new() -> Self { + Self { + testcase_with_observers: 0, + testcase_without_observers: 0, + } + } +} + /// Various features that are measured for performance #[derive(Serialize, Deserialize, Debug, Clone)] #[repr(u8)] diff --git a/libafl/src/schedulers/ecofuzz.rs b/libafl/src/schedulers/ecofuzz.rs index 07d789010b..b6b3b28a5e 100644 --- a/libafl/src/schedulers/ecofuzz.rs +++ b/libafl/src/schedulers/ecofuzz.rs @@ -8,10 +8,9 @@ use serde::{Deserialize, Serialize}; use crate::{ corpus::{Corpus, CorpusId, HasTestcase, SchedulerTestcaseMetadata, Testcase}, - inputs::UsesInput, observers::{MapObserver, ObserversTuple}, schedulers::{powersched::SchedulerMetadata, testcase_score::TestcaseScore, Scheduler}, - state::{HasCorpus, HasExecutions, HasMetadata, HasRand, UsesState}, + state::{HasCorpus, HasExecutions, HasMetadata, HasRand, State, UsesState}, Error, }; @@ -205,14 +204,14 @@ where impl UsesState for EcoScheduler where - S: UsesInput, + S: State, { type State = S; } impl Scheduler for EcoScheduler where - S: HasCorpus + HasMetadata + HasRand + HasExecutions + HasTestcase, + S: HasCorpus + HasMetadata + HasRand + HasExecutions + HasTestcase + State, O: MapObserver, { /// Called when a [`Testcase`] is added to the corpus diff --git a/libafl/src/schedulers/mod.rs b/libafl/src/schedulers/mod.rs index bc613194f4..3e059a3159 100644 --- a/libafl/src/schedulers/mod.rs +++ b/libafl/src/schedulers/mod.rs @@ -38,7 +38,7 @@ use crate::{ inputs::UsesInput, observers::ObserversTuple, random_corpus_id, - state::{HasCorpus, HasRand, UsesState}, + state::{HasCorpus, HasRand, State, UsesState}, Error, }; @@ -114,14 +114,14 @@ pub struct RandScheduler { impl UsesState for RandScheduler where - S: UsesInput + HasTestcase, + S: State + HasTestcase, { type State = S; } impl Scheduler for RandScheduler where - S: HasCorpus + HasRand + HasTestcase, + S: HasCorpus + HasRand + HasTestcase + State, { fn on_add(&mut self, state: &mut Self::State, idx: CorpusId) -> Result<(), Error> { // Set parent id diff --git a/libafl/src/schedulers/powersched.rs b/libafl/src/schedulers/powersched.rs index 2d8edd17f9..f70e9aabc4 100644 --- a/libafl/src/schedulers/powersched.rs +++ b/libafl/src/schedulers/powersched.rs @@ -13,7 +13,7 @@ use crate::{ inputs::UsesInput, observers::{MapObserver, ObserversTuple}, schedulers::{RemovableScheduler, Scheduler}, - state::{HasCorpus, HasMetadata, UsesState}, + state::{HasCorpus, HasMetadata, State, UsesState}, Error, }; @@ -177,14 +177,14 @@ pub struct PowerQueueScheduler { impl UsesState for PowerQueueScheduler where - S: UsesInput, + S: State, { type State = S; } impl RemovableScheduler for PowerQueueScheduler where - S: HasCorpus + HasMetadata + HasTestcase, + S: HasCorpus + HasMetadata + HasTestcase + State, O: MapObserver, { #[allow(clippy::cast_precision_loss)] @@ -253,7 +253,7 @@ where impl Scheduler for PowerQueueScheduler where - S: HasCorpus + HasMetadata + HasTestcase, + S: HasCorpus + HasMetadata + HasTestcase + State, O: MapObserver, { /// Called when a [`Testcase`] is added to the corpus diff --git a/libafl/src/schedulers/probabilistic_sampling.rs b/libafl/src/schedulers/probabilistic_sampling.rs index 84cf779c8f..a5fe0cb644 100644 --- a/libafl/src/schedulers/probabilistic_sampling.rs +++ b/libafl/src/schedulers/probabilistic_sampling.rs @@ -12,7 +12,7 @@ use crate::{ corpus::{Corpus, CorpusId, HasTestcase}, inputs::UsesInput, schedulers::{Scheduler, TestcaseScore}, - state::{HasCorpus, HasMetadata, HasRand, UsesState}, + state::{HasCorpus, HasMetadata, HasRand, State, UsesState}, Error, }; @@ -93,7 +93,7 @@ where impl UsesState for ProbabilitySamplingScheduler where - S: UsesInput + HasTestcase, + S: State + HasTestcase, { type State = S; } @@ -101,7 +101,7 @@ where impl Scheduler for ProbabilitySamplingScheduler where F: TestcaseScore, - S: HasCorpus + HasMetadata + HasRand + HasTestcase, + S: HasCorpus + HasMetadata + HasRand + HasTestcase + State, { fn on_add(&mut self, state: &mut Self::State, idx: CorpusId) -> Result<(), Error> { let current_idx = *state.corpus().current(); diff --git a/libafl/src/schedulers/queue.rs b/libafl/src/schedulers/queue.rs index 83754928fc..12276f4487 100644 --- a/libafl/src/schedulers/queue.rs +++ b/libafl/src/schedulers/queue.rs @@ -5,9 +5,8 @@ use core::marker::PhantomData; use crate::{ corpus::{Corpus, CorpusId, HasTestcase}, - inputs::UsesInput, schedulers::{RemovableScheduler, Scheduler}, - state::{HasCorpus, UsesState}, + state::{HasCorpus, State, UsesState}, Error, }; @@ -19,16 +18,16 @@ pub struct QueueScheduler { impl UsesState for QueueScheduler where - S: UsesInput, + S: State, { type State = S; } -impl RemovableScheduler for QueueScheduler where S: HasCorpus + HasTestcase {} +impl RemovableScheduler for QueueScheduler where S: HasCorpus + HasTestcase + State {} impl Scheduler for QueueScheduler where - S: HasCorpus + HasTestcase, + S: HasCorpus + HasTestcase + State, { fn on_add(&mut self, state: &mut Self::State, idx: CorpusId) -> Result<(), Error> { // Set parent id diff --git a/libafl/src/schedulers/tuneable.rs b/libafl/src/schedulers/tuneable.rs index a7f4bc19ee..eb6577aaf3 100644 --- a/libafl/src/schedulers/tuneable.rs +++ b/libafl/src/schedulers/tuneable.rs @@ -11,9 +11,8 @@ use serde::{Deserialize, Serialize}; use super::RemovableScheduler; use crate::{ corpus::{Corpus, CorpusId, HasTestcase}, - inputs::UsesInput, schedulers::Scheduler, - state::{HasCorpus, HasMetadata, UsesState}, + state::{HasCorpus, HasMetadata, State, UsesState}, Error, }; @@ -91,16 +90,19 @@ where impl UsesState for TuneableScheduler where - S: UsesInput, + S: State, { type State = S; } -impl RemovableScheduler for TuneableScheduler where S: HasCorpus + HasMetadata + HasTestcase {} +impl RemovableScheduler for TuneableScheduler where + S: HasCorpus + HasMetadata + HasTestcase + State +{ +} impl Scheduler for TuneableScheduler where - S: HasCorpus + HasMetadata + HasTestcase, + S: HasCorpus + HasMetadata + HasTestcase + State, { fn on_add(&mut self, state: &mut Self::State, idx: CorpusId) -> Result<(), Error> { // Set parent id diff --git a/libafl/src/schedulers/weighted.rs b/libafl/src/schedulers/weighted.rs index 7d5b88d44f..c7bac5ed73 100644 --- a/libafl/src/schedulers/weighted.rs +++ b/libafl/src/schedulers/weighted.rs @@ -20,7 +20,7 @@ use crate::{ testcase_score::{CorpusWeightTestcaseScore, TestcaseScore}, RemovableScheduler, Scheduler, }, - state::{HasCorpus, HasMetadata, HasRand, UsesState}, + state::{HasCorpus, HasMetadata, HasRand, State, UsesState}, Error, }; @@ -224,7 +224,7 @@ where impl UsesState for WeightedScheduler where - S: UsesInput, + S: State, { type State = S; } @@ -233,7 +233,7 @@ impl RemovableScheduler for WeightedScheduler where F: TestcaseScore, O: MapObserver, - S: HasCorpus + HasMetadata + HasRand + HasTestcase, + S: HasCorpus + HasMetadata + HasRand + HasTestcase + State, { #[allow(clippy::cast_precision_loss)] fn on_remove( @@ -305,7 +305,7 @@ impl Scheduler for WeightedScheduler where F: TestcaseScore, O: MapObserver, - S: HasCorpus + HasMetadata + HasRand + HasTestcase, + S: HasCorpus + HasMetadata + HasRand + HasTestcase + State, { /// Called when a [`Testcase`] is added to the corpus fn on_add(&mut self, state: &mut S, idx: CorpusId) -> Result<(), Error> { diff --git a/libafl/src/stages/calibrate.rs b/libafl/src/stages/calibrate.rs index e3eb368fb8..6ad78e75ee 100644 --- a/libafl/src/stages/calibrate.rs +++ b/libafl/src/stages/calibrate.rs @@ -17,14 +17,11 @@ use crate::{ executors::{Executor, ExitKind, HasObservers}, feedbacks::{map::MapFeedbackMetadata, HasObserverName}, fuzzer::Evaluator, - inputs::UsesInput, monitors::UserStats, observers::{MapObserver, ObserversTuple, UsesObserver}, schedulers::powersched::SchedulerMetadata, stages::Stage, - state::{ - HasClientPerfMonitor, HasCorpus, HasExecutions, HasMetadata, HasNamedMetadata, UsesState, - }, + state::{HasCorpus, HasExecutions, HasMetadata, HasNamedMetadata, State, UsesState}, Error, }; @@ -80,7 +77,7 @@ const CAL_STAGE_MAX: usize = 8; // AFL++'s CAL_CYCLES + 1 impl UsesState for CalibrationStage where - S: UsesInput, + S: State, { type State = S; } @@ -92,7 +89,7 @@ where O: MapObserver, for<'de> ::Entry: Serialize + Deserialize<'de> + 'static, OT: ObserversTuple, - E::State: HasCorpus + HasMetadata + HasClientPerfMonitor + HasNamedMetadata + HasExecutions, + E::State: HasCorpus + HasMetadata + HasNamedMetadata + HasExecutions, Z: Evaluator, { #[inline] diff --git a/libafl/src/stages/concolic.rs b/libafl/src/stages/concolic.rs index 3c810f95f2..bd3e6e23da 100644 --- a/libafl/src/stages/concolic.rs +++ b/libafl/src/stages/concolic.rs @@ -8,11 +8,15 @@ use alloc::{borrow::ToOwned, string::ToString, vec::Vec}; use core::marker::PhantomData; use super::{Stage, TracingStage}; +#[cfg(feature = "introspection")] +use crate::state::HasClientPerfMonitor; +#[cfg(feature = "concolic_mutation")] +use crate::state::State; use crate::{ corpus::{Corpus, CorpusId}, executors::{Executor, HasObservers}, observers::concolic::ConcolicObserver, - state::{HasClientPerfMonitor, HasCorpus, HasExecutions, HasMetadata}, + state::{HasCorpus, HasExecutions, HasMetadata}, Error, }; @@ -35,7 +39,7 @@ where E: UsesState, EM: UsesState, TE: Executor + HasObservers, - TE::State: HasClientPerfMonitor + HasExecutions + HasCorpus, + TE::State: HasExecutions + HasCorpus, Z: UsesState, { #[inline] @@ -354,7 +358,7 @@ where EM: UsesState, Z: Evaluator, Z::Input: HasBytesVec, - Z::State: HasClientPerfMonitor + HasExecutions + HasCorpus, + Z::State: State + HasExecutions + HasCorpus, { #[inline] fn perform( diff --git a/libafl/src/stages/generalization.rs b/libafl/src/stages/generalization.rs index 6f0db3d577..eb3cfbac66 100644 --- a/libafl/src/stages/generalization.rs +++ b/libafl/src/stages/generalization.rs @@ -8,8 +8,6 @@ use core::{fmt::Debug, marker::PhantomData}; use libafl_bolts::AsSlice; -#[cfg(feature = "introspection")] -use crate::monitors::PerfFeature; use crate::{ corpus::{Corpus, CorpusId}, executors::{Executor, HasObservers}, @@ -19,9 +17,11 @@ use crate::{ observers::{MapObserver, ObserversTuple}, stages::Stage, start_timer, - state::{HasClientPerfMonitor, HasCorpus, HasExecutions, HasMetadata, UsesState}, + state::{HasCorpus, HasExecutions, HasMetadata, UsesState}, Error, }; +#[cfg(feature = "introspection")] +use crate::{monitors::PerfFeature, state::HasClientPerfMonitor}; const MAX_GENERALIZED_LEN: usize = 8192; @@ -60,11 +60,7 @@ where O: MapObserver, E: Executor + HasObservers, E::Observers: ObserversTuple, - E::State: UsesInput - + HasClientPerfMonitor - + HasExecutions - + HasMetadata - + HasCorpus, + E::State: UsesInput + HasExecutions + HasMetadata + HasCorpus, EM: UsesState, Z: UsesState, { @@ -316,11 +312,7 @@ where EM: UsesState, O: MapObserver, OT: ObserversTuple, - EM::State: UsesInput - + HasClientPerfMonitor - + HasExecutions - + HasMetadata - + HasCorpus, + EM::State: UsesInput + HasExecutions + HasMetadata + HasCorpus, { /// Create a new [`GeneralizationStage`]. #[must_use] diff --git a/libafl/src/stages/mod.rs b/libafl/src/stages/mod.rs index b4e9725890..e0461469fc 100644 --- a/libafl/src/stages/mod.rs +++ b/libafl/src/stages/mod.rs @@ -75,10 +75,7 @@ use crate::{ inputs::UsesInput, observers::ObserversTuple, schedulers::Scheduler, - state::{ - HasClientPerfMonitor, HasCorpus, HasExecutions, HasLastReportTime, HasMetadata, HasRand, - UsesState, - }, + state::{HasCorpus, HasExecutions, HasLastReportTime, HasMetadata, HasRand, UsesState}, Error, EvaluatorObservers, ExecutesInput, ExecutionProcessor, HasScheduler, }; @@ -260,12 +257,7 @@ where impl Stage for PushStageAdapter where CS: Scheduler, - CS::State: HasClientPerfMonitor - + HasExecutions - + HasMetadata - + HasRand - + HasCorpus - + HasLastReportTime, + CS::State: HasExecutions + HasMetadata + HasRand + HasCorpus + HasLastReportTime, E: Executor + HasObservers, EM: EventFirer + EventRestarter diff --git a/libafl/src/stages/mutational.rs b/libafl/src/stages/mutational.rs index 8d34bdd02d..56f23213fb 100644 --- a/libafl/src/stages/mutational.rs +++ b/libafl/src/stages/mutational.rs @@ -5,8 +5,6 @@ use core::marker::PhantomData; use libafl_bolts::rands::Rand; -#[cfg(feature = "introspection")] -use crate::monitors::PerfFeature; use crate::{ corpus::{Corpus, CorpusId, Testcase}, fuzzer::Evaluator, @@ -15,9 +13,11 @@ use crate::{ mutators::{MultiMutator, MutationResult, Mutator}, stages::Stage, start_timer, - state::{HasClientPerfMonitor, HasCorpus, HasRand, UsesState}, + state::{HasCorpus, HasRand, UsesState}, Error, }; +#[cfg(feature = "introspection")] +use crate::{monitors::PerfFeature, state::HasClientPerfMonitor}; // TODO multi mutators stage @@ -94,7 +94,7 @@ where M: Mutator, EM: UsesState, Z: Evaluator, - Self::State: HasClientPerfMonitor + HasCorpus, + Self::State: HasCorpus, I: MutatedTransform + Clone, { /// The mutator registered for this stage @@ -170,7 +170,7 @@ where EM: UsesState, M: Mutator, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand, + Z::State: HasCorpus + HasRand, I: MutatedTransform + Clone, { /// The mutator, added to this stage @@ -197,7 +197,7 @@ where EM: UsesState, M: Mutator, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand, + Z::State: HasCorpus + HasRand, { type State = Z::State; } @@ -208,7 +208,7 @@ where EM: UsesState, M: Mutator, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand, + Z::State: HasCorpus + HasRand, I: MutatedTransform + Clone, { #[inline] @@ -236,7 +236,7 @@ where EM: UsesState, M: Mutator, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand, + Z::State: HasCorpus + HasRand, { /// Creates a new default mutational stage pub fn new(mutator: M) -> Self { @@ -255,7 +255,7 @@ where EM: UsesState, M: Mutator, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand, + Z::State: HasCorpus + HasRand, { /// Creates a new transforming mutational stage with the default max iterations pub fn transforming(mutator: M) -> Self { @@ -286,7 +286,7 @@ where EM: UsesState, M: MultiMutator, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand, + Z::State: HasCorpus + HasRand, { type State = Z::State; } @@ -297,7 +297,7 @@ where EM: UsesState, M: MultiMutator, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand, + Z::State: HasCorpus + HasRand, I: MutatedTransform + Clone, { #[inline] @@ -338,7 +338,7 @@ where EM: UsesState, M: MultiMutator, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand, + Z::State: HasCorpus + HasRand, { /// Creates a new default mutational stage pub fn new(mutator: M) -> Self { @@ -352,7 +352,7 @@ where EM: UsesState, M: MultiMutator, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand, + Z::State: HasCorpus + HasRand, { /// Creates a new transforming mutational stage pub fn transforming(mutator: M) -> Self { diff --git a/libafl/src/stages/power.rs b/libafl/src/stages/power.rs index b25ef64f96..b030698b56 100644 --- a/libafl/src/stages/power.rs +++ b/libafl/src/stages/power.rs @@ -11,7 +11,7 @@ use crate::{ ecofuzz::EcoTestcaseScore, testcase_score::CorpusPowerTestcaseScore, TestcaseScore, }, stages::{mutational::MutatedTransform, MutationalStage, Stage}, - state::{HasClientPerfMonitor, HasCorpus, HasMetadata, HasRand, UsesState}, + state::{HasCorpus, HasMetadata, HasRand, UsesState}, Error, }; @@ -36,7 +36,7 @@ where EM: UsesState, F: TestcaseScore, M: Mutator, - E::State: HasClientPerfMonitor + HasCorpus + HasMetadata + HasRand, + E::State: HasCorpus + HasMetadata + HasRand, Z: Evaluator, I: MutatedTransform + Clone, { @@ -69,7 +69,7 @@ where EM: UsesState, F: TestcaseScore, M: Mutator, - E::State: HasClientPerfMonitor + HasCorpus + HasMetadata + HasRand, + E::State: HasCorpus + HasMetadata + HasRand, Z: Evaluator, I: MutatedTransform + Clone, { @@ -94,7 +94,7 @@ where EM: UsesState, F: TestcaseScore, M: Mutator, - E::State: HasClientPerfMonitor + HasCorpus + HasMetadata + HasRand, + E::State: HasCorpus + HasMetadata + HasRand, Z: Evaluator, { /// Creates a new [`PowerMutationalStage`] @@ -109,7 +109,7 @@ where EM: UsesState, F: TestcaseScore, M: Mutator, - E::State: HasClientPerfMonitor + HasCorpus + HasMetadata + HasRand, + E::State: HasCorpus + HasMetadata + HasRand, Z: Evaluator, { /// Creates a new transforming [`PowerMutationalStage`] diff --git a/libafl/src/stages/push/mod.rs b/libafl/src/stages/push/mod.rs index 0b139bb52c..61884c729a 100644 --- a/libafl/src/stages/push/mod.rs +++ b/libafl/src/stages/push/mod.rs @@ -22,9 +22,7 @@ use crate::{ inputs::UsesInput, observers::ObserversTuple, schedulers::Scheduler, - state::{ - HasClientPerfMonitor, HasCorpus, HasExecutions, HasLastReportTime, HasMetadata, HasRand, - }, + state::{HasCorpus, HasExecutions, HasLastReportTime, HasMetadata, HasRand}, Error, EvaluatorObservers, ExecutionProcessor, HasScheduler, }; @@ -39,7 +37,7 @@ where CS: Scheduler, EM: EventFirer + EventRestarter + HasEventManagerId, OT: ObserversTuple, - CS::State: HasClientPerfMonitor + HasRand + HasCorpus, + CS::State: HasRand + HasCorpus, Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, @@ -60,7 +58,7 @@ where CS: Scheduler, EM: EventFirer + EventRestarter + HasEventManagerId, OT: ObserversTuple, - CS::State: HasClientPerfMonitor + HasRand + HasCorpus, + CS::State: HasRand + HasCorpus, Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, @@ -85,7 +83,7 @@ where CS: Scheduler, EM: EventFirer + EventRestarter + HasEventManagerId, OT: ObserversTuple, - CS::State: HasClientPerfMonitor + HasRand + HasCorpus, + CS::State: HasRand + HasCorpus, Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, @@ -115,7 +113,7 @@ where CS: Scheduler, EM: EventFirer + EventRestarter + HasEventManagerId, OT: ObserversTuple, - CS::State: HasClientPerfMonitor + HasRand + HasCorpus, + CS::State: HasRand + HasCorpus, Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, @@ -182,12 +180,7 @@ where pub trait PushStage: Iterator where CS: Scheduler, - CS::State: HasClientPerfMonitor - + HasRand - + HasExecutions - + HasMetadata - + HasCorpus - + HasLastReportTime, + CS::State: HasRand + HasExecutions + HasMetadata + HasCorpus + HasLastReportTime, EM: EventFirer + EventRestarter + HasEventManagerId + ProgressReporter, OT: ObserversTuple, Z: ExecutionProcessor diff --git a/libafl/src/stages/push/mutational.rs b/libafl/src/stages/push/mutational.rs index 2b1ae53bde..f82ff27f9e 100644 --- a/libafl/src/stages/push/mutational.rs +++ b/libafl/src/stages/push/mutational.rs @@ -10,8 +10,6 @@ use core::{ use libafl_bolts::rands::Rand; use super::{PushStage, PushStageHelper, PushStageSharedState}; -#[cfg(feature = "introspection")] -use crate::monitors::PerfFeature; use crate::{ corpus::{Corpus, CorpusId}, events::{EventFirer, EventRestarter, HasEventManagerId, ProgressReporter}, @@ -22,11 +20,11 @@ use crate::{ observers::ObserversTuple, schedulers::Scheduler, start_timer, - state::{ - HasClientPerfMonitor, HasCorpus, HasExecutions, HasLastReportTime, HasMetadata, HasRand, - }, + state::{HasCorpus, HasExecutions, HasLastReportTime, HasMetadata, HasRand}, Error, EvaluatorObservers, ExecutionProcessor, HasScheduler, }; +#[cfg(feature = "introspection")] +use crate::{monitors::PerfFeature, state::HasClientPerfMonitor}; /// The default maximum number of mutations to perform per input. pub static DEFAULT_MUTATIONAL_MAX_ITERATIONS: u64 = 128; @@ -46,7 +44,7 @@ where EM: EventFirer + EventRestarter + HasEventManagerId, M: Mutator, OT: ObserversTuple, - CS::State: HasClientPerfMonitor + HasRand + HasCorpus + Clone + Debug, + CS::State: HasRand + HasCorpus + Clone + Debug, Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, @@ -68,7 +66,7 @@ where EM: EventFirer + EventRestarter + HasEventManagerId, M: Mutator, OT: ObserversTuple, - CS::State: HasClientPerfMonitor + HasCorpus + HasRand + Clone + Debug, + CS::State: HasCorpus + HasRand + Clone + Debug, Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, @@ -91,14 +89,8 @@ where EM: EventFirer + EventRestarter + HasEventManagerId + ProgressReporter, M: Mutator, OT: ObserversTuple, - CS::State: HasClientPerfMonitor - + HasCorpus - + HasRand - + HasExecutions - + HasLastReportTime - + HasMetadata - + Clone - + Debug, + CS::State: + HasCorpus + HasRand + HasExecutions + HasLastReportTime + HasMetadata + Clone + Debug, Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, @@ -211,14 +203,8 @@ where EM: EventFirer + EventRestarter + HasEventManagerId + ProgressReporter, M: Mutator, OT: ObserversTuple, - CS::State: HasClientPerfMonitor - + HasCorpus - + HasRand - + HasExecutions - + HasMetadata - + HasLastReportTime - + Clone - + Debug, + CS::State: + HasCorpus + HasRand + HasExecutions + HasMetadata + HasLastReportTime + Clone + Debug, Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, @@ -236,7 +222,7 @@ where EM: EventFirer + EventRestarter + HasEventManagerId, M: Mutator, OT: ObserversTuple, - CS::State: HasClientPerfMonitor + HasCorpus + HasRand + Clone + Debug, + CS::State: HasCorpus + HasRand + Clone + Debug, Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, diff --git a/libafl/src/stages/string.rs b/libafl/src/stages/string.rs index a2e441b994..d487a0a10e 100644 --- a/libafl/src/stages/string.rs +++ b/libafl/src/stages/string.rs @@ -9,9 +9,9 @@ use serde::{Deserialize, Serialize}; use crate::{ corpus::{CorpusId, HasTestcase}, - inputs::{BytesInput, HasBytesVec, UsesInput}, + inputs::{BytesInput, HasBytesVec}, stages::Stage, - state::{HasCorpus, HasMetadata, UsesState}, + state::{HasCorpus, HasMetadata, State, UsesState}, }; /// Metadata which stores the list of pre-computed string-like ranges in the input @@ -92,14 +92,14 @@ impl StringIdentificationStage { impl UsesState for StringIdentificationStage where - S: UsesInput, + S: State, { type State = S; } impl Stage for StringIdentificationStage where - S: HasTestcase + HasCorpus, + S: HasTestcase + HasCorpus + State, E: UsesState, EM: UsesState, Z: UsesState, diff --git a/libafl/src/stages/sync.rs b/libafl/src/stages/sync.rs index f8e3c4acca..d82638bc4c 100644 --- a/libafl/src/stages/sync.rs +++ b/libafl/src/stages/sync.rs @@ -10,6 +10,8 @@ use std::{ use libafl_bolts::{current_time, shmem::ShMemProvider}; use serde::{Deserialize, Serialize}; +#[cfg(feature = "introspection")] +use crate::state::HasClientPerfMonitor; use crate::{ corpus::{Corpus, CorpusId, HasTestcase}, events::{llmp::LlmpEventConverter, Event, EventConfig, EventFirer}, @@ -17,7 +19,7 @@ use crate::{ fuzzer::{Evaluator, EvaluatorObservers, ExecutionProcessor}, inputs::{Input, InputConverter, UsesInput}, stages::Stage, - state::{HasClientPerfMonitor, HasCorpus, HasExecutions, HasMetadata, HasRand, UsesState}, + state::{HasCorpus, HasExecutions, HasMetadata, HasRand, State, UsesState}, Error, }; @@ -63,7 +65,7 @@ where E: UsesState, EM: UsesState, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand + HasMetadata, + Z::State: HasCorpus + HasRand + HasMetadata, { #[inline] fn perform( @@ -108,7 +110,7 @@ where E: UsesState, EM: UsesState, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand + HasMetadata, + Z::State: HasCorpus + HasRand + HasMetadata, { /// Creates a new [`SyncFromDiskStage`] #[must_use] @@ -174,7 +176,7 @@ where E: UsesState, EM: UsesState, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand + HasMetadata, + Z::State: HasCorpus + HasRand + HasMetadata, { /// Creates a new [`SyncFromDiskStage`] invoking `Input::from_file` to load inputs #[must_use] @@ -231,7 +233,7 @@ where impl UsesState for SyncFromBrokerStage where SP: ShMemProvider + 'static, - S: UsesInput, + S: State, IC: InputConverter, ICB: InputConverter, DI: Input, @@ -242,13 +244,7 @@ where impl Stage for SyncFromBrokerStage where EM: UsesState + EventFirer, - S: UsesInput - + HasClientPerfMonitor - + HasExecutions - + HasCorpus - + HasRand - + HasMetadata - + HasTestcase, + S: State + HasExecutions + HasCorpus + HasRand + HasMetadata + HasTestcase, SP: ShMemProvider, E: HasObservers + Executor, for<'a> E::Observers: Deserialize<'a>, diff --git a/libafl/src/stages/tmin.rs b/libafl/src/stages/tmin.rs index 73db1ad195..f7343aeb6f 100644 --- a/libafl/src/stages/tmin.rs +++ b/libafl/src/stages/tmin.rs @@ -6,8 +6,6 @@ use core::{fmt::Debug, hash::Hash, marker::PhantomData}; use ahash::RandomState; use libafl_bolts::{HasLen, Named}; -#[cfg(feature = "introspection")] -use crate::monitors::PerfFeature; use crate::{ corpus::{Corpus, CorpusId, Testcase}, events::EventFirer, @@ -20,9 +18,11 @@ use crate::{ schedulers::{RemovableScheduler, Scheduler}, stages::Stage, start_timer, - state::{HasClientPerfMonitor, HasCorpus, HasExecutions, HasMaxSize, HasSolutions, UsesState}, + state::{HasCorpus, HasExecutions, HasMaxSize, HasSolutions, State, UsesState}, Error, ExecutesInput, ExecutionProcessor, HasFeedback, HasScheduler, }; +#[cfg(feature = "introspection")] +use crate::{monitors::PerfFeature, state::HasClientPerfMonitor}; /// Mutational stage which minimizes corpus entries. /// @@ -30,7 +30,7 @@ use crate::{ pub trait TMinMutationalStage: Stage + FeedbackFactory where - Self::State: HasCorpus + HasSolutions + HasExecutions + HasMaxSize + HasClientPerfMonitor, + Self::State: HasCorpus + HasSolutions + HasExecutions + HasMaxSize, ::Input: HasLen + Hash, CS: Scheduler + RemovableScheduler, E: Executor + HasObservers, @@ -195,8 +195,7 @@ impl Stage for StdTMinMutationalStage where CS: Scheduler + RemovableScheduler, - CS::State: - HasCorpus + HasSolutions + HasExecutions + HasMaxSize + HasClientPerfMonitor + HasCorpus, + CS::State: HasCorpus + HasSolutions + HasExecutions + HasMaxSize + HasCorpus, ::Input: HasLen + Hash, E: Executor + HasObservers, EM: EventFirer, @@ -233,7 +232,6 @@ where F2: Feedback, FF: FeedbackFactory, Z: UsesState, - Z::State: HasClientPerfMonitor, { fn create_feedback(&self, ctx: &OT) -> F2 { self.factory.create_feedback(ctx) @@ -252,7 +250,7 @@ where ::Input: HasLen + Hash, M: Mutator, OT: ObserversTuple, - CS::State: HasClientPerfMonitor + HasCorpus + HasSolutions + HasExecutions + HasMaxSize, + CS::State: HasCorpus + HasSolutions + HasExecutions + HasMaxSize, Z: ExecutionProcessor + ExecutesInput + HasFeedback @@ -332,7 +330,7 @@ impl HasObserverName for MapEqualityFeedback { impl Feedback for MapEqualityFeedback where M: MapObserver, - S: UsesInput + HasClientPerfMonitor, + S: State, { fn is_interesting( &mut self, @@ -383,7 +381,7 @@ impl FeedbackFactory, S, OT> for MapEquality where M: MapObserver, OT: ObserversTuple, - S: UsesInput + HasClientPerfMonitor + Debug, + S: State + Debug, { fn create_feedback(&self, observers: &OT) -> MapEqualityFeedback { let obs = observers diff --git a/libafl/src/stages/tracing.rs b/libafl/src/stages/tracing.rs index 0dcf99012b..6aebb41dec 100644 --- a/libafl/src/stages/tracing.rs +++ b/libafl/src/stages/tracing.rs @@ -2,8 +2,6 @@ use core::{fmt::Debug, marker::PhantomData}; -#[cfg(feature = "introspection")] -use crate::monitors::PerfFeature; use crate::{ corpus::{Corpus, CorpusId}, executors::{Executor, HasObservers, ShadowExecutor}, @@ -11,9 +9,11 @@ use crate::{ observers::ObserversTuple, stages::Stage, start_timer, - state::{HasClientPerfMonitor, HasCorpus, HasExecutions, State, UsesState}, + state::{HasCorpus, HasExecutions, State, UsesState}, Error, }; +#[cfg(feature = "introspection")] +use crate::{monitors::PerfFeature, state::HasClientPerfMonitor}; /// A stage that runs a tracer executor #[derive(Clone, Debug)] @@ -34,7 +34,7 @@ impl Stage for TracingStage where E: UsesState, TE: Executor + HasObservers, - TE::State: HasClientPerfMonitor + HasExecutions + HasCorpus, + TE::State: HasExecutions + HasCorpus, EM: UsesState, Z: UsesState, { @@ -115,7 +115,7 @@ where EM: UsesState, SOT: ObserversTuple, Z: UsesState, - E::State: State + HasClientPerfMonitor + HasExecutions + HasCorpus + Debug, + E::State: State + HasExecutions + HasCorpus + Debug, { #[inline] fn perform( @@ -160,7 +160,7 @@ where impl ShadowTracingStage where E: Executor + HasObservers, - E::State: State + HasClientPerfMonitor + HasExecutions + HasCorpus, + E::State: State + HasExecutions + HasCorpus, EM: UsesState, SOT: ObserversTuple, Z: UsesState, diff --git a/libafl/src/stages/tuneable.rs b/libafl/src/stages/tuneable.rs index 362cd8f49f..19f8576bdb 100644 --- a/libafl/src/stages/tuneable.rs +++ b/libafl/src/stages/tuneable.rs @@ -6,8 +6,6 @@ use core::{marker::PhantomData, time::Duration}; use libafl_bolts::{current_time, impl_serdeany, rands::Rand}; use serde::{Deserialize, Serialize}; -#[cfg(feature = "introspection")] -use crate::monitors::PerfFeature; use crate::{ corpus::{Corpus, CorpusId}, mark_feature_time, @@ -17,9 +15,11 @@ use crate::{ MutationalStage, Stage, }, start_timer, - state::{HasClientPerfMonitor, HasCorpus, HasMetadata, HasNamedMetadata, HasRand, UsesState}, + state::{HasCorpus, HasMetadata, HasNamedMetadata, HasRand, UsesState}, Error, Evaluator, }; +#[cfg(feature = "introspection")] +use crate::{monitors::PerfFeature, state::HasClientPerfMonitor}; #[cfg_attr( any(not(feature = "serdeany_autoreg"), miri), @@ -161,7 +161,7 @@ where EM: UsesState, M: Mutator, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand + HasNamedMetadata + HasMetadata, + Z::State: HasCorpus + HasRand + HasNamedMetadata + HasMetadata, I: MutatedTransform + Clone, { /// Runs this (mutational) stage for the given `testcase` @@ -254,7 +254,7 @@ where EM: UsesState, M: Mutator, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand, + Z::State: HasCorpus + HasRand, I: MutatedTransform + Clone, { type State = Z::State; @@ -266,7 +266,7 @@ where EM: UsesState, M: Mutator, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand + HasNamedMetadata + HasMetadata, + Z::State: HasCorpus + HasRand + HasNamedMetadata + HasMetadata, I: MutatedTransform + Clone, { #[inline] @@ -294,7 +294,7 @@ where EM: UsesState, M: Mutator, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand + HasNamedMetadata + HasMetadata, + Z::State: HasCorpus + HasRand + HasNamedMetadata + HasMetadata, I: MutatedTransform + Clone, { /// Creates a new default tuneable mutational stage @@ -462,7 +462,7 @@ where EM: UsesState, M: Mutator, Z: Evaluator, - Z::State: HasClientPerfMonitor + HasCorpus + HasRand + HasNamedMetadata, + Z::State: HasCorpus + HasRand + HasNamedMetadata, { /// Creates a new tranforming mutational stage #[must_use] diff --git a/libafl/src/state/mod.rs b/libafl/src/state/mod.rs index 57cb3599f2..ecfb130655 100644 --- a/libafl/src/state/mod.rs +++ b/libafl/src/state/mod.rs @@ -19,6 +19,10 @@ use libafl_bolts::{ }; use serde::{de::DeserializeOwned, Deserialize, Serialize}; +#[cfg(feature = "introspection")] +use crate::monitors::ClientPerfMonitor; +#[cfg(feature = "scalability_introspection")] +use crate::monitors::ScalabilityMonitor; use crate::{ corpus::{Corpus, CorpusId, HasTestcase, Testcase}, events::{Event, EventFirer, LogSeverity}, @@ -26,7 +30,6 @@ use crate::{ fuzzer::{Evaluator, ExecuteInputResult}, generators::Generator, inputs::{Input, UsesInput}, - monitors::ClientPerfMonitor, Error, }; @@ -36,12 +39,15 @@ pub const DEFAULT_MAX_SIZE: usize = 1_048_576; /// The [`State`] of the fuzzer. /// Contains all important information about the current run. /// Will be used to restart the fuzzing process at any time. -pub trait State: UsesInput + Serialize + DeserializeOwned {} +pub trait State: + UsesInput + Serialize + DeserializeOwned + MaybeHasClientPerfMonitor + MaybeHasScalabilityMonitor +{ +} /// Structs which implement this trait are aware of the state. This is used for type enforcement. pub trait UsesState: UsesInput::Input> { /// The state known by this type. - type State: UsesInput; + type State: State; } // blanket impl which automatically defines UsesInput for anything that implements UsesState @@ -92,6 +98,7 @@ pub trait HasRand { fn rand_mut(&mut self) -> &mut Self::Rand; } +#[cfg(feature = "introspection")] /// Trait for offering a [`ClientPerfMonitor`] pub trait HasClientPerfMonitor { /// [`ClientPerfMonitor`] itself @@ -101,6 +108,43 @@ pub trait HasClientPerfMonitor { fn introspection_monitor_mut(&mut self) -> &mut ClientPerfMonitor; } +/// Intermediate trait for `HasClientPerfMonitor` +#[cfg(feature = "introspection")] +pub trait MaybeHasClientPerfMonitor: HasClientPerfMonitor {} + +/// Intermediate trait for `HasClientPerfmonitor` +#[cfg(not(feature = "introspection"))] +pub trait MaybeHasClientPerfMonitor {} + +#[cfg(not(feature = "introspection"))] +impl MaybeHasClientPerfMonitor for T {} + +#[cfg(feature = "introspection")] +impl MaybeHasClientPerfMonitor for T where T: HasClientPerfMonitor {} + +/// Intermediate trait for `HasScalabilityMonitor` +#[cfg(feature = "scalability_monitor")] +pub trait MaybeHasScalabilityMonitor: HasScalabilityMonitor {} +/// Intermediate trait for `HasScalabilityMonitor` +#[cfg(not(feature = "scalability_monitor"))] +pub trait MaybeHasScalabilityMonitor {} + +#[cfg(not(feature = "scalability_monitor"))] +impl MaybeHasScalabilityMonitor for T {} + +#[cfg(feature = "scalability_monitor")] +impl MaybeHasScalabilityMonitor for T where T: HasScalabilityMonitor {} + +/// Trait for offering a [`ScalabilityMonitor`] +#[cfg(feature = "scalability_monitor")] +pub trait HasScalabilityMonitor { + /// Ref to [`ScalabilityMonitor`] + fn scalability_monitor(&self) -> &ScalabilityMonitor; + + /// Mutable ref to [`ScalabilityMonitor`] + fn scalability_monitor_mut(&mut self) -> &mut ScalabilityMonitor; +} + /// Trait for elements offering metadata pub trait HasMetadata { /// A map, storing all metadata @@ -266,6 +310,8 @@ pub struct StdState { /// Performance statistics for this fuzzer #[cfg(feature = "introspection")] introspection_monitor: ClientPerfMonitor, + #[cfg(feature = "scalability_introspection")] + scalability_monitor: ScalabilityMonitor, #[cfg(feature = "std")] /// Remaining initial inputs to load, if any remaining_initial_files: Option>, @@ -844,6 +890,8 @@ where max_size: DEFAULT_MAX_SIZE, #[cfg(feature = "introspection")] introspection_monitor: ClientPerfMonitor::new(), + #[cfg(feature = "scalability_introspection")] + scalability_monitor: ScalabilityMonitor::new(), #[cfg(feature = "std")] remaining_initial_files: None, #[cfg(feature = "std")] @@ -868,14 +916,14 @@ impl HasClientPerfMonitor for StdState { } } -#[cfg(not(feature = "introspection"))] -impl HasClientPerfMonitor for StdState { - fn introspection_monitor(&self) -> &ClientPerfMonitor { - unimplemented!() +#[cfg(feature = "scalability_introspection")] +impl HasScalabilityMonitor for StdState { + fn scalability_monitor(&self) -> &ScalabilityMonitor { + &self.scalability_monitor } - fn introspection_monitor_mut(&mut self) -> &mut ClientPerfMonitor { - unimplemented!() + fn scalability_monitor_mut(&mut self) -> &mut ScalabilityMonitor { + &mut self.scalability_monitor } } @@ -950,18 +998,19 @@ impl HasRand for NopState { } } +impl State for NopState where I: Input {} + +#[cfg(feature = "introspection")] impl HasClientPerfMonitor for NopState { fn introspection_monitor(&self) -> &ClientPerfMonitor { - unimplemented!() + unimplemented!(); } fn introspection_monitor_mut(&mut self) -> &mut ClientPerfMonitor { - unimplemented!() + unimplemented!(); } } -impl State for NopState where I: Input {} - #[cfg(feature = "python")] #[allow(missing_docs)] /// `State` Python bindings diff --git a/libafl_frida/src/asan/errors.rs b/libafl_frida/src/asan/errors.rs index 07ee2fc67b..15ece05b91 100644 --- a/libafl_frida/src/asan/errors.rs +++ b/libafl_frida/src/asan/errors.rs @@ -14,7 +14,7 @@ use libafl::{ feedbacks::Feedback, inputs::{HasTargetBytes, UsesInput}, observers::{Observer, ObserversTuple}, - state::{HasClientPerfMonitor, HasMetadata}, + state::{HasMetadata, State}, Error, }; use libafl_bolts::{ownedref::OwnedPtr, Named, SerdeAny}; @@ -611,7 +611,7 @@ pub struct AsanErrorsFeedback { impl Feedback for AsanErrorsFeedback where - S: UsesInput + Debug + HasClientPerfMonitor, + S: State + Debug, S::Input: HasTargetBytes, { #[allow(clippy::wrong_self_convention)] diff --git a/libafl_frida/src/executor.rs b/libafl_frida/src/executor.rs index 2bddc0108b..e86dc843ba 100644 --- a/libafl_frida/src/executor.rs +++ b/libafl_frida/src/executor.rs @@ -8,13 +8,13 @@ use frida_gum::{ #[cfg(windows)] use libafl::{ executors::inprocess::{HasInProcessHandlers, InProcessHandlers}, - state::{HasClientPerfMonitor, HasCorpus, HasSolutions}, + state::{HasCorpus, HasSolutions}, }; use libafl::{ executors::{Executor, ExitKind, HasObservers, InProcessExecutor}, - inputs::{HasTargetBytes, UsesInput}, + inputs::HasTargetBytes, observers::{ObserversTuple, UsesObservers}, - state::{HasExecutions, UsesState}, + state::{HasExecutions, State, UsesState}, Error, }; @@ -29,7 +29,7 @@ pub struct FridaInProcessExecutor<'a, 'b, 'c, H, OT, RT, S> where H: FnMut(&S::Input) -> ExitKind, S::Input: HasTargetBytes, - S: UsesInput, + S: State, OT: ObserversTuple, 'a: 'b, { @@ -47,7 +47,7 @@ where impl<'a, 'b, 'c, H, OT, RT, S> Debug for FridaInProcessExecutor<'a, 'b, 'c, H, OT, RT, S> where H: FnMut(&S::Input) -> ExitKind, - S: UsesInput, + S: State, S::Input: HasTargetBytes, OT: ObserversTuple + Debug, { @@ -65,7 +65,7 @@ impl<'a, 'b, 'c, EM, H, OT, RT, S, Z> Executor where EM: UsesState, H: FnMut(&S::Input) -> ExitKind, - S: UsesInput + HasExecutions, + S: State + HasExecutions, S::Input: HasTargetBytes, OT: ObserversTuple, RT: FridaRuntimeTuple, @@ -118,7 +118,7 @@ impl<'a, 'b, 'c, H, OT, RT, S> UsesObservers for FridaInProcessExecutor<'a, 'b, where H: FnMut(&S::Input) -> ExitKind, OT: ObserversTuple, - S: UsesInput, + S: State, S::Input: HasTargetBytes, { type Observers = OT; @@ -128,7 +128,7 @@ impl<'a, 'b, 'c, H, OT, RT, S> UsesState for FridaInProcessExecutor<'a, 'b, 'c, where H: FnMut(&S::Input) -> ExitKind, OT: ObserversTuple, - S: UsesInput, + S: State, S::Input: HasTargetBytes, { type State = S; @@ -138,7 +138,7 @@ impl<'a, 'b, 'c, H, OT, RT, S> HasObservers for FridaInProcessExecutor<'a, 'b, ' where H: FnMut(&S::Input) -> ExitKind, S::Input: HasTargetBytes, - S: UsesInput, + S: State, OT: ObserversTuple, { #[inline] @@ -155,7 +155,7 @@ where impl<'a, 'b, 'c, H, OT, S, RT> FridaInProcessExecutor<'a, 'b, 'c, H, OT, RT, S> where H: FnMut(&S::Input) -> ExitKind, - S: UsesInput, + S: State, S::Input: HasTargetBytes, OT: ObserversTuple, RT: FridaRuntimeTuple, @@ -231,7 +231,7 @@ impl<'a, 'b, 'c, H, OT, RT, S> HasInProcessHandlers for FridaInProcessExecutor<'a, 'b, 'c, H, OT, RT, S> where H: FnMut(&S::Input) -> ExitKind, - S: UsesInput + HasClientPerfMonitor + HasSolutions + HasCorpus + HasExecutions, + S: State + HasSolutions + HasCorpus + HasExecutions, S::Input: HasTargetBytes, OT: ObserversTuple, RT: FridaRuntimeTuple, diff --git a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/feedbacks.rs b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/feedbacks.rs index a987eaf703..9b7d5dbcb1 100644 --- a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/feedbacks.rs +++ b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/feedbacks.rs @@ -7,9 +7,9 @@ use libafl::{ events::EventFirer, executors::ExitKind, feedbacks::{Feedback, MinMapFeedback}, - inputs::{BytesInput, Input, UsesInput}, + inputs::{BytesInput, Input}, observers::ObserversTuple, - state::{HasClientPerfMonitor, HasMetadata}, + state::{HasMetadata, State}, Error, }; use libafl_bolts::{impl_serdeany, Named}; @@ -43,7 +43,7 @@ impl Named for LibfuzzerKeepFeedback { impl Feedback for LibfuzzerKeepFeedback where - S: UsesInput + HasClientPerfMonitor, + S: State, { fn is_interesting( &mut self, @@ -113,7 +113,7 @@ impl LibfuzzerCrashCauseFeedback { impl Feedback for LibfuzzerCrashCauseFeedback where - S: UsesInput + HasClientPerfMonitor, + S: State, { fn is_interesting( &mut self, diff --git a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/fuzz.rs b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/fuzz.rs index 89a575a862..9096ef95bb 100644 --- a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/fuzz.rs +++ b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/fuzz.rs @@ -23,7 +23,7 @@ use libafl::{ }, stages::StagesTuple, state::{ - HasClientPerfMonitor, HasExecutions, HasLastReportTime, HasMetadata, HasSolutions, + HasExecutions, HasLastReportTime, HasMetadata, HasSolutions, UsesState, }, Error, Fuzzer, @@ -70,8 +70,7 @@ fn do_fuzz( ) -> Result<(), Error> where F: Fuzzer, - S: HasClientPerfMonitor - + HasMetadata + S: HasMetadata + HasExecutions + UsesInput + HasSolutions diff --git a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/report.rs b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/report.rs index 4db23cd539..025eb49d7f 100644 --- a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/report.rs +++ b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/report.rs @@ -8,7 +8,7 @@ use libafl::{ monitors::SimpleMonitor, stages::StagesTuple, state::{ - HasClientPerfMonitor, HasExecutions, HasLastReportTime, HasMetadata, HasNamedMetadata, + HasExecutions, HasLastReportTime, HasMetadata, HasNamedMetadata, }, Error, Fuzzer, }; @@ -26,8 +26,7 @@ fn do_report( ) -> Result<(), Error> where F: Fuzzer, - S: HasClientPerfMonitor - + HasMetadata + S: HasMetadata + HasNamedMetadata + HasExecutions + UsesInput diff --git a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/schedulers.rs b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/schedulers.rs index bcd89dc8ca..1c58566cc4 100644 --- a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/schedulers.rs +++ b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/schedulers.rs @@ -8,7 +8,7 @@ use libafl::{ feedbacks::MapNoveltiesMetadata, inputs::UsesInput, schedulers::{RemovableScheduler, Scheduler}, - state::{HasCorpus, HasMetadata, UsesState}, + state::{HasCorpus, HasMetadata, UsesState, State}, Error, }; @@ -21,14 +21,14 @@ pub struct MergeScheduler { impl UsesState for MergeScheduler where - S: UsesInput, + S: State, { type State = S; } impl RemovableScheduler for MergeScheduler where - S: UsesInput + HasCorpus, + S: State + HasCorpus, { fn on_remove( &mut self, @@ -43,7 +43,7 @@ where impl Scheduler for MergeScheduler where - S: UsesInput + HasCorpus, + S: State + HasCorpus, { fn on_add(&mut self, state: &mut Self::State, idx: CorpusId) -> Result<(), Error> { self.all.insert(idx); diff --git a/libafl_nyx/src/executor.rs b/libafl_nyx/src/executor.rs index 31d7c75a41..e8ca7282a0 100644 --- a/libafl_nyx/src/executor.rs +++ b/libafl_nyx/src/executor.rs @@ -2,7 +2,7 @@ use std::{fmt::Debug, marker::PhantomData}; use libafl::{ executors::{Executor, ExitKind, HasObservers}, - inputs::{HasTargetBytes, UsesInput}, + inputs::HasTargetBytes, observers::{ObserversTuple, UsesObservers}, state::{HasExecutions, State, UsesState}, Error, @@ -32,7 +32,7 @@ impl<'a, S, OT> Debug for NyxExecutor<'a, S, OT> { impl<'a, S, OT> UsesState for NyxExecutor<'a, S, OT> where - S: UsesInput, + S: State, { type State = S; } @@ -40,7 +40,7 @@ where impl<'a, S, OT> UsesObservers for NyxExecutor<'a, S, OT> where OT: ObserversTuple, - S: UsesInput, + S: State, { type Observers = OT; } @@ -48,7 +48,7 @@ where impl<'a, EM, S, Z, OT> Executor for NyxExecutor<'a, S, OT> where EM: UsesState, - S: UsesInput + HasExecutions, + S: State + HasExecutions, S::Input: HasTargetBytes, Z: UsesState, { diff --git a/libafl_qemu/src/executor.rs b/libafl_qemu/src/executor.rs index 172b9a951e..84af6c3c70 100644 --- a/libafl_qemu/src/executor.rs +++ b/libafl_qemu/src/executor.rs @@ -20,7 +20,7 @@ use libafl::{ fuzzer::HasObjective, inputs::UsesInput, observers::{ObserversTuple, UsesObservers}, - state::{HasClientPerfMonitor, HasCorpus, HasExecutions, HasSolutions, State, UsesState}, + state::{HasCorpus, HasExecutions, HasSolutions, State, UsesState}, Error, }; use libafl_bolts::os::unix_signals::{siginfo_t, ucontext_t, Signal}; @@ -32,7 +32,7 @@ use crate::{emu::Emulator, helper::QemuHelperTuple, hooks::QemuHooks}; pub struct QemuExecutor<'a, H, OT, QT, S> where H: FnMut(&S::Input) -> ExitKind, - S: UsesInput, + S: State, OT: ObserversTuple, QT: QemuHelperTuple, { @@ -44,7 +44,7 @@ where impl<'a, H, OT, QT, S> Debug for QemuExecutor<'a, H, OT, QT, S> where H: FnMut(&S::Input) -> ExitKind, - S: UsesInput, + S: State, OT: ObserversTuple + Debug, QT: QemuHelperTuple + Debug, { @@ -81,7 +81,7 @@ pub unsafe fn inproc_qemu_crash_handler( E: Executor + HasObservers, EM: EventFirer + EventRestarter, OF: Feedback, - E::State: HasExecutions + HasSolutions + HasClientPerfMonitor + HasCorpus, + E::State: HasExecutions + HasSolutions + HasCorpus, Z: HasObjective, { let real_crash = if USE_LIBAFL_CRASH_HANDLER { @@ -118,7 +118,7 @@ pub unsafe fn inproc_qemu_timeout_handler( E: Executor + HasObservers, EM: EventFirer + EventRestarter, OF: Feedback, - E::State: HasSolutions + HasClientPerfMonitor + HasCorpus + HasExecutions, + E::State: HasSolutions + HasCorpus + HasExecutions, Z: HasObjective, { if BREAK_ON_TMOUT { @@ -133,7 +133,7 @@ pub unsafe fn inproc_qemu_timeout_handler( impl<'a, H, OT, QT, S> QemuExecutor<'a, H, OT, QT, S> where H: FnMut(&S::Input) -> ExitKind, - S: UsesInput, + S: State, OT: ObserversTuple, QT: QemuHelperTuple, { @@ -148,7 +148,7 @@ where where EM: EventFirer + EventRestarter, OF: Feedback, - S: State + HasExecutions + HasCorpus + HasSolutions + HasClientPerfMonitor, + S: State + HasExecutions + HasCorpus + HasSolutions, Z: HasObjective, { let mut inner = InProcessExecutor::new(harness_fn, observers, fuzzer, state, event_mgr)?; @@ -203,7 +203,7 @@ impl<'a, EM, H, OT, QT, S, Z> Executor for QemuExecutor<'a, H, OT, QT, S> where EM: UsesState, H: FnMut(&S::Input) -> ExitKind, - S: UsesInput + HasExecutions, + S: State + HasExecutions, OT: ObserversTuple, QT: QemuHelperTuple, Z: UsesState, @@ -237,7 +237,7 @@ where H: FnMut(&S::Input) -> ExitKind, OT: ObserversTuple, QT: QemuHelperTuple, - S: UsesInput, + S: State, { type State = S; } @@ -247,7 +247,7 @@ where H: FnMut(&S::Input) -> ExitKind, OT: ObserversTuple, QT: QemuHelperTuple, - S: UsesInput, + S: State, { type Observers = OT; } @@ -255,7 +255,7 @@ where impl<'a, H, OT, QT, S> HasObservers for QemuExecutor<'a, H, OT, QT, S> where H: FnMut(&S::Input) -> ExitKind, - S: UsesInput, + S: State, OT: ObserversTuple, QT: QemuHelperTuple, { @@ -305,7 +305,7 @@ where impl<'a, H, OT, QT, S, SP> QemuForkExecutor<'a, H, OT, QT, S, SP> where H: FnMut(&S::Input) -> ExitKind, - S: UsesInput, + S: State, OT: ObserversTuple, QT: QemuHelperTuple, SP: ShMemProvider, @@ -322,7 +322,7 @@ where where EM: EventFirer + EventRestarter, OF: Feedback, - S: HasSolutions + HasClientPerfMonitor, + S: HasSolutions, Z: HasObjective, { assert!(!QT::HOOKS_DO_SIDE_EFFECTS, "When using QemuForkExecutor, the hooks must not do any side effect as they will happen in the child process and then discarded"); @@ -367,7 +367,7 @@ impl<'a, EM, H, OT, QT, S, Z, SP> Executor for QemuForkExecutor<'a, H, OT where EM: EventManager, Z, State = S>, H: FnMut(&S::Input) -> ExitKind, - S: UsesInput + HasClientPerfMonitor + HasMetadata + HasExecutions + HasLastReportTime, + S: State + HasMetadata + HasExecutions + HasLastReportTime, OT: ObserversTuple, QT: QemuHelperTuple, SP: ShMemProvider, @@ -403,7 +403,7 @@ where H: FnMut(&S::Input) -> ExitKind, OT: ObserversTuple, QT: QemuHelperTuple, - S: UsesInput, + S: State, SP: ShMemProvider, { type Observers = OT; @@ -415,7 +415,7 @@ where H: FnMut(&S::Input) -> ExitKind, OT: ObserversTuple, QT: QemuHelperTuple, - S: UsesInput, + S: State, SP: ShMemProvider, { type State = S; @@ -425,7 +425,7 @@ where impl<'a, H, OT, QT, S, SP> HasObservers for QemuForkExecutor<'a, H, OT, QT, S, SP> where H: FnMut(&S::Input) -> ExitKind, - S: UsesInput, + S: State, OT: ObserversTuple, QT: QemuHelperTuple, SP: ShMemProvider, diff --git a/libafl_targets/src/cmps/stages/aflpptracing.rs b/libafl_targets/src/cmps/stages/aflpptracing.rs index f293554dcb..bf094c67c4 100644 --- a/libafl_targets/src/cmps/stages/aflpptracing.rs +++ b/libafl_targets/src/cmps/stages/aflpptracing.rs @@ -1,13 +1,15 @@ use alloc::string::{String, ToString}; use core::marker::PhantomData; +#[cfg(feature = "introspection")] +use libafl::state::HasClientPerfMonitor; use libafl::{ corpus::{Corpus, CorpusId}, executors::{Executor, HasObservers}, inputs::{BytesInput, UsesInput}, observers::ObserversTuple, stages::{colorization::TaintMetadata, Stage}, - state::{HasClientPerfMonitor, HasCorpus, HasExecutions, HasMetadata, UsesState}, + state::{HasCorpus, HasExecutions, HasMetadata, UsesState}, Error, }; use libafl_bolts::tuples::MatchName; @@ -34,11 +36,7 @@ impl Stage for AFLppCmplogTracingStage where E: UsesState, TE: Executor + HasObservers, - TE::State: HasClientPerfMonitor - + HasExecutions - + HasCorpus - + HasMetadata - + UsesInput, + TE::State: HasExecutions + HasCorpus + HasMetadata + UsesInput, EM: UsesState, Z: UsesState, { diff --git a/libafl_targets/src/libfuzzer/observers/oom.rs b/libafl_targets/src/libfuzzer/observers/oom.rs index 6f8af739fd..e24c5169c9 100644 --- a/libafl_targets/src/libfuzzer/observers/oom.rs +++ b/libafl_targets/src/libfuzzer/observers/oom.rs @@ -7,7 +7,7 @@ use libafl::{ feedbacks::Feedback, inputs::UsesInput, observers::{Observer, ObserversTuple}, - state::HasClientPerfMonitor, + state::State, Error, }; use libafl_bolts::Named; @@ -149,7 +149,7 @@ impl Named for OomFeedback { impl Feedback for OomFeedback where - S: UsesInput + HasClientPerfMonitor, + S: State, { fn is_interesting( &mut self, diff --git a/libafl_targets/src/windows_asan.rs b/libafl_targets/src/windows_asan.rs index 25bbd87c63..e462d23bd6 100644 --- a/libafl_targets/src/windows_asan.rs +++ b/libafl_targets/src/windows_asan.rs @@ -4,7 +4,7 @@ use libafl::{ events::{EventFirer, EventRestarter}, executors::{inprocess::windows_asan_handler::asan_death_handler, Executor, HasObservers}, feedbacks::Feedback, - state::{HasClientPerfMonitor, HasCorpus, HasExecutions, HasSolutions}, + state::{HasCorpus, HasExecutions, HasSolutions}, HasObjective, }; @@ -32,7 +32,7 @@ where E: Executor + HasObservers, EM: EventFirer + EventRestarter, OF: Feedback, - E::State: HasSolutions + HasClientPerfMonitor + HasCorpus + HasExecutions, + E::State: HasSolutions + HasCorpus + HasExecutions, Z: HasObjective, { __sanitizer_set_death_callback(asan_death_handler::); diff --git a/libafl_tinyinst/src/executor.rs b/libafl_tinyinst/src/executor.rs index dd799b0b7d..d99930bdc9 100644 --- a/libafl_tinyinst/src/executor.rs +++ b/libafl_tinyinst/src/executor.rs @@ -3,7 +3,7 @@ use std::time::Duration; use libafl::{ executors::{Executor, ExitKind, HasObservers}, - inputs::{HasTargetBytes, UsesInput}, + inputs::HasTargetBytes, observers::{ObserversTuple, UsesObservers}, state::{HasExecutions, State, UsesState}, Error, @@ -43,7 +43,7 @@ where impl<'a, EM, S, SP, OT, Z> Executor for TinyInstExecutor<'a, S, SP, OT> where EM: UsesState, - S: UsesInput + HasExecutions, + S: State + HasExecutions, S::Input: HasTargetBytes, SP: ShMemProvider, Z: UsesState, @@ -310,7 +310,7 @@ where } impl<'a, S, SP, OT> UsesState for TinyInstExecutor<'a, S, SP, OT> where - S: UsesInput, + S: State, SP: ShMemProvider, { type State = S; @@ -318,7 +318,7 @@ where impl<'a, S, SP, OT> UsesObservers for TinyInstExecutor<'a, S, SP, OT> where OT: ObserversTuple, - S: UsesInput, + S: State, SP: ShMemProvider, { type Observers = OT;