diff --git a/libafl/src/bolts/llmp.rs b/libafl/src/bolts/llmp.rs index af855c5ab3..905e43d0b3 100644 --- a/libafl/src/bolts/llmp.rs +++ b/libafl/src/bolts/llmp.rs @@ -574,7 +574,7 @@ impl LlmpMsg { slice::from_raw_parts(self.buf.as_ptr(), self.buf_len as usize) } - /// Gets the buffer from this message as slice, with the corrent length. + /// Gets the buffer from this message as slice, with the correct length. #[inline] pub fn try_as_slice(&self, map: &mut LlmpSharedMap) -> Result<&[u8], Error> { unsafe { @@ -586,7 +586,7 @@ impl LlmpMsg { } } - /// Returns true, if the pointer is, indeed, in the page of this shared map. + /// Returns `true`, if the pointer is, indeed, in the page of this shared map. #[inline] pub fn in_shmem(&self, map: &mut LlmpSharedMap) -> bool { let map_size = map.shmem.as_slice().len(); diff --git a/libafl/src/bolts/mod.rs b/libafl/src/bolts/mod.rs index 026f2b07ec..c8b1eb86ab 100644 --- a/libafl/src/bolts/mod.rs +++ b/libafl/src/bolts/mod.rs @@ -35,15 +35,19 @@ use core::{iter::Iterator, time}; use std::time::{SystemTime, UNIX_EPOCH}; /// Can be converted to a slice -pub trait AsSlice { +pub trait AsSlice { + /// Type of the entries in this slice + type Entry; /// Convert to a slice - fn as_slice(&self) -> &[T]; + fn as_slice(&self) -> &[Self::Entry]; } /// Can be converted to a mutable slice -pub trait AsMutSlice { +pub trait AsMutSlice { + /// Type of the entries in this mut slice + type Entry; /// Convert to a slice - fn as_mut_slice(&mut self) -> &mut [T]; + fn as_mut_slice(&mut self) -> &mut [Self::Entry]; } /// Create an `Iterator` from a reference diff --git a/libafl/src/bolts/os/unix_shmem_server.rs b/libafl/src/bolts/os/unix_shmem_server.rs index 002c14238d..e7095a48b5 100644 --- a/libafl/src/bolts/os/unix_shmem_server.rs +++ b/libafl/src/bolts/os/unix_shmem_server.rs @@ -95,18 +95,20 @@ where } } -impl AsSlice for ServedShMem +impl AsSlice for ServedShMem where SH: ShMem, { + type Entry = u8; fn as_slice(&self) -> &[u8] { self.inner.as_slice() } } -impl AsMutSlice for ServedShMem +impl AsMutSlice for ServedShMem where SH: ShMem, { + type Entry = u8; fn as_mut_slice(&mut self) -> &mut [u8] { self.inner.as_mut_slice() } diff --git a/libafl/src/bolts/ownedref.rs b/libafl/src/bolts/ownedref.rs index 1fbe45865b..bdaf095184 100644 --- a/libafl/src/bolts/ownedref.rs +++ b/libafl/src/bolts/ownedref.rs @@ -290,7 +290,8 @@ impl<'a, T> From> for OwnedSlice<'a, T> { } } -impl<'a, T: Sized> AsSlice for OwnedSlice<'a, T> { +impl<'a, T: Sized> AsSlice for OwnedSlice<'a, T> { + type Entry = T; /// Get the [`OwnedSlice`] as slice. #[must_use] fn as_slice(&self) -> &[T] { @@ -416,7 +417,8 @@ impl<'a, T: 'a + Sized> OwnedSliceMut<'a, T> { } } -impl<'a, T: Sized> AsSlice for OwnedSliceMut<'a, T> { +impl<'a, T: Sized> AsSlice for OwnedSliceMut<'a, T> { + type Entry = T; /// Get the value as slice #[must_use] fn as_slice(&self) -> &[T] { @@ -427,7 +429,8 @@ impl<'a, T: Sized> AsSlice for OwnedSliceMut<'a, T> { } } } -impl<'a, T: Sized> AsMutSlice for OwnedSliceMut<'a, T> { +impl<'a, T: Sized> AsMutSlice for OwnedSliceMut<'a, T> { + type Entry = T; /// Get the value as mut slice #[must_use] fn as_mut_slice(&mut self) -> &mut [T] { diff --git a/libafl/src/bolts/shmem.rs b/libafl/src/bolts/shmem.rs index 47542bbf17..cd9b01b03a 100644 --- a/libafl/src/bolts/shmem.rs +++ b/libafl/src/bolts/shmem.rs @@ -137,7 +137,8 @@ impl ShMemId { alloc::str::from_utf8(&self.id[..self.null_pos()]).unwrap() } } -impl AsSlice for ShMemId { +impl AsSlice for ShMemId { + type Entry = u8; fn as_slice(&self) -> &[u8] { &self.id } @@ -158,7 +159,7 @@ impl Display for ShMemId { /// A [`ShMem`] is an interface to shared maps. /// They are the backbone of [`crate::bolts::llmp`] for inter-process communication. /// All you need for scaling on a new target is to implement this interface, as well as the respective [`ShMemProvider`]. -pub trait ShMem: Sized + Debug + Clone + AsSlice + AsMutSlice { +pub trait ShMem: Sized + Debug + Clone + AsSlice + AsMutSlice { /// Get the id of this shared memory mapping fn id(&self) -> ShMemId; @@ -312,19 +313,21 @@ where } } -impl AsSlice for RcShMem +impl AsSlice for RcShMem where T: ShMemProvider + Debug, { + type Entry = u8; fn as_slice(&self) -> &[u8] { self.internal.as_slice() } } -impl AsMutSlice for RcShMem +impl AsMutSlice for RcShMem where T: ShMemProvider + Debug, { + type Entry = u8; fn as_mut_slice(&mut self) -> &mut [u8] { self.internal.as_mut_slice() } @@ -754,13 +757,15 @@ pub mod unix_shmem { } } - impl AsSlice for MmapShMem { + impl AsSlice for MmapShMem { + type Entry = u8; fn as_slice(&self) -> &[u8] { unsafe { slice::from_raw_parts(self.map, self.map_size) } } } - impl AsMutSlice for MmapShMem { + impl AsMutSlice for MmapShMem { + type Entry = u8; fn as_mut_slice(&mut self) -> &mut [u8] { unsafe { slice::from_raw_parts_mut(self.map, self.map_size) } } @@ -867,13 +872,15 @@ pub mod unix_shmem { } } - impl AsSlice for CommonUnixShMem { + impl AsSlice for CommonUnixShMem { + type Entry = u8; fn as_slice(&self) -> &[u8] { unsafe { slice::from_raw_parts(self.map, self.map_size) } } } - impl AsMutSlice for CommonUnixShMem { + impl AsMutSlice for CommonUnixShMem { + type Entry = u8; fn as_mut_slice(&mut self) -> &mut [u8] { unsafe { slice::from_raw_parts_mut(self.map, self.map_size) } } @@ -1077,13 +1084,16 @@ pub mod unix_shmem { } } - impl AsSlice for AshmemShMem { + impl AsSlice for AshmemShMem { + type Entry = u8; fn as_slice(&self) -> &[u8] { unsafe { slice::from_raw_parts(self.map, self.map_size) } } } - impl AsMutSlice for AshmemShMem { + impl AsMutSlice for AshmemShMem { + type Entry = u8; + fn as_mut_slice(&mut self) -> &mut [u8] { unsafe { slice::from_raw_parts_mut(self.map, self.map_size) } } @@ -1275,12 +1285,14 @@ pub mod win32_shmem { } } - impl AsSlice for Win32ShMem { + impl AsSlice for Win32ShMem { + type Entry = u8; fn as_slice(&self) -> &[u8] { unsafe { slice::from_raw_parts(self.map, self.map_size) } } } - impl AsMutSlice for Win32ShMem { + impl AsMutSlice for Win32ShMem { + type Entry = u8; fn as_mut_slice(&mut self) -> &mut [u8] { unsafe { slice::from_raw_parts_mut(self.map, self.map_size) } } diff --git a/libafl/src/corpus/minimizer.rs b/libafl/src/corpus/minimizer.rs index a8d54c2eef..577dea31bd 100644 --- a/libafl/src/corpus/minimizer.rs +++ b/libafl/src/corpus/minimizer.rs @@ -43,7 +43,7 @@ where E: Executor + HasObservers, CS: Scheduler, EM: UsesState, - Z: HasScheduler; + Z: HasScheduler; } /// Minimizes a corpus according to coverage maps, weighting by the specified `TestcaseScore`. @@ -102,7 +102,7 @@ where E: Executor + HasObservers, CS: Scheduler, EM: UsesState, - Z: HasScheduler, + Z: HasScheduler, { let cfg = Config::default(); let ctx = Context::new(&cfg); diff --git a/libafl/src/events/llmp.rs b/libafl/src/events/llmp.rs index 59f3e559e0..2f8add2a1b 100644 --- a/libafl/src/events/llmp.rs +++ b/libafl/src/events/llmp.rs @@ -552,7 +552,7 @@ where { } -impl HasCustomBufHandlers for LlmpEventManager +impl HasCustomBufHandlers for LlmpEventManager where S: UsesInput, SP: ShMemProvider, diff --git a/libafl/src/events/mod.rs b/libafl/src/events/mod.rs index 90c770ee2c..0371db0c0d 100644 --- a/libafl/src/events/mod.rs +++ b/libafl/src/events/mod.rs @@ -466,9 +466,9 @@ type CustomBufHandlerFn = dyn FnMut(&mut S, &String, &[u8]) -> Result; /// Supports custom buf handlers to handle `CustomBuf` events. -pub trait HasCustomBufHandlers { +pub trait HasCustomBufHandlers: UsesState { /// Adds a custom buffer handler that will run for each incoming `CustomBuf` event. - fn add_custom_buf_handler(&mut self, handler: Box>); + fn add_custom_buf_handler(&mut self, handler: Box>); } /// An eventmgr for tests, and as placeholder if you really don't need an event manager. @@ -528,10 +528,15 @@ impl EventManager for NopEventManager where { } -impl HasCustomBufHandlers for NopEventManager { +impl HasCustomBufHandlers for NopEventManager +where + S: UsesInput, +{ fn add_custom_buf_handler( &mut self, - _handler: Box Result>, + _handler: Box< + dyn FnMut(&mut Self::State, &String, &[u8]) -> Result, + >, ) { } } diff --git a/libafl/src/events/simple.rs b/libafl/src/events/simple.rs index 402d535aa9..9594a8fbcb 100644 --- a/libafl/src/events/simple.rs +++ b/libafl/src/events/simple.rs @@ -128,7 +128,7 @@ where { } -impl HasCustomBufHandlers for SimpleEventManager +impl HasCustomBufHandlers for SimpleEventManager where MT: Monitor, //CE: CustomEvent, S: UsesInput, @@ -136,7 +136,9 @@ where /// Adds a custom buffer handler that will run for each incoming `CustomBuf` event. fn add_custom_buf_handler( &mut self, - handler: Box Result>, + handler: Box< + dyn FnMut(&mut Self::State, &String, &[u8]) -> Result, + >, ) { self.custom_buf_handlers.push(handler); } @@ -371,7 +373,7 @@ where } #[cfg(feature = "std")] -impl HasCustomBufHandlers for SimpleRestartingEventManager +impl HasCustomBufHandlers for SimpleRestartingEventManager where MT: Monitor, S: UsesInput, diff --git a/libafl/src/executors/inprocess.rs b/libafl/src/executors/inprocess.rs index ac71636d3f..6607f0ca8f 100644 --- a/libafl/src/executors/inprocess.rs +++ b/libafl/src/executors/inprocess.rs @@ -184,7 +184,7 @@ where Self: Executor, EM: EventFirer + EventRestarter, OF: Feedback, - Z: HasObjective, + Z: HasObjective, { let handlers = InProcessHandlers::new::()?; #[cfg(windows)] @@ -342,7 +342,7 @@ impl InProcessHandlers { EM: EventFirer + EventRestarter, OF: Feedback, E::State: HasSolutions + HasClientPerfMonitor, - Z: HasObjective, + Z: HasObjective, H: FnMut(&::Input) -> ExitKind + ?Sized, { #[cfg(unix)] @@ -614,7 +614,7 @@ mod unix_signal_handler { EM: EventFirer + EventRestarter, OF: Feedback, E::State: HasSolutions + HasClientPerfMonitor, - Z: HasObjective, + Z: HasObjective, { let old_hook = panic::take_hook(); panic::set_hook(Box::new(move |panic_info| { @@ -687,7 +687,7 @@ mod unix_signal_handler { EM: EventFirer + EventRestarter, OF: Feedback, E::State: HasSolutions + HasClientPerfMonitor, - Z: HasObjective, + Z: HasObjective, { if !data.is_valid() { #[cfg(feature = "std")] @@ -765,7 +765,7 @@ mod unix_signal_handler { EM: EventFirer + EventRestarter, OF: Feedback, E::State: HasSolutions + HasClientPerfMonitor, - Z: HasObjective, + Z: HasObjective, { #[cfg(all(target_os = "android", target_arch = "aarch64"))] let _context = &mut *(((_context as *mut _ as *mut libc::c_void as usize) + 128) @@ -949,7 +949,7 @@ mod windows_exception_handler { EM: EventFirer + EventRestarter, OF: Feedback, E::State: HasSolutions + HasClientPerfMonitor, - Z: HasObjective, + Z: HasObjective, { let old_hook = panic::take_hook(); panic::set_hook(Box::new(move |panic_info| { @@ -1039,7 +1039,7 @@ mod windows_exception_handler { EM: EventFirer + EventRestarter, OF: Feedback, E::State: HasSolutions + HasClientPerfMonitor, - Z: HasObjective, + Z: HasObjective, { let data: &mut InProcessExecutorHandlerData = &mut *(global_state as *mut InProcessExecutorHandlerData); @@ -1135,7 +1135,7 @@ mod windows_exception_handler { EM: EventFirer + EventRestarter, OF: Feedback, E::State: HasSolutions + HasClientPerfMonitor, - Z: HasObjective, + Z: HasObjective, { // Have we set a timer_before? if !(data.tp_timer as *mut windows::Win32::System::Threading::TP_TIMER).is_null() { @@ -1701,7 +1701,7 @@ where EM: EventFirer + EventRestarter, OF: Feedback, S: HasSolutions + HasClientPerfMonitor, - Z: HasObjective, + Z: HasObjective, { let handlers = InChildProcessHandlers::new::()?; Ok(Self { @@ -1748,7 +1748,7 @@ where EM: EventFirer + EventRestarter, OF: Feedback, S: HasSolutions + HasClientPerfMonitor, - Z: HasObjective, + Z: HasObjective, { let handlers = InChildProcessHandlers::with_timeout::()?; let milli_sec = timeout.as_millis(); diff --git a/libafl/src/feedbacks/map.rs b/libafl/src/feedbacks/map.rs index a2dd29f57c..e740a56c73 100644 --- a/libafl/src/feedbacks/map.rs +++ b/libafl/src/feedbacks/map.rs @@ -214,13 +214,15 @@ pub struct MapIndexesMetadata { crate::impl_serdeany!(MapIndexesMetadata); -impl AsSlice for MapIndexesMetadata { +impl AsSlice for MapIndexesMetadata { + type Entry = usize; /// Convert to a slice fn as_slice(&self) -> &[usize] { self.list.as_slice() } } -impl AsMutSlice for MapIndexesMetadata { +impl AsMutSlice for MapIndexesMetadata { + type Entry = usize; /// Convert to a slice fn as_mut_slice(&mut self) -> &mut [usize] { self.list.as_mut_slice() @@ -254,14 +256,16 @@ pub struct MapNoveltiesMetadata { crate::impl_serdeany!(MapNoveltiesMetadata); -impl AsSlice for MapNoveltiesMetadata { +impl AsSlice for MapNoveltiesMetadata { + type Entry = usize; /// Convert to a slice #[must_use] fn as_slice(&self) -> &[usize] { self.list.as_slice() } } -impl AsMutSlice for MapNoveltiesMetadata { +impl AsMutSlice for MapNoveltiesMetadata { + type Entry = usize; /// Convert to a slice #[must_use] fn as_mut_slice(&mut self) -> &mut [usize] { @@ -430,7 +434,7 @@ where #[rustversion::nightly] impl Feedback for MapFeedback where - O: MapObserver + AsSlice, + O: MapObserver + AsSlice, for<'it> O: AsIter<'it, Item = u8>, S: UsesInput + HasNamedMetadata + HasClientPerfMonitor + Debug, { diff --git a/libafl/src/fuzzer/mod.rs b/libafl/src/fuzzer/mod.rs index 8d1cee3646..2640d62564 100644 --- a/libafl/src/fuzzer/mod.rs +++ b/libafl/src/fuzzer/mod.rs @@ -31,41 +31,45 @@ use crate::{ const STATS_TIMEOUT_DEFAULT: Duration = Duration::from_secs(15); /// Holds a scheduler -pub trait HasScheduler: UsesState -where - CS: Scheduler, -{ +pub trait HasScheduler: UsesState { + /// The [`Scheduler`] for this fuzzer + type Scheduler: Scheduler; + /// The scheduler - fn scheduler(&self) -> &CS; + fn scheduler(&self) -> &Self::Scheduler; /// The scheduler (mutable) - fn scheduler_mut(&mut self) -> &mut CS; + fn scheduler_mut(&mut self) -> &mut Self::Scheduler; } /// Holds an feedback -pub trait HasFeedback: UsesState +pub trait HasFeedback: UsesState where - F: Feedback, Self::State: HasClientPerfMonitor, { + /// The feedback type + type Feedback: Feedback; + /// The feedback - fn feedback(&self) -> &F; + fn feedback(&self) -> &Self::Feedback; /// The feedback (mutable) - fn feedback_mut(&mut self) -> &mut F; + fn feedback_mut(&mut self) -> &mut Self::Feedback; } /// Holds an objective feedback -pub trait HasObjective: UsesState +pub trait HasObjective: UsesState where - OF: Feedback, Self::State: HasClientPerfMonitor, { + /// The type of the [`Feedback`] used to find objectives for this fuzzer + type Objective: Feedback; + /// The objective feedback - fn objective(&self) -> &OF; + fn objective(&self) -> &Self::Objective; /// The objective feedback (mutable) - fn objective_mut(&mut self) -> &mut OF; + fn objective_mut(&mut self) -> &mut Self::Objective; } /// Evaluate if an input is interesting using the feedback @@ -263,13 +267,15 @@ where type State = CS::State; } -impl HasScheduler for StdFuzzer +impl HasScheduler for StdFuzzer where CS: Scheduler, F: Feedback, OF: Feedback, CS::State: HasClientPerfMonitor, { + type Scheduler = CS; + fn scheduler(&self) -> &CS { &self.scheduler } @@ -279,29 +285,33 @@ where } } -impl HasFeedback for StdFuzzer +impl HasFeedback for StdFuzzer where CS: Scheduler, F: Feedback, OF: Feedback, CS::State: HasClientPerfMonitor, { - fn feedback(&self) -> &F { + type Feedback = F; + + fn feedback(&self) -> &Self::Feedback { &self.feedback } - fn feedback_mut(&mut self) -> &mut F { + fn feedback_mut(&mut self) -> &mut Self::Feedback { &mut self.feedback } } -impl HasObjective for StdFuzzer +impl HasObjective for StdFuzzer where CS: Scheduler, F: Feedback, OF: Feedback, CS::State: HasClientPerfMonitor, { + type Objective = OF; + fn objective(&self) -> &OF { &self.objective } diff --git a/libafl/src/mutators/scheduled.rs b/libafl/src/mutators/scheduled.rs index cf97985495..e60318132a 100644 --- a/libafl/src/mutators/scheduled.rs +++ b/libafl/src/mutators/scheduled.rs @@ -31,13 +31,15 @@ pub struct LogMutationMetadata { crate::impl_serdeany!(LogMutationMetadata); -impl AsSlice for LogMutationMetadata { +impl AsSlice for LogMutationMetadata { + type Entry = String; #[must_use] fn as_slice(&self) -> &[String] { self.list.as_slice() } } -impl AsMutSlice for LogMutationMetadata { +impl AsMutSlice for LogMutationMetadata { + type Entry = String; #[must_use] fn as_mut_slice(&mut self) -> &mut [String] { self.list.as_mut_slice() diff --git a/libafl/src/mutators/token_mutations.rs b/libafl/src/mutators/token_mutations.rs index 725ccfec47..5aece3a54a 100644 --- a/libafl/src/mutators/token_mutations.rs +++ b/libafl/src/mutators/token_mutations.rs @@ -266,7 +266,8 @@ where } } -impl AsSlice> for Tokens { +impl AsSlice for Tokens { + type Entry = Vec; fn as_slice(&self) -> &[Vec] { self.tokens() } diff --git a/libafl/src/observers/cmp.rs b/libafl/src/observers/cmp.rs index 7ce3e6fdb1..49b0cd9822 100644 --- a/libafl/src/observers/cmp.rs +++ b/libafl/src/observers/cmp.rs @@ -64,14 +64,16 @@ pub struct CmpValuesMetadata { crate::impl_serdeany!(CmpValuesMetadata); -impl AsSlice for CmpValuesMetadata { +impl AsSlice for CmpValuesMetadata { + type Entry = CmpValues; /// Convert to a slice #[must_use] fn as_slice(&self) -> &[CmpValues] { self.list.as_slice() } } -impl AsMutSlice for CmpValuesMetadata { +impl AsMutSlice for CmpValuesMetadata { + type Entry = CmpValues; /// Convert to a slice #[must_use] fn as_mut_slice(&mut self) -> &mut [CmpValues] { diff --git a/libafl/src/observers/map.rs b/libafl/src/observers/map.rs index 8bb5a55c29..6d0569bd5d 100644 --- a/libafl/src/observers/map.rs +++ b/libafl/src/observers/map.rs @@ -404,20 +404,22 @@ where } } -impl<'a, T> AsSlice for StdMapObserver<'a, T> +impl<'a, T> AsSlice for StdMapObserver<'a, T> where T: Default + Copy + 'static + Serialize + serde::de::DeserializeOwned + Debug, { + type Entry = T; #[must_use] #[inline] fn as_slice(&self) -> &[T] { self.map.as_slice() } } -impl<'a, T> AsMutSlice for StdMapObserver<'a, T> +impl<'a, T> AsMutSlice for StdMapObserver<'a, T> where T: Default + Copy + 'static + Serialize + serde::de::DeserializeOwned + Debug, { + type Entry = T; #[must_use] #[inline] fn as_mut_slice(&mut self) -> &mut [T] { @@ -700,19 +702,21 @@ where } } -impl<'a, T, const N: usize> AsSlice for ConstMapObserver<'a, T, N> +impl<'a, T, const N: usize> AsSlice for ConstMapObserver<'a, T, N> where T: Default + Copy + 'static + Serialize + serde::de::DeserializeOwned + Debug, { + type Entry = T; #[inline] fn as_slice(&self) -> &[T] { self.map.as_slice() } } -impl<'a, T, const N: usize> AsMutSlice for ConstMapObserver<'a, T, N> +impl<'a, T, const N: usize> AsMutSlice for ConstMapObserver<'a, T, N> where T: Default + Copy + 'static + Serialize + serde::de::DeserializeOwned + Debug, { + type Entry = T; #[inline] fn as_mut_slice(&mut self) -> &mut [T] { self.map.as_mut_slice() @@ -969,7 +973,7 @@ where } } -impl<'a, T> AsSlice for VariableMapObserver<'a, T> +impl<'a, T> AsSlice for VariableMapObserver<'a, T> where T: Bounded + PartialEq @@ -980,16 +984,18 @@ where + serde::de::DeserializeOwned + Debug, { + type Entry = T; #[inline] fn as_slice(&self) -> &[T] { let cnt = self.usable_count(); &self.map.as_slice()[..cnt] } } -impl<'a, T> AsMutSlice for VariableMapObserver<'a, T> +impl<'a, T> AsMutSlice for VariableMapObserver<'a, T> where T: Default + Copy + 'static + Serialize + serde::de::DeserializeOwned + Debug, { + type Entry = T; #[inline] fn as_mut_slice(&mut self) -> &mut [T] { self.map.as_mut_slice() @@ -1044,7 +1050,7 @@ where impl Observer for HitcountsMapObserver where - M: MapObserver + Observer + AsMutSlice, + M: MapObserver + Observer + AsMutSlice, S: UsesInput, { #[inline] @@ -1155,21 +1161,23 @@ where } } -impl AsSlice for HitcountsMapObserver +impl AsSlice for HitcountsMapObserver where - M: MapObserver + AsSlice, + M: MapObserver + AsSlice, { + type Entry = ::Entry; #[inline] - fn as_slice(&self) -> &[u8] { + fn as_slice(&self) -> &[Self::Entry] { self.base.as_slice() } } -impl AsMutSlice for HitcountsMapObserver +impl AsMutSlice for HitcountsMapObserver where - M: MapObserver + AsMutSlice, + M: MapObserver + AsMutSlice, { + type Entry = ::Entry; #[inline] - fn as_mut_slice(&mut self) -> &mut [u8] { + fn as_mut_slice(&mut self) -> &mut [Self::Entry] { self.base.as_mut_slice() } } @@ -1349,21 +1357,23 @@ where } } -impl AsSlice for HitcountsIterableMapObserver +impl AsSlice for HitcountsIterableMapObserver where - M: MapObserver + AsSlice, + M: MapObserver + AsSlice, { + type Entry = ::Entry; #[inline] - fn as_slice(&self) -> &[u8] { + fn as_slice(&self) -> &[Self::Entry] { self.base.as_slice() } } -impl AsMutSlice for HitcountsIterableMapObserver +impl AsMutSlice for HitcountsIterableMapObserver where - M: MapObserver + AsMutSlice, + M: MapObserver + AsMutSlice, { + type Entry = ::Entry; #[inline] - fn as_mut_slice(&mut self) -> &mut [u8] { + fn as_mut_slice(&mut self) -> &mut [Self::Entry] { self.base.as_mut_slice() } } @@ -1873,20 +1883,22 @@ where } } -impl AsSlice for OwnedMapObserver +impl AsSlice for OwnedMapObserver where T: Default + Copy + 'static + Serialize + serde::de::DeserializeOwned + Debug, { + type Entry = T; #[must_use] #[inline] fn as_slice(&self) -> &[T] { self.map.as_slice() } } -impl AsMutSlice for OwnedMapObserver +impl AsMutSlice for OwnedMapObserver where T: Default + Copy + 'static + Serialize + serde::de::DeserializeOwned + Debug, { + type Entry = T; #[must_use] #[inline] fn as_mut_slice(&mut self) -> &mut [T] { @@ -2171,13 +2183,15 @@ pub mod pybind { } } - impl AsSlice<$datatype> for $struct_name_trait { + impl AsSlice for $struct_name_trait { + type Entry = $datatype; fn as_slice(&self) -> &[$datatype] { mapob_unwrap_me!($wrapper_name, self.wrapper, m, { unsafe { std::mem::transmute(m.as_slice()) }} ) } } - impl AsMutSlice<$datatype> for $struct_name_trait { + impl AsMutSlice for $struct_name_trait { + type Entry = $datatype; fn as_mut_slice(&mut self) -> &mut [$datatype] { mapob_unwrap_me_mut!($wrapper_name, self.wrapper, m, { unsafe { std::mem::transmute(m.as_mut_slice()) }} ) } diff --git a/libafl/src/schedulers/accounting.rs b/libafl/src/schedulers/accounting.rs index ceb25690df..53a01aa6f1 100644 --- a/libafl/src/schedulers/accounting.rs +++ b/libafl/src/schedulers/accounting.rs @@ -30,13 +30,16 @@ pub struct AccountingIndexesMetadata { crate::impl_serdeany!(AccountingIndexesMetadata); -impl AsSlice for AccountingIndexesMetadata { +impl AsSlice for AccountingIndexesMetadata { + type Entry = usize; /// Convert to a slice fn as_slice(&self) -> &[usize] { self.list.as_slice() } } -impl AsMutSlice for AccountingIndexesMetadata { +impl AsMutSlice for AccountingIndexesMetadata { + type Entry = usize; + /// Convert to a slice fn as_mut_slice(&mut self) -> &mut [usize] { self.list.as_mut_slice() diff --git a/libafl/src/schedulers/minimizer.rs b/libafl/src/schedulers/minimizer.rs index 6c171c1628..2eacb50478 100644 --- a/libafl/src/schedulers/minimizer.rs +++ b/libafl/src/schedulers/minimizer.rs @@ -78,7 +78,7 @@ impl Scheduler for MinimizerScheduler where CS: Scheduler, F: TestcaseScore, - M: AsSlice + SerdeAny + HasRefCnt, + M: AsSlice + SerdeAny + HasRefCnt, CS::State: HasCorpus + HasMetadata + HasRand, { /// Add an entry to the corpus and return its index @@ -190,7 +190,7 @@ impl MinimizerScheduler where CS: Scheduler, F: TestcaseScore, - M: AsSlice + SerdeAny + HasRefCnt, + M: AsSlice + SerdeAny + HasRefCnt, CS::State: HasCorpus + HasMetadata + HasRand, { /// Update the `Corpus` score using the `MinimizerScheduler` diff --git a/libafl/src/stages/mod.rs b/libafl/src/stages/mod.rs index 8db1e0702f..5189a8a04f 100644 --- a/libafl/src/stages/mod.rs +++ b/libafl/src/stages/mod.rs @@ -244,7 +244,7 @@ where Z: ExecutesInput + ExecutionProcessor + EvaluatorObservers - + HasScheduler, + + HasScheduler, { fn perform( &mut self, diff --git a/libafl/src/stages/push/mod.rs b/libafl/src/stages/push/mod.rs index add7aa0370..599a3658ea 100644 --- a/libafl/src/stages/push/mod.rs +++ b/libafl/src/stages/push/mod.rs @@ -38,7 +38,9 @@ where EM: EventFirer + EventRestarter + HasEventManagerId, OT: ObserversTuple, CS::State: HasClientPerfMonitor + HasRand, - Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, + Z: ExecutionProcessor + + EvaluatorObservers + + HasScheduler, { /// The [`crate::state::State`] pub state: CS::State, @@ -57,7 +59,9 @@ where EM: EventFirer + EventRestarter + HasEventManagerId, OT: ObserversTuple, CS::State: HasClientPerfMonitor + HasRand, - Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, + Z: ExecutionProcessor + + EvaluatorObservers + + HasScheduler, { /// Create a new `PushStageSharedState` that can be used by all [`PushStage`]s #[must_use] @@ -80,7 +84,9 @@ where EM: EventFirer + EventRestarter + HasEventManagerId, OT: ObserversTuple, CS::State: HasClientPerfMonitor + HasRand, - Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, + Z: ExecutionProcessor + + EvaluatorObservers + + HasScheduler, { /// If this stage has already been initalized. /// This gets reset to `false` after one iteration of the stage is done. @@ -110,7 +116,9 @@ where EM: EventFirer + EventRestarter + HasEventManagerId, OT: ObserversTuple, CS::State: HasClientPerfMonitor + HasRand, - Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, + Z: ExecutionProcessor + + EvaluatorObservers + + HasScheduler, { /// Create a new [`PushStageHelper`] #[must_use] @@ -178,7 +186,9 @@ where CS::State: HasClientPerfMonitor + HasRand + HasExecutions + HasMetadata, EM: EventFirer + EventRestarter + HasEventManagerId + ProgressReporter, OT: ObserversTuple, - Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, + Z: ExecutionProcessor + + EvaluatorObservers + + HasScheduler, { /// Gets the [`PushStageHelper`] fn push_stage_helper(&self) -> &PushStageHelper; diff --git a/libafl/src/stages/push/mutational.rs b/libafl/src/stages/push/mutational.rs index 62907ca4e5..92c0dded2e 100644 --- a/libafl/src/stages/push/mutational.rs +++ b/libafl/src/stages/push/mutational.rs @@ -44,7 +44,9 @@ where M: Mutator, OT: ObserversTuple, CS::State: HasClientPerfMonitor + HasRand + Clone + Debug, - Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, + Z: ExecutionProcessor + + EvaluatorObservers + + HasScheduler, { current_corpus_idx: Option, testcases_to_do: usize, @@ -64,7 +66,9 @@ where M: Mutator, OT: ObserversTuple, CS::State: HasClientPerfMonitor + HasCorpus + HasRand + Clone + Debug, - Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, + Z: ExecutionProcessor + + EvaluatorObservers + + HasScheduler, { /// Gets the number of iterations as a random number #[allow(clippy::unused_self, clippy::unnecessary_wraps)] // TODO: we should put this function into a trait later @@ -86,7 +90,9 @@ where OT: ObserversTuple, CS::State: HasClientPerfMonitor + HasCorpus + HasRand + HasExecutions + HasMetadata + Clone + Debug, - Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, + Z: ExecutionProcessor + + EvaluatorObservers + + HasScheduler, { #[inline] fn push_stage_helper(&self) -> &PushStageHelper { @@ -197,7 +203,9 @@ where OT: ObserversTuple, CS::State: HasClientPerfMonitor + HasCorpus + HasRand + HasExecutions + HasMetadata + Clone + Debug, - Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, + Z: ExecutionProcessor + + EvaluatorObservers + + HasScheduler, { type Item = Result<::Input, Error>; @@ -213,7 +221,9 @@ where M: Mutator, OT: ObserversTuple, CS::State: HasClientPerfMonitor + HasCorpus + HasRand + Clone + Debug, - Z: ExecutionProcessor + EvaluatorObservers + HasScheduler, + Z: ExecutionProcessor + + EvaluatorObservers + + HasScheduler, { /// Creates a new default mutational stage #[must_use] diff --git a/libafl/src/stages/tmin.rs b/libafl/src/stages/tmin.rs index dfd4e3639b..0e956b2ecb 100644 --- a/libafl/src/stages/tmin.rs +++ b/libafl/src/stages/tmin.rs @@ -45,8 +45,8 @@ where OT: ObserversTuple, Z: ExecutionProcessor + ExecutesInput - + HasFeedback - + HasScheduler, + + HasFeedback + + HasScheduler, { /// The mutator registered for this stage fn mutator(&self) -> &M; @@ -198,8 +198,8 @@ where OT: ObserversTuple, Z: ExecutionProcessor + ExecutesInput - + HasFeedback - + HasScheduler, + + HasFeedback + + HasScheduler, { fn perform( &mut self, @@ -246,8 +246,8 @@ where CS::State: HasClientPerfMonitor + HasCorpus + HasExecutions + HasMaxSize, Z: ExecutionProcessor + ExecutesInput - + HasFeedback - + HasScheduler, + + HasFeedback + + HasScheduler, { /// The mutator, added to this stage #[inline] diff --git a/libafl_qemu/src/executor.rs b/libafl_qemu/src/executor.rs index 575dc6601b..58f3c107c9 100644 --- a/libafl_qemu/src/executor.rs +++ b/libafl_qemu/src/executor.rs @@ -66,7 +66,7 @@ where EM: EventFirer + EventRestarter, OF: Feedback, S: State + HasExecutions + HasCorpus + HasSolutions + HasClientPerfMonitor, - Z: HasObjective, + Z: HasObjective, { Ok(Self { first_exec: true, @@ -215,7 +215,7 @@ where EM: EventFirer + EventRestarter, OF: Feedback, S: HasSolutions + HasClientPerfMonitor, - Z: HasObjective, + 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"); diff --git a/scripts/find_unused_rs_files.sh b/scripts/find_unused_rs_files.sh new file mode 100755 index 0000000000..2059b62a28 --- /dev/null +++ b/scripts/find_unused_rs_files.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# Script to find .rs files that don't get built. + +cargo +nightly build --examples --all-features --tests + +# Find all files in deps, then compare to all actual .d files. Ignore a range of files. +grep --no-filename '^[^/].*\.rs:$' target/debug/deps/*.d | sed 's/:$//' | sort -u | diff - <(find . -name '*.rs' | sed 's/\.\///' | sort -u) | grep -Ev '(target/|scripts/|symcc_runtime/|build.rs|fuzzers/)' \ No newline at end of file