* Handle name cleanup after #2142 * Handleable -> CanBeHandled * CanBeHandled -> Handled * clippy * forgot one * Handled more
This commit is contained in:
parent
c1a55982b6
commit
c97c8cf83e
@ -21,7 +21,7 @@ use libafl::{
|
|||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
rands::StdRand,
|
rands::StdRand,
|
||||||
shmem::{ShMem, ShMemProvider, UnixShMemProvider},
|
shmem::{ShMem, ShMemProvider, UnixShMemProvider},
|
||||||
tuples::{tuple_list, Handler, MatchNameRef, Merge},
|
tuples::{tuple_list, Handled, MatchNameRef, Merge},
|
||||||
AsSliceMut, Truncate,
|
AsSliceMut, Truncate,
|
||||||
};
|
};
|
||||||
use libafl_targets::EDGES_MAP_SIZE_IN_USE;
|
use libafl_targets::EDGES_MAP_SIZE_IN_USE;
|
||||||
@ -166,7 +166,7 @@ pub fn main() {
|
|||||||
// Create the executor for the forkserver
|
// Create the executor for the forkserver
|
||||||
let args = opt.arguments;
|
let args = opt.arguments;
|
||||||
|
|
||||||
let observer_ref = edges_observer.handle();
|
let observer_handle = edges_observer.handle();
|
||||||
|
|
||||||
let mut tokens = Tokens::new();
|
let mut tokens = Tokens::new();
|
||||||
let mut executor = ForkserverExecutor::builder()
|
let mut executor = ForkserverExecutor::builder()
|
||||||
@ -182,7 +182,7 @@ pub fn main() {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
if let Some(dynamic_map_size) = executor.coverage_map_size() {
|
if let Some(dynamic_map_size) = executor.coverage_map_size() {
|
||||||
executor.observers_mut()[&observer_ref]
|
executor.observers_mut()[&observer_handle]
|
||||||
.as_mut()
|
.as_mut()
|
||||||
.truncate(dynamic_map_size);
|
.truncate(dynamic_map_size);
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ use libafl_bolts::{
|
|||||||
current_nanos,
|
current_nanos,
|
||||||
rands::StdRand,
|
rands::StdRand,
|
||||||
shmem::{ShMem, ShMemProvider, UnixShMemProvider},
|
shmem::{ShMem, ShMemProvider, UnixShMemProvider},
|
||||||
tuples::{tuple_list, Handler, Merge},
|
tuples::{tuple_list, Handled, Merge},
|
||||||
AsSliceMut, Truncate,
|
AsSliceMut, Truncate,
|
||||||
};
|
};
|
||||||
use nix::sys::signal::Signal;
|
use nix::sys::signal::Signal;
|
||||||
|
@ -37,7 +37,7 @@ use libafl_bolts::{
|
|||||||
ownedref::OwnedRefMut,
|
ownedref::OwnedRefMut,
|
||||||
rands::StdRand,
|
rands::StdRand,
|
||||||
shmem::{ShMem, ShMemProvider, UnixShMemProvider},
|
shmem::{ShMem, ShMemProvider, UnixShMemProvider},
|
||||||
tuples::{tuple_list, Handler, Merge},
|
tuples::{tuple_list, Handled, Merge},
|
||||||
AsSliceMut,
|
AsSliceMut,
|
||||||
};
|
};
|
||||||
use libafl_targets::{
|
use libafl_targets::{
|
||||||
|
@ -42,7 +42,7 @@ use libafl_bolts::{
|
|||||||
current_nanos,
|
current_nanos,
|
||||||
rands::StdRand,
|
rands::StdRand,
|
||||||
shmem::{ShMem, ShMemProvider, StdShMemProvider},
|
shmem::{ShMem, ShMemProvider, StdShMemProvider},
|
||||||
tuples::{tuple_list, Handler},
|
tuples::{tuple_list, Handled},
|
||||||
AsSlice, AsSliceMut,
|
AsSlice, AsSliceMut,
|
||||||
};
|
};
|
||||||
use libafl_targets::{
|
use libafl_targets::{
|
||||||
|
@ -7,7 +7,7 @@ use core::{hash::Hash, marker::PhantomData};
|
|||||||
use hashbrown::{HashMap, HashSet};
|
use hashbrown::{HashMap, HashSet};
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
current_time,
|
current_time,
|
||||||
tuples::{Handle, Handler},
|
tuples::{Handle, Handled},
|
||||||
AsIter, Named,
|
AsIter, Named,
|
||||||
};
|
};
|
||||||
use num_traits::ToPrimitive;
|
use num_traits::ToPrimitive;
|
||||||
@ -51,7 +51,7 @@ where
|
|||||||
/// Algorithm based on WMOPT: <https://hexhive.epfl.ch/publications/files/21ISSTA2.pdf>
|
/// Algorithm based on WMOPT: <https://hexhive.epfl.ch/publications/files/21ISSTA2.pdf>
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct MapCorpusMinimizer<C, E, O, T, TS> {
|
pub struct MapCorpusMinimizer<C, E, O, T, TS> {
|
||||||
obs_ref: Handle<C>,
|
observer_handle: Handle<C>,
|
||||||
phantom: PhantomData<(E, O, T, TS)>,
|
phantom: PhantomData<(E, O, T, TS)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,7 +70,7 @@ where
|
|||||||
/// in the future to get observed maps from an executed input.
|
/// in the future to get observed maps from an executed input.
|
||||||
pub fn new(obs: &C) -> Self {
|
pub fn new(obs: &C) -> Self {
|
||||||
Self {
|
Self {
|
||||||
obs_ref: obs.handle(),
|
observer_handle: obs.handle(),
|
||||||
phantom: PhantomData,
|
phantom: PhantomData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -161,7 +161,7 @@ where
|
|||||||
|
|
||||||
let seed_expr = Bool::fresh_const(&ctx, "seed");
|
let seed_expr = Bool::fresh_const(&ctx, "seed");
|
||||||
let observers = executor.observers();
|
let observers = executor.observers();
|
||||||
let obs = observers[&self.obs_ref].as_ref();
|
let obs = observers[&self.observer_handle].as_ref();
|
||||||
|
|
||||||
// Store coverage, mapping coverage map indices to hit counts (if present) and the
|
// Store coverage, mapping coverage map indices to hit counts (if present) and the
|
||||||
// associated seeds for the map indices with those hit counts.
|
// associated seeds for the map indices with those hit counts.
|
||||||
|
@ -11,7 +11,7 @@ use alloc::{boxed::Box, string::String, vec::Vec};
|
|||||||
use core::{marker::PhantomData, num::NonZeroUsize, time::Duration};
|
use core::{marker::PhantomData, num::NonZeroUsize, time::Duration};
|
||||||
|
|
||||||
#[cfg(feature = "adaptive_serialization")]
|
#[cfg(feature = "adaptive_serialization")]
|
||||||
use libafl_bolts::tuples::{Handle, Handler};
|
use libafl_bolts::tuples::{Handle, Handled};
|
||||||
#[cfg(feature = "llmp_compression")]
|
#[cfg(feature = "llmp_compression")]
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
compress::GzipCompressor,
|
compress::GzipCompressor,
|
||||||
|
@ -33,7 +33,7 @@ use libafl_bolts::os::dup2;
|
|||||||
#[cfg(all(feature = "std", any(windows, not(feature = "fork"))))]
|
#[cfg(all(feature = "std", any(windows, not(feature = "fork"))))]
|
||||||
use libafl_bolts::os::startable_self;
|
use libafl_bolts::os::startable_self;
|
||||||
#[cfg(feature = "adaptive_serialization")]
|
#[cfg(feature = "adaptive_serialization")]
|
||||||
use libafl_bolts::tuples::{Handle, Handler};
|
use libafl_bolts::tuples::{Handle, Handled};
|
||||||
#[cfg(all(unix, feature = "std", feature = "fork"))]
|
#[cfg(all(unix, feature = "std", feature = "fork"))]
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
core_affinity::get_core_ids,
|
core_affinity::get_core_ids,
|
||||||
|
@ -33,7 +33,7 @@ use libafl_bolts::{
|
|||||||
#[cfg(feature = "adaptive_serialization")]
|
#[cfg(feature = "adaptive_serialization")]
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
current_time,
|
current_time,
|
||||||
tuples::{Handle, Handler},
|
tuples::{Handle, Handled},
|
||||||
};
|
};
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
@ -2060,7 +2060,7 @@ mod tests {
|
|||||||
use core::sync::atomic::{compiler_fence, Ordering};
|
use core::sync::atomic::{compiler_fence, Ordering};
|
||||||
|
|
||||||
#[cfg(feature = "adaptive_serialization")]
|
#[cfg(feature = "adaptive_serialization")]
|
||||||
use libafl_bolts::tuples::Handler;
|
use libafl_bolts::tuples::Handled;
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
llmp::{LlmpClient, LlmpSharedMap},
|
llmp::{LlmpClient, LlmpSharedMap},
|
||||||
rands::StdRand,
|
rands::StdRand,
|
||||||
|
@ -22,7 +22,7 @@ use libafl_bolts::{
|
|||||||
fs::{get_unique_std_input_file, InputFile},
|
fs::{get_unique_std_input_file, InputFile},
|
||||||
os::{dup2, pipes::Pipe},
|
os::{dup2, pipes::Pipe},
|
||||||
shmem::{ShMem, ShMemProvider, UnixShMemProvider},
|
shmem::{ShMem, ShMemProvider, UnixShMemProvider},
|
||||||
tuples::{Handle, Handler, MatchNameRef, Prepend, RefIndexable},
|
tuples::{Handle, Handled, MatchNameRef, Prepend, RefIndexable},
|
||||||
AsSlice, AsSliceMut, Truncate,
|
AsSlice, AsSliceMut, Truncate,
|
||||||
};
|
};
|
||||||
use nix::{
|
use nix::{
|
||||||
|
@ -7,7 +7,7 @@ use alloc::borrow::Cow;
|
|||||||
use core::{fmt::Debug, marker::PhantomData};
|
use core::{fmt::Debug, marker::PhantomData};
|
||||||
|
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
tuples::{Handle, Handler, MatchNameRef},
|
tuples::{Handle, Handled, MatchNameRef},
|
||||||
Named,
|
Named,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ use crate::{
|
|||||||
/// Requires a [`ConcolicObserver`] to observe the concolic trace.
|
/// Requires a [`ConcolicObserver`] to observe the concolic trace.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct ConcolicFeedback<'map, S> {
|
pub struct ConcolicFeedback<'map, S> {
|
||||||
obs_ref: Handle<ConcolicObserver<'map>>,
|
observer_handle: Handle<ConcolicObserver<'map>>,
|
||||||
phantom: PhantomData<S>,
|
phantom: PhantomData<S>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ impl<'map, S> ConcolicFeedback<'map, S> {
|
|||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn from_observer(observer: &ConcolicObserver<'map>) -> Self {
|
pub fn from_observer(observer: &ConcolicObserver<'map>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
obs_ref: observer.handle(),
|
observer_handle: observer.handle(),
|
||||||
phantom: PhantomData,
|
phantom: PhantomData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -46,7 +46,7 @@ impl<'map, S> ConcolicFeedback<'map, S> {
|
|||||||
|
|
||||||
impl<S> Named for ConcolicFeedback<'_, S> {
|
impl<S> Named for ConcolicFeedback<'_, S> {
|
||||||
fn name(&self) -> &Cow<'static, str> {
|
fn name(&self) -> &Cow<'static, str> {
|
||||||
self.obs_ref.name()
|
self.observer_handle.name()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,7 +82,7 @@ where
|
|||||||
EM: EventFirer<State = S>,
|
EM: EventFirer<State = S>,
|
||||||
{
|
{
|
||||||
if let Some(metadata) = observers
|
if let Some(metadata) = observers
|
||||||
.get(&self.obs_ref)
|
.get(&self.observer_handle)
|
||||||
.map(ConcolicObserver::create_metadata_from_current_map)
|
.map(ConcolicObserver::create_metadata_from_current_map)
|
||||||
{
|
{
|
||||||
testcase.metadata_map_mut().insert(metadata);
|
testcase.metadata_map_mut().insert(metadata);
|
||||||
|
@ -8,7 +8,7 @@ use core::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
tuples::{Handle, Handler, MatchName, MatchNameRef},
|
tuples::{Handle, Handled, MatchName, MatchNameRef},
|
||||||
Named,
|
Named,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
@ -3,7 +3,7 @@ use core::{fmt::Debug, hash::Hash};
|
|||||||
|
|
||||||
use hashbrown::HashSet;
|
use hashbrown::HashSet;
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
tuples::{Handle, Handler, MatchNameRef},
|
tuples::{Handle, Handled, MatchNameRef},
|
||||||
Error, HasRefCnt, Named,
|
Error, HasRefCnt, Named,
|
||||||
};
|
};
|
||||||
use serde::{de::DeserializeOwned, Deserialize, Serialize};
|
use serde::{de::DeserializeOwned, Deserialize, Serialize};
|
||||||
@ -73,7 +73,7 @@ pub struct ListFeedback<T>
|
|||||||
where
|
where
|
||||||
T: Hash + Eq,
|
T: Hash + Eq,
|
||||||
{
|
{
|
||||||
obs_ref: Handle<ListObserver<T>>,
|
observer_handle: Handle<ListObserver<T>>,
|
||||||
novelty: HashSet<T>,
|
novelty: HashSet<T>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ where
|
|||||||
OT: ObserversTuple<S>,
|
OT: ObserversTuple<S>,
|
||||||
{
|
{
|
||||||
// TODO Replace with match_name_type when stable
|
// TODO Replace with match_name_type when stable
|
||||||
let observer = observers.get(&self.obs_ref).unwrap();
|
let observer = observers.get(&self.observer_handle).unwrap();
|
||||||
// TODO register the list content in a testcase metadata
|
// TODO register the list content in a testcase metadata
|
||||||
self.novelty.clear();
|
self.novelty.clear();
|
||||||
// can't fail
|
// can't fail
|
||||||
@ -151,7 +151,7 @@ where
|
|||||||
{
|
{
|
||||||
#[inline]
|
#[inline]
|
||||||
fn name(&self) -> &Cow<'static, str> {
|
fn name(&self) -> &Cow<'static, str> {
|
||||||
self.obs_ref.name()
|
self.observer_handle.name()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,7 +163,7 @@ where
|
|||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn new(observer: &ListObserver<T>) -> Self {
|
pub fn new(observer: &ListObserver<T>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
obs_ref: observer.handle(),
|
observer_handle: observer.handle(),
|
||||||
novelty: HashSet::<T>::new(),
|
novelty: HashSet::<T>::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ use core::{
|
|||||||
#[rustversion::nightly]
|
#[rustversion::nightly]
|
||||||
use libafl_bolts::AsSlice;
|
use libafl_bolts::AsSlice;
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
tuples::{Handle, Handler, MatchNameRef},
|
tuples::{Handle, Handled, MatchNameRef},
|
||||||
AsIter, HasRefCnt, Named,
|
AsIter, HasRefCnt, Named,
|
||||||
};
|
};
|
||||||
use num_traits::PrimInt;
|
use num_traits::PrimInt;
|
||||||
@ -22,7 +22,7 @@ use crate::{
|
|||||||
corpus::Testcase,
|
corpus::Testcase,
|
||||||
events::{Event, EventFirer},
|
events::{Event, EventFirer},
|
||||||
executors::ExitKind,
|
executors::ExitKind,
|
||||||
feedbacks::{Feedback, HasObserverReference},
|
feedbacks::{Feedback, HasObserverHandle},
|
||||||
inputs::UsesInput,
|
inputs::UsesInput,
|
||||||
monitors::{AggregatorOps, UserStats, UserStatsValue},
|
monitors::{AggregatorOps, UserStats, UserStatsValue},
|
||||||
observers::{CanTrack, MapObserver, Observer, ObserversTuple},
|
observers::{CanTrack, MapObserver, Observer, ObserversTuple},
|
||||||
@ -660,7 +660,7 @@ impl<C, N, O, R, T> Named for MapFeedback<C, N, O, R, T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<C, N, O, R, T> HasObserverReference for MapFeedback<C, N, O, R, T>
|
impl<C, N, O, R, T> HasObserverHandle for MapFeedback<C, N, O, R, T>
|
||||||
where
|
where
|
||||||
O: Named,
|
O: Named,
|
||||||
C: AsRef<O>,
|
C: AsRef<O>,
|
||||||
@ -668,7 +668,7 @@ where
|
|||||||
type Observer = C;
|
type Observer = C;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn observer_ref(&self) -> &Handle<C> {
|
fn observer_handle(&self) -> &Handle<C> {
|
||||||
&self.map_ref
|
&self.map_ref
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ use core::{
|
|||||||
pub use concolic::ConcolicFeedback;
|
pub use concolic::ConcolicFeedback;
|
||||||
pub use differential::DiffFeedback;
|
pub use differential::DiffFeedback;
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
tuples::{Handle, Handler, MatchNameRef},
|
tuples::{Handle, Handled, MatchNameRef},
|
||||||
Named,
|
Named,
|
||||||
};
|
};
|
||||||
pub use list::*;
|
pub use list::*;
|
||||||
@ -138,12 +138,12 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Has an associated observer name (mostly used to retrieve the observer with `MatchName` from an `ObserverTuple`)
|
/// Has an associated observer name (mostly used to retrieve the observer with `MatchName` from an `ObserverTuple`)
|
||||||
pub trait HasObserverReference {
|
pub trait HasObserverHandle {
|
||||||
/// The observer for which we hold a reference
|
/// The observer for which we hold a reference
|
||||||
type Observer: ?Sized;
|
type Observer: ?Sized;
|
||||||
|
|
||||||
/// The name associated with the observer
|
/// The name associated with the observer
|
||||||
fn observer_ref(&self) -> &Handle<Self::Observer>;
|
fn observer_handle(&self) -> &Handle<Self::Observer>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A combined feedback consisting of multiple [`Feedback`]s
|
/// A combined feedback consisting of multiple [`Feedback`]s
|
||||||
@ -934,7 +934,7 @@ pub type TimeoutFeedbackFactory = DefaultFeedbackFactory<TimeoutFeedback>;
|
|||||||
/// It decides, if the given [`TimeObserver`] value of a run is interesting.
|
/// It decides, if the given [`TimeObserver`] value of a run is interesting.
|
||||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||||
pub struct TimeFeedback {
|
pub struct TimeFeedback {
|
||||||
obs_ref: Handle<TimeObserver>,
|
observer_handle: Handle<TimeObserver>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<S> Feedback<S> for TimeFeedback
|
impl<S> Feedback<S> for TimeFeedback
|
||||||
@ -971,7 +971,7 @@ where
|
|||||||
OT: ObserversTuple<S>,
|
OT: ObserversTuple<S>,
|
||||||
EM: EventFirer<State = S>,
|
EM: EventFirer<State = S>,
|
||||||
{
|
{
|
||||||
let observer = observers.get(&self.obs_ref).unwrap();
|
let observer = observers.get(&self.observer_handle).unwrap();
|
||||||
*testcase.exec_time_mut() = *observer.last_runtime();
|
*testcase.exec_time_mut() = *observer.last_runtime();
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -986,7 +986,7 @@ where
|
|||||||
impl Named for TimeFeedback {
|
impl Named for TimeFeedback {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn name(&self) -> &Cow<'static, str> {
|
fn name(&self) -> &Cow<'static, str> {
|
||||||
self.obs_ref.name()
|
self.observer_handle.name()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -995,7 +995,7 @@ impl TimeFeedback {
|
|||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn new(observer: &TimeObserver) -> Self {
|
pub fn new(observer: &TimeObserver) -> Self {
|
||||||
Self {
|
Self {
|
||||||
obs_ref: observer.handle(),
|
observer_handle: observer.handle(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ use std::{fmt::Debug, marker::PhantomData};
|
|||||||
|
|
||||||
use hashbrown::HashSet;
|
use hashbrown::HashSet;
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
tuples::{Handle, Handler, MatchNameRef},
|
tuples::{Handle, Handled, MatchNameRef},
|
||||||
Named,
|
Named,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@ -13,7 +13,7 @@ use serde::{Deserialize, Serialize};
|
|||||||
use crate::{
|
use crate::{
|
||||||
events::EventFirer,
|
events::EventFirer,
|
||||||
executors::ExitKind,
|
executors::ExitKind,
|
||||||
feedbacks::{Feedback, HasObserverReference},
|
feedbacks::{Feedback, HasObserverHandle},
|
||||||
inputs::UsesInput,
|
inputs::UsesInput,
|
||||||
observers::{ObserverWithHashField, ObserversTuple},
|
observers::{ObserverWithHashField, ObserversTuple},
|
||||||
state::State,
|
state::State,
|
||||||
@ -145,11 +145,11 @@ impl<O, S> Named for NewHashFeedback<O, S> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<O, S> HasObserverReference for NewHashFeedback<O, S> {
|
impl<O, S> HasObserverHandle for NewHashFeedback<O, S> {
|
||||||
type Observer = O;
|
type Observer = O;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn observer_ref(&self) -> &Handle<O> {
|
fn observer_handle(&self) -> &Handle<O> {
|
||||||
&self.o_ref
|
&self.o_ref
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ use alloc::{borrow::Cow, string::String};
|
|||||||
|
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
impl_serdeany,
|
impl_serdeany,
|
||||||
tuples::{Handle, Handler, MatchNameRef},
|
tuples::{Handle, Handled, MatchNameRef},
|
||||||
Named,
|
Named,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
@ -82,7 +82,7 @@ where
|
|||||||
fn set_last_hash(&mut self, value: usize);
|
fn set_last_hash(&mut self, value: usize);
|
||||||
|
|
||||||
/// Get the observer map observer name
|
/// Get the observer map observer name
|
||||||
fn map_observer_ref(&self) -> &Handle<C>;
|
fn map_observer_handle(&self) -> &Handle<C>;
|
||||||
|
|
||||||
/// Called when a [`Testcase`] is added to the corpus
|
/// Called when a [`Testcase`] is added to the corpus
|
||||||
fn on_add_metadata(&self, state: &mut Self::State, idx: CorpusId) -> Result<(), Error> {
|
fn on_add_metadata(&self, state: &mut Self::State, idx: CorpusId) -> Result<(), Error> {
|
||||||
@ -121,7 +121,7 @@ where
|
|||||||
OT: ObserversTuple<Self::State>,
|
OT: ObserversTuple<Self::State>,
|
||||||
{
|
{
|
||||||
let observer = observers
|
let observer = observers
|
||||||
.get(self.map_observer_ref())
|
.get(self.map_observer_handle())
|
||||||
.ok_or_else(|| Error::key_not_found("MapObserver not found".to_string()))?
|
.ok_or_else(|| Error::key_not_found("MapObserver not found".to_string()))?
|
||||||
.as_ref();
|
.as_ref();
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ use alloc::vec::Vec;
|
|||||||
use core::{marker::PhantomData, time::Duration};
|
use core::{marker::PhantomData, time::Duration};
|
||||||
|
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
tuples::{Handle, Handler},
|
tuples::{Handle, Handled},
|
||||||
Named,
|
Named,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@ -173,7 +173,7 @@ pub enum PowerSchedule {
|
|||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct PowerQueueScheduler<C, O, S> {
|
pub struct PowerQueueScheduler<C, O, S> {
|
||||||
strat: PowerSchedule,
|
strat: PowerSchedule,
|
||||||
map_observer_ref: Handle<C>,
|
map_observer_handle: Handle<C>,
|
||||||
last_hash: usize,
|
last_hash: usize,
|
||||||
phantom: PhantomData<(O, S)>,
|
phantom: PhantomData<(O, S)>,
|
||||||
}
|
}
|
||||||
@ -226,8 +226,8 @@ where
|
|||||||
self.last_hash = hash;
|
self.last_hash = hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn map_observer_ref(&self) -> &Handle<C> {
|
fn map_observer_handle(&self) -> &Handle<C> {
|
||||||
&self.map_observer_ref
|
&self.map_observer_handle
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -305,7 +305,7 @@ where
|
|||||||
}
|
}
|
||||||
PowerQueueScheduler {
|
PowerQueueScheduler {
|
||||||
strat,
|
strat,
|
||||||
map_observer_ref: map_observer.handle(),
|
map_observer_handle: map_observer.handle(),
|
||||||
last_hash: 0,
|
last_hash: 0,
|
||||||
phantom: PhantomData,
|
phantom: PhantomData,
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ use core::marker::PhantomData;
|
|||||||
use hashbrown::HashMap;
|
use hashbrown::HashMap;
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
rands::Rand,
|
rands::Rand,
|
||||||
tuples::{Handle, Handler},
|
tuples::{Handle, Handled},
|
||||||
Named,
|
Named,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@ -98,7 +98,7 @@ libafl_bolts::impl_serdeany!(WeightedScheduleMetadata);
|
|||||||
pub struct WeightedScheduler<C, F, O, S> {
|
pub struct WeightedScheduler<C, F, O, S> {
|
||||||
table_invalidated: bool,
|
table_invalidated: bool,
|
||||||
strat: Option<PowerSchedule>,
|
strat: Option<PowerSchedule>,
|
||||||
map_observer_ref: Handle<C>,
|
map_observer_handle: Handle<C>,
|
||||||
last_hash: usize,
|
last_hash: usize,
|
||||||
phantom: PhantomData<(F, O, S)>,
|
phantom: PhantomData<(F, O, S)>,
|
||||||
}
|
}
|
||||||
@ -124,7 +124,7 @@ where
|
|||||||
|
|
||||||
Self {
|
Self {
|
||||||
strat,
|
strat,
|
||||||
map_observer_ref: map_observer.handle(),
|
map_observer_handle: map_observer.handle(),
|
||||||
last_hash: 0,
|
last_hash: 0,
|
||||||
table_invalidated: true,
|
table_invalidated: true,
|
||||||
phantom: PhantomData,
|
phantom: PhantomData,
|
||||||
@ -274,8 +274,8 @@ where
|
|||||||
self.last_hash = hash;
|
self.last_hash = hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn map_observer_ref(&self) -> &Handle<C> {
|
fn map_observer_handle(&self) -> &Handle<C> {
|
||||||
&self.map_observer_ref
|
&self.map_observer_handle
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ use crate::{
|
|||||||
corpus::{Corpus, SchedulerTestcaseMetadata},
|
corpus::{Corpus, SchedulerTestcaseMetadata},
|
||||||
events::{Event, EventFirer, LogSeverity},
|
events::{Event, EventFirer, LogSeverity},
|
||||||
executors::{Executor, ExitKind, HasObservers},
|
executors::{Executor, ExitKind, HasObservers},
|
||||||
feedbacks::{map::MapFeedbackMetadata, HasObserverReference},
|
feedbacks::{map::MapFeedbackMetadata, HasObserverHandle},
|
||||||
fuzzer::Evaluator,
|
fuzzer::Evaluator,
|
||||||
inputs::UsesInput,
|
inputs::UsesInput,
|
||||||
monitors::{AggregatorOps, UserStats, UserStatsValue},
|
monitors::{AggregatorOps, UserStats, UserStatsValue},
|
||||||
@ -63,7 +63,7 @@ impl UnstableEntriesMetadata {
|
|||||||
/// The calibration stage will measure the average exec time and the target's stability for this input.
|
/// The calibration stage will measure the average exec time and the target's stability for this input.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct CalibrationStage<C, O, OT, S> {
|
pub struct CalibrationStage<C, O, OT, S> {
|
||||||
map_observer_ref: Handle<C>,
|
map_observer_handle: Handle<C>,
|
||||||
map_name: Cow<'static, str>,
|
map_name: Cow<'static, str>,
|
||||||
stage_max: usize,
|
stage_max: usize,
|
||||||
/// If we should track stability
|
/// If we should track stability
|
||||||
@ -144,7 +144,7 @@ where
|
|||||||
.observers_mut()
|
.observers_mut()
|
||||||
.post_exec_all(state, &input, &exit_kind)?;
|
.post_exec_all(state, &input, &exit_kind)?;
|
||||||
|
|
||||||
let map_first = &executor.observers()[&self.map_observer_ref]
|
let map_first = &executor.observers()[&self.map_observer_handle]
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.to_vec();
|
.to_vec();
|
||||||
|
|
||||||
@ -185,7 +185,7 @@ where
|
|||||||
.post_exec_all(state, &input, &exit_kind)?;
|
.post_exec_all(state, &input, &exit_kind)?;
|
||||||
|
|
||||||
if self.track_stability {
|
if self.track_stability {
|
||||||
let map = &executor.observers()[&self.map_observer_ref]
|
let map = &executor.observers()[&self.map_observer_handle]
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.to_vec();
|
.to_vec();
|
||||||
|
|
||||||
@ -240,7 +240,7 @@ where
|
|||||||
// If weighted scheduler or powerscheduler is used, update it
|
// If weighted scheduler or powerscheduler is used, update it
|
||||||
if state.has_metadata::<SchedulerMetadata>() {
|
if state.has_metadata::<SchedulerMetadata>() {
|
||||||
let observers = executor.observers();
|
let observers = executor.observers();
|
||||||
let map = observers[&self.map_observer_ref].as_ref();
|
let map = observers[&self.map_observer_handle].as_ref();
|
||||||
|
|
||||||
let mut bitmap_size = map.count_bytes();
|
let mut bitmap_size = map.count_bytes();
|
||||||
assert!(bitmap_size != 0);
|
assert!(bitmap_size != 0);
|
||||||
@ -340,10 +340,10 @@ where
|
|||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn new<F>(map_feedback: &F) -> Self
|
pub fn new<F>(map_feedback: &F) -> Self
|
||||||
where
|
where
|
||||||
F: HasObserverReference<Observer = C> + Named,
|
F: HasObserverHandle<Observer = C> + Named,
|
||||||
{
|
{
|
||||||
Self {
|
Self {
|
||||||
map_observer_ref: map_feedback.observer_ref().clone(),
|
map_observer_handle: map_feedback.observer_handle().clone(),
|
||||||
map_name: map_feedback.name().clone(),
|
map_name: map_feedback.name().clone(),
|
||||||
stage_max: CAL_STAGE_START,
|
stage_max: CAL_STAGE_START,
|
||||||
track_stability: true,
|
track_stability: true,
|
||||||
@ -356,10 +356,10 @@ where
|
|||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn ignore_stability<F>(map_feedback: &F) -> Self
|
pub fn ignore_stability<F>(map_feedback: &F) -> Self
|
||||||
where
|
where
|
||||||
F: HasObserverReference<Observer = C> + Named,
|
F: HasObserverHandle<Observer = C> + Named,
|
||||||
{
|
{
|
||||||
Self {
|
Self {
|
||||||
map_observer_ref: map_feedback.observer_ref().clone(),
|
map_observer_handle: map_feedback.observer_handle().clone(),
|
||||||
map_name: map_feedback.name().clone(),
|
map_name: map_feedback.name().clone(),
|
||||||
stage_max: CAL_STAGE_START,
|
stage_max: CAL_STAGE_START,
|
||||||
track_stability: false,
|
track_stability: false,
|
||||||
|
@ -4,7 +4,7 @@ use core::{cmp::Ordering, fmt::Debug, marker::PhantomData, ops::Range};
|
|||||||
|
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
rands::Rand,
|
rands::Rand,
|
||||||
tuples::{Handle, Handler},
|
tuples::{Handle, Handled},
|
||||||
Named,
|
Named,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@ -55,7 +55,7 @@ impl Ord for Earlier {
|
|||||||
/// The mutational stage using power schedules
|
/// The mutational stage using power schedules
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct ColorizationStage<C, E, EM, O, Z> {
|
pub struct ColorizationStage<C, E, EM, O, Z> {
|
||||||
map_observer_ref: Handle<C>,
|
map_observer_handle: Handle<C>,
|
||||||
#[allow(clippy::type_complexity)]
|
#[allow(clippy::type_complexity)]
|
||||||
phantom: PhantomData<(E, EM, O, E, Z)>,
|
phantom: PhantomData<(E, EM, O, E, Z)>,
|
||||||
}
|
}
|
||||||
@ -72,7 +72,7 @@ where
|
|||||||
E: UsesState,
|
E: UsesState,
|
||||||
{
|
{
|
||||||
fn name(&self) -> &Cow<'static, str> {
|
fn name(&self) -> &Cow<'static, str> {
|
||||||
self.map_observer_ref.name()
|
self.map_observer_handle.name()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ where
|
|||||||
manager: &mut EM,
|
manager: &mut EM,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
// Run with the mutated input
|
// Run with the mutated input
|
||||||
Self::colorize(fuzzer, executor, state, manager, &self.map_observer_ref)?;
|
Self::colorize(fuzzer, executor, state, manager, &self.map_observer_handle)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -168,7 +168,7 @@ where
|
|||||||
executor: &mut E,
|
executor: &mut E,
|
||||||
state: &mut E::State,
|
state: &mut E::State,
|
||||||
manager: &mut EM,
|
manager: &mut EM,
|
||||||
obs_ref: &Handle<C>,
|
observer_handle: &Handle<C>,
|
||||||
) -> Result<E::Input, Error> {
|
) -> Result<E::Input, Error> {
|
||||||
let mut input = state.current_input_cloned()?;
|
let mut input = state.current_input_cloned()?;
|
||||||
// The backup of the input
|
// The backup of the input
|
||||||
@ -182,8 +182,14 @@ where
|
|||||||
// First, run orig_input once and get the original hash
|
// First, run orig_input once and get the original hash
|
||||||
|
|
||||||
// Idea: No need to do this every time
|
// Idea: No need to do this every time
|
||||||
let orig_hash =
|
let orig_hash = Self::get_raw_map_hash_run(
|
||||||
Self::get_raw_map_hash_run(fuzzer, executor, state, manager, consumed_input, obs_ref)?;
|
fuzzer,
|
||||||
|
executor,
|
||||||
|
state,
|
||||||
|
manager,
|
||||||
|
consumed_input,
|
||||||
|
observer_handle,
|
||||||
|
)?;
|
||||||
let changed_bytes = changed.bytes_mut();
|
let changed_bytes = changed.bytes_mut();
|
||||||
let input_len = changed_bytes.len();
|
let input_len = changed_bytes.len();
|
||||||
|
|
||||||
@ -228,7 +234,7 @@ where
|
|||||||
state,
|
state,
|
||||||
manager,
|
manager,
|
||||||
consumed_input,
|
consumed_input,
|
||||||
obs_ref,
|
observer_handle,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
if orig_hash == changed_hash {
|
if orig_hash == changed_hash {
|
||||||
@ -301,7 +307,7 @@ where
|
|||||||
/// Creates a new [`ColorizationStage`]
|
/// Creates a new [`ColorizationStage`]
|
||||||
pub fn new(map_observer: &C) -> Self {
|
pub fn new(map_observer: &C) -> Self {
|
||||||
Self {
|
Self {
|
||||||
map_observer_ref: map_observer.handle(),
|
map_observer_handle: map_observer.handle(),
|
||||||
phantom: PhantomData,
|
phantom: PhantomData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -313,14 +319,14 @@ where
|
|||||||
state: &mut E::State,
|
state: &mut E::State,
|
||||||
manager: &mut EM,
|
manager: &mut EM,
|
||||||
input: E::Input,
|
input: E::Input,
|
||||||
obs_ref: &Handle<C>,
|
observer_handle: &Handle<C>,
|
||||||
) -> Result<usize, Error> {
|
) -> Result<usize, Error> {
|
||||||
executor.observers_mut().pre_exec_all(state, &input)?;
|
executor.observers_mut().pre_exec_all(state, &input)?;
|
||||||
|
|
||||||
let exit_kind = executor.run_target(fuzzer, state, manager, &input)?;
|
let exit_kind = executor.run_target(fuzzer, state, manager, &input)?;
|
||||||
|
|
||||||
let observers = executor.observers();
|
let observers = executor.observers();
|
||||||
let observer = observers[obs_ref].as_ref();
|
let observer = observers[observer_handle].as_ref();
|
||||||
|
|
||||||
let hash = observer.hash_simple() as usize;
|
let hash = observer.hash_simple() as usize;
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ use crate::{
|
|||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct ConcolicTracingStage<'a, EM, TE, Z> {
|
pub struct ConcolicTracingStage<'a, EM, TE, Z> {
|
||||||
inner: TracingStage<EM, TE, Z>,
|
inner: TracingStage<EM, TE, Z>,
|
||||||
obs_ref: Handle<ConcolicObserver<'a>>,
|
observer_handle: Handle<ConcolicObserver<'a>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<EM, TE, Z> UsesState for ConcolicTracingStage<'_, EM, TE, Z>
|
impl<EM, TE, Z> UsesState for ConcolicTracingStage<'_, EM, TE, Z>
|
||||||
@ -73,7 +73,7 @@ where
|
|||||||
manager: &mut EM,
|
manager: &mut EM,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
self.inner.trace(fuzzer, state, manager)?;
|
self.inner.trace(fuzzer, state, manager)?;
|
||||||
if let Some(observer) = self.inner.executor().observers().get(&self.obs_ref) {
|
if let Some(observer) = self.inner.executor().observers().get(&self.observer_handle) {
|
||||||
let metadata = observer.create_metadata_from_current_map();
|
let metadata = observer.create_metadata_from_current_map();
|
||||||
state
|
state
|
||||||
.current_testcase_mut()?
|
.current_testcase_mut()?
|
||||||
@ -95,8 +95,14 @@ where
|
|||||||
impl<'a, EM, TE, Z> ConcolicTracingStage<'a, EM, TE, Z> {
|
impl<'a, EM, TE, Z> ConcolicTracingStage<'a, EM, TE, Z> {
|
||||||
/// Creates a new default tracing stage using the given [`Executor`], observing traces from a
|
/// Creates a new default tracing stage using the given [`Executor`], observing traces from a
|
||||||
/// [`ConcolicObserver`] with the given name.
|
/// [`ConcolicObserver`] with the given name.
|
||||||
pub fn new(inner: TracingStage<EM, TE, Z>, obs_ref: Handle<ConcolicObserver<'a>>) -> Self {
|
pub fn new(
|
||||||
Self { inner, obs_ref }
|
inner: TracingStage<EM, TE, Z>,
|
||||||
|
observer_handle: Handle<ConcolicObserver<'a>>,
|
||||||
|
) -> Self {
|
||||||
|
Self {
|
||||||
|
inner,
|
||||||
|
observer_handle,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ use alloc::{borrow::Cow, vec::Vec};
|
|||||||
use core::{fmt::Debug, marker::PhantomData};
|
use core::{fmt::Debug, marker::PhantomData};
|
||||||
|
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
tuples::{Handle, Handler},
|
tuples::{Handle, Handled},
|
||||||
AsSlice, Named,
|
AsSlice, Named,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ fn find_next_char(list: &[Option<u8>], mut idx: usize, ch: u8) -> usize {
|
|||||||
/// A stage that runs a tracer executor
|
/// A stage that runs a tracer executor
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct GeneralizationStage<C, EM, O, OT, Z> {
|
pub struct GeneralizationStage<C, EM, O, OT, Z> {
|
||||||
map_observer_ref: Handle<C>,
|
map_observer_handle: Handle<C>,
|
||||||
#[allow(clippy::type_complexity)]
|
#[allow(clippy::type_complexity)]
|
||||||
phantom: PhantomData<(EM, O, OT, Z)>,
|
phantom: PhantomData<(EM, O, OT, Z)>,
|
||||||
}
|
}
|
||||||
@ -347,7 +347,7 @@ where
|
|||||||
pub fn new(map_observer: &C) -> Self {
|
pub fn new(map_observer: &C) -> Self {
|
||||||
require_novelties_tracking!("GeneralizationStage", C);
|
require_novelties_tracking!("GeneralizationStage", C);
|
||||||
Self {
|
Self {
|
||||||
map_observer_ref: map_observer.handle(),
|
map_observer_handle: map_observer.handle(),
|
||||||
phantom: PhantomData,
|
phantom: PhantomData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -381,7 +381,7 @@ where
|
|||||||
.post_exec_all(state, input, &exit_kind)?;
|
.post_exec_all(state, input, &exit_kind)?;
|
||||||
mark_feature_time!(state, PerfFeature::PostExecObservers);
|
mark_feature_time!(state, PerfFeature::PostExecObservers);
|
||||||
|
|
||||||
let cnt = executor.observers()[&self.map_observer_ref]
|
let cnt = executor.observers()[&self.map_observer_handle]
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.how_many_set(novelties);
|
.how_many_set(novelties);
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ use core::{borrow::BorrowMut, fmt::Debug, hash::Hash, marker::PhantomData};
|
|||||||
|
|
||||||
use ahash::RandomState;
|
use ahash::RandomState;
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
tuples::{Handle, Handler, MatchNameRef},
|
tuples::{Handle, Handled, MatchNameRef},
|
||||||
HasLen, Named,
|
HasLen, Named,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -13,7 +13,7 @@ use crate::{
|
|||||||
corpus::{Corpus, HasCurrentCorpusIdx, Testcase},
|
corpus::{Corpus, HasCurrentCorpusIdx, Testcase},
|
||||||
events::EventFirer,
|
events::EventFirer,
|
||||||
executors::{Executor, ExitKind, HasObservers},
|
executors::{Executor, ExitKind, HasObservers},
|
||||||
feedbacks::{Feedback, FeedbackFactory, HasObserverReference},
|
feedbacks::{Feedback, FeedbackFactory, HasObserverHandle},
|
||||||
inputs::UsesInput,
|
inputs::UsesInput,
|
||||||
mark_feature_time,
|
mark_feature_time,
|
||||||
mutators::{MutationResult, Mutator},
|
mutators::{MutationResult, Mutator},
|
||||||
@ -364,10 +364,10 @@ impl<C, M, S> Named for MapEqualityFeedback<C, M, S> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<C, M, S> HasObserverReference for MapEqualityFeedback<C, M, S> {
|
impl<C, M, S> HasObserverHandle for MapEqualityFeedback<C, M, S> {
|
||||||
type Observer = C;
|
type Observer = C;
|
||||||
|
|
||||||
fn observer_ref(&self) -> &Handle<Self::Observer> {
|
fn observer_handle(&self) -> &Handle<Self::Observer> {
|
||||||
&self.map_ref
|
&self.map_ref
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -391,7 +391,7 @@ where
|
|||||||
OT: ObserversTuple<S>,
|
OT: ObserversTuple<S>,
|
||||||
{
|
{
|
||||||
let obs = observers
|
let obs = observers
|
||||||
.get(self.observer_ref())
|
.get(self.observer_handle())
|
||||||
.expect("Should have been provided valid observer name.");
|
.expect("Should have been provided valid observer name.");
|
||||||
Ok(obs.as_ref().hash_simple() == self.orig_hash)
|
Ok(obs.as_ref().hash_simple() == self.orig_hash)
|
||||||
}
|
}
|
||||||
@ -407,7 +407,7 @@ pub struct MapEqualityFactory<C, M, S> {
|
|||||||
impl<C, M, S> MapEqualityFactory<C, M, S>
|
impl<C, M, S> MapEqualityFactory<C, M, S>
|
||||||
where
|
where
|
||||||
M: MapObserver,
|
M: MapObserver,
|
||||||
C: AsRef<M> + Handler,
|
C: AsRef<M> + Handled,
|
||||||
{
|
{
|
||||||
/// Creates a new map equality feedback for the given observer
|
/// Creates a new map equality feedback for the given observer
|
||||||
pub fn new(obs: &C) -> Self {
|
pub fn new(obs: &C) -> Self {
|
||||||
@ -418,10 +418,10 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<C, M, S> HasObserverReference for MapEqualityFactory<C, M, S> {
|
impl<C, M, S> HasObserverHandle for MapEqualityFactory<C, M, S> {
|
||||||
type Observer = C;
|
type Observer = C;
|
||||||
|
|
||||||
fn observer_ref(&self) -> &Handle<C> {
|
fn observer_handle(&self) -> &Handle<C> {
|
||||||
&self.map_ref
|
&self.map_ref
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -430,13 +430,13 @@ impl<C, M, OT, S> FeedbackFactory<MapEqualityFeedback<C, M, S>, S, OT>
|
|||||||
for MapEqualityFactory<C, M, S>
|
for MapEqualityFactory<C, M, S>
|
||||||
where
|
where
|
||||||
M: MapObserver,
|
M: MapObserver,
|
||||||
C: AsRef<M> + Handler,
|
C: AsRef<M> + Handled,
|
||||||
OT: ObserversTuple<S>,
|
OT: ObserversTuple<S>,
|
||||||
S: State + Debug,
|
S: State + Debug,
|
||||||
{
|
{
|
||||||
fn create_feedback(&self, observers: &OT) -> MapEqualityFeedback<C, M, S> {
|
fn create_feedback(&self, observers: &OT) -> MapEqualityFeedback<C, M, S> {
|
||||||
let obs = observers
|
let obs = observers
|
||||||
.get(self.observer_ref())
|
.get(self.observer_handle())
|
||||||
.expect("Should have been provided valid observer name.");
|
.expect("Should have been provided valid observer name.");
|
||||||
MapEqualityFeedback {
|
MapEqualityFeedback {
|
||||||
name: Cow::from("MapEq"),
|
name: Cow::from("MapEq"),
|
||||||
|
@ -495,11 +495,11 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Structs that has `Handle `
|
/// Structs that have a [`Handle`] to reference this element by, in maps.
|
||||||
/// You should use this when you want to avoid specifying types using `match_name_type_mut`
|
/// You should use this when you want to avoid specifying types.
|
||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
pub trait Handler: Named {
|
pub trait Handled: Named {
|
||||||
/// Return the `Handle `
|
/// Return the [`Handle`]
|
||||||
fn handle(&self) -> Handle<Self> {
|
fn handle(&self) -> Handle<Self> {
|
||||||
Handle {
|
Handle {
|
||||||
name: Named::name(self).clone(),
|
name: Named::name(self).clone(),
|
||||||
@ -509,7 +509,7 @@ pub trait Handler: Named {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
impl<N> Handler for N where N: Named {}
|
impl<N> Handled for N where N: Named {}
|
||||||
|
|
||||||
/// Object with the type T and the name associated with its concrete value
|
/// Object with the type T and the name associated with its concrete value
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
|
@ -24,7 +24,7 @@ use libafl::{
|
|||||||
};
|
};
|
||||||
use libafl_bolts::{
|
use libafl_bolts::{
|
||||||
ownedref::OwnedPtr,
|
ownedref::OwnedPtr,
|
||||||
tuples::{Handle, Handler, MatchNameRef},
|
tuples::{Handle, Handled, MatchNameRef},
|
||||||
Named, SerdeAny,
|
Named, SerdeAny,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@ -646,7 +646,7 @@ impl AsanErrorsObserver {
|
|||||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||||
pub struct AsanErrorsFeedback<S> {
|
pub struct AsanErrorsFeedback<S> {
|
||||||
errors: Option<AsanErrors>,
|
errors: Option<AsanErrors>,
|
||||||
obs_ref: Handle<AsanErrorsObserver>,
|
observer_handle: Handle<AsanErrorsObserver>,
|
||||||
phantom: PhantomData<S>,
|
phantom: PhantomData<S>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -669,7 +669,7 @@ where
|
|||||||
OT: ObserversTuple<S>,
|
OT: ObserversTuple<S>,
|
||||||
{
|
{
|
||||||
let observer = observers
|
let observer = observers
|
||||||
.get(&self.obs_ref)
|
.get(&self.observer_handle)
|
||||||
.expect("An AsanErrorsFeedback needs an AsanErrorsObserver");
|
.expect("An AsanErrorsFeedback needs an AsanErrorsObserver");
|
||||||
let errors = observer.errors();
|
let errors = observer.errors();
|
||||||
if errors.is_empty() {
|
if errors.is_empty() {
|
||||||
@ -706,7 +706,7 @@ where
|
|||||||
impl<S> Named for AsanErrorsFeedback<S> {
|
impl<S> Named for AsanErrorsFeedback<S> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn name(&self) -> &Cow<'static, str> {
|
fn name(&self) -> &Cow<'static, str> {
|
||||||
self.obs_ref.name()
|
self.observer_handle.name()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -716,7 +716,7 @@ impl<S> AsanErrorsFeedback<S> {
|
|||||||
pub fn new(obs: &AsanErrorsObserver) -> Self {
|
pub fn new(obs: &AsanErrorsObserver) -> Self {
|
||||||
Self {
|
Self {
|
||||||
errors: None,
|
errors: None,
|
||||||
obs_ref: obs.handle(),
|
observer_handle: obs.handle(),
|
||||||
phantom: PhantomData,
|
phantom: PhantomData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ use libafl::{
|
|||||||
inputs::{Input, UsesInput},
|
inputs::{Input, UsesInput},
|
||||||
observers::{stacktrace::BacktraceObserver, ObserversTuple},
|
observers::{stacktrace::BacktraceObserver, ObserversTuple},
|
||||||
};
|
};
|
||||||
use libafl_bolts::tuples::{Handle, Handler, MatchFirstType, MatchNameRef};
|
use libafl_bolts::tuples::{Handle, Handled, MatchFirstType, MatchNameRef};
|
||||||
use libafl_qemu_sys::GuestAddr;
|
use libafl_qemu_sys::GuestAddr;
|
||||||
use thread_local::ThreadLocal;
|
use thread_local::ThreadLocal;
|
||||||
|
|
||||||
@ -439,7 +439,7 @@ where
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct OnCrashBacktraceCollector<'a> {
|
pub struct OnCrashBacktraceCollector<'a> {
|
||||||
callstack_hash: u64,
|
callstack_hash: u64,
|
||||||
obs_ref: Handle<BacktraceObserver<'a>>,
|
observer_handle: Handle<BacktraceObserver<'a>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> OnCrashBacktraceCollector<'a> {
|
impl<'a> OnCrashBacktraceCollector<'a> {
|
||||||
@ -447,7 +447,7 @@ impl<'a> OnCrashBacktraceCollector<'a> {
|
|||||||
pub fn new(observer: &BacktraceObserver<'a>) -> Self {
|
pub fn new(observer: &BacktraceObserver<'a>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
callstack_hash: 0,
|
callstack_hash: 0,
|
||||||
obs_ref: observer.handle(),
|
observer_handle: observer.handle(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -511,7 +511,7 @@ where
|
|||||||
S: UsesInput,
|
S: UsesInput,
|
||||||
{
|
{
|
||||||
let observer = observers
|
let observer = observers
|
||||||
.get_mut(&self.obs_ref)
|
.get_mut(&self.observer_handle)
|
||||||
.expect("A OnCrashBacktraceCollector needs a BacktraceObserver");
|
.expect("A OnCrashBacktraceCollector needs a BacktraceObserver");
|
||||||
observer.fill_external(self.callstack_hash, exit_kind);
|
observer.fill_external(self.callstack_hash, exit_kind);
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ use libafl_bolts::{
|
|||||||
core_affinity::Cores,
|
core_affinity::Cores,
|
||||||
rands::StdRand,
|
rands::StdRand,
|
||||||
shmem::{ShMem, ShMemProvider, UnixShMemProvider},
|
shmem::{ShMem, ShMemProvider, UnixShMemProvider},
|
||||||
tuples::{tuple_list, Handler, Merge},
|
tuples::{tuple_list, Handled, Merge},
|
||||||
AsSliceMut,
|
AsSliceMut,
|
||||||
};
|
};
|
||||||
use typed_builder::TypedBuilder;
|
use typed_builder::TypedBuilder;
|
||||||
|
@ -29,7 +29,7 @@ use libafl_bolts::{
|
|||||||
ownedref::OwnedMutSlice,
|
ownedref::OwnedMutSlice,
|
||||||
rands::StdRand,
|
rands::StdRand,
|
||||||
shmem::{ShMemProvider, StdShMemProvider},
|
shmem::{ShMemProvider, StdShMemProvider},
|
||||||
tuples::{tuple_list, Handler, Merge},
|
tuples::{tuple_list, Handled, Merge},
|
||||||
AsSlice,
|
AsSlice,
|
||||||
};
|
};
|
||||||
use libafl_targets::{edges_map_mut_ptr, CmpLogObserver};
|
use libafl_targets::{edges_map_mut_ptr, CmpLogObserver};
|
||||||
|
@ -32,7 +32,7 @@ use libafl_bolts::{
|
|||||||
ownedref::OwnedMutSlice,
|
ownedref::OwnedMutSlice,
|
||||||
rands::StdRand,
|
rands::StdRand,
|
||||||
shmem::{ShMemProvider, StdShMemProvider},
|
shmem::{ShMemProvider, StdShMemProvider},
|
||||||
tuples::{tuple_list, Handler, Merge},
|
tuples::{tuple_list, Handled, Merge},
|
||||||
AsSlice,
|
AsSlice,
|
||||||
};
|
};
|
||||||
pub use libafl_qemu::qemu::Qemu;
|
pub use libafl_qemu::qemu::Qemu;
|
||||||
|
@ -25,7 +25,7 @@ where
|
|||||||
TE: UsesState,
|
TE: UsesState,
|
||||||
{
|
{
|
||||||
tracer_executor: TE,
|
tracer_executor: TE,
|
||||||
cmplog_observer_ref: Option<Handle<AFLppCmpLogObserver<'a, TE::State>>>,
|
cmplog_observer_handle: Option<Handle<AFLppCmpLogObserver<'a, TE::State>>>,
|
||||||
#[allow(clippy::type_complexity)]
|
#[allow(clippy::type_complexity)]
|
||||||
phantom: PhantomData<(EM, TE, Z)>,
|
phantom: PhantomData<(EM, TE, Z)>,
|
||||||
}
|
}
|
||||||
@ -67,8 +67,12 @@ where
|
|||||||
// First run with the un-mutated input
|
// First run with the un-mutated input
|
||||||
let unmutated_input = state.current_input_cloned()?;
|
let unmutated_input = state.current_input_cloned()?;
|
||||||
|
|
||||||
if let Some(obs_ref) = &self.cmplog_observer_ref {
|
if let Some(observer_handle) = &self.cmplog_observer_handle {
|
||||||
if let Some(ob) = self.tracer_executor.observers_mut().get_mut(obs_ref) {
|
if let Some(ob) = self
|
||||||
|
.tracer_executor
|
||||||
|
.observers_mut()
|
||||||
|
.get_mut(observer_handle)
|
||||||
|
{
|
||||||
// This is not the original input,
|
// This is not the original input,
|
||||||
// Set it to false
|
// Set it to false
|
||||||
ob.set_original(true);
|
ob.set_original(true);
|
||||||
@ -97,8 +101,12 @@ where
|
|||||||
None => return Err(Error::unknown("No metadata found")),
|
None => return Err(Error::unknown("No metadata found")),
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(obs_ref) = &self.cmplog_observer_ref {
|
if let Some(observer_handle) = &self.cmplog_observer_handle {
|
||||||
if let Some(ob) = self.tracer_executor.observers_mut().get_mut(obs_ref) {
|
if let Some(ob) = self
|
||||||
|
.tracer_executor
|
||||||
|
.observers_mut()
|
||||||
|
.get_mut(observer_handle)
|
||||||
|
{
|
||||||
// This is not the original input,
|
// This is not the original input,
|
||||||
// Set it to false
|
// Set it to false
|
||||||
ob.set_original(false);
|
ob.set_original(false);
|
||||||
@ -142,7 +150,7 @@ where
|
|||||||
/// Creates a new default stage
|
/// Creates a new default stage
|
||||||
pub fn new(tracer_executor: TE) -> Self {
|
pub fn new(tracer_executor: TE) -> Self {
|
||||||
Self {
|
Self {
|
||||||
cmplog_observer_ref: None,
|
cmplog_observer_handle: None,
|
||||||
tracer_executor,
|
tracer_executor,
|
||||||
phantom: PhantomData,
|
phantom: PhantomData,
|
||||||
}
|
}
|
||||||
@ -151,10 +159,10 @@ where
|
|||||||
/// With cmplog observer
|
/// With cmplog observer
|
||||||
pub fn with_cmplog_observer(
|
pub fn with_cmplog_observer(
|
||||||
tracer_executor: TE,
|
tracer_executor: TE,
|
||||||
obs_ref: Handle<AFLppCmpLogObserver<'a, TE::State>>,
|
observer_handle: Handle<AFLppCmpLogObserver<'a, TE::State>>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
cmplog_observer_ref: Some(obs_ref),
|
cmplog_observer_handle: Some(observer_handle),
|
||||||
tracer_executor,
|
tracer_executor,
|
||||||
phantom: PhantomData,
|
phantom: PhantomData,
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user