Remove unused stage stub (#882)
* GetDeps Stage * removed getdeps stage
This commit is contained in:
parent
6b6570ae5f
commit
1486c204eb
@ -1,160 +0,0 @@
|
|||||||
//! The tracing stage can trace the target and enrich a testcase with metadata, for example for `CmpLog`.
|
|
||||||
|
|
||||||
use alloc::{
|
|
||||||
string::{String, ToString},
|
|
||||||
vec::Vec,
|
|
||||||
};
|
|
||||||
use core::{fmt::Debug, marker::PhantomData};
|
|
||||||
|
|
||||||
use hashbrown::HashSet;
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
#[cfg(feature = "introspection")]
|
|
||||||
use crate::monitors::PerfFeature;
|
|
||||||
use crate::{
|
|
||||||
bolts::AsSlice,
|
|
||||||
corpus::Corpus,
|
|
||||||
executors::{Executor, HasObservers},
|
|
||||||
feedbacks::map::MapNoveltiesMetadata,
|
|
||||||
inputs::{GeneralizedInput, GeneralizedItem, HasBytesVec},
|
|
||||||
mark_feature_time,
|
|
||||||
observers::{MapObserver, ObserversTuple},
|
|
||||||
stages::Stage,
|
|
||||||
start_timer,
|
|
||||||
state::{HasClientPerfMonitor, HasCorpus, HasExecutions, HasMetadata},
|
|
||||||
Error,
|
|
||||||
};
|
|
||||||
|
|
||||||
const MAX_GENERALIZED_LEN: usize = 8192;
|
|
||||||
|
|
||||||
/// A state metadata holding the set of indexes related to the generalized corpus entries
|
|
||||||
#[derive(Debug, Default, Serialize, Deserialize)]
|
|
||||||
pub struct GeneralizedIndexesMetadata {
|
|
||||||
/// The set of indexes
|
|
||||||
pub indexes: HashSet<usize>,
|
|
||||||
}
|
|
||||||
|
|
||||||
crate::impl_serdeany!(GeneralizedIndexesMetadata);
|
|
||||||
|
|
||||||
impl GeneralizedIndexesMetadata {
|
|
||||||
/// Create the metadata
|
|
||||||
#[must_use]
|
|
||||||
pub fn new() -> Self {
|
|
||||||
Self::default()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn increment_by_offset(_list: &[Option<u8>], idx: usize, off: u8) -> usize {
|
|
||||||
idx + 1 + off as usize
|
|
||||||
}
|
|
||||||
|
|
||||||
fn find_next_char(list: &[Option<u8>], mut idx: usize, ch: u8) -> usize {
|
|
||||||
while idx < list.len() {
|
|
||||||
if list[idx] == Some(ch) {
|
|
||||||
return idx + 1;
|
|
||||||
}
|
|
||||||
idx += 1;
|
|
||||||
}
|
|
||||||
idx
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A stage that runs a tracer executor
|
|
||||||
#[derive(Clone, Debug)]
|
|
||||||
pub struct GetDepsStage<I>
|
|
||||||
where
|
|
||||||
O: MapObserver,
|
|
||||||
OT: ObserversTuple<GeneralizedInput, S>,
|
|
||||||
S: HasClientPerfMonitor + HasExecutions + HasMetadata + HasCorpus<GeneralizedInput>,
|
|
||||||
{
|
|
||||||
map_observer_name: String,
|
|
||||||
#[allow(clippy::type_complexity)]
|
|
||||||
phantom: PhantomData<(EM, O, OT, S, Z)>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<E, EM, O, OT, S, Z> Stage<E, EM, S, Z> for GetDepsStage<EM, O, OT, S, Z>
|
|
||||||
where
|
|
||||||
O: MapObserver,
|
|
||||||
E: Executor<EM, GeneralizedInput, S, Z> + HasObservers<GeneralizedInput, OT, S>,
|
|
||||||
OT: ObserversTuple<GeneralizedInput, S>,
|
|
||||||
S: HasClientPerfMonitor + HasExecutions + HasMetadata + HasCorpus<GeneralizedInput>,
|
|
||||||
{
|
|
||||||
#[inline]
|
|
||||||
#[allow(clippy::too_many_lines)]
|
|
||||||
fn perform(
|
|
||||||
&mut self,
|
|
||||||
fuzzer: &mut Z,
|
|
||||||
executor: &mut E,
|
|
||||||
state: &mut S,
|
|
||||||
manager: &mut EM,
|
|
||||||
corpus_idx: usize,
|
|
||||||
) -> Result<(), Error> {
|
|
||||||
if state
|
|
||||||
.metadata()
|
|
||||||
.get::<GeneralizedIndexesMetadata>()
|
|
||||||
.is_none()
|
|
||||||
{
|
|
||||||
state.add_metadata(GeneralizedIndexesMetadata::new());
|
|
||||||
}
|
|
||||||
|
|
||||||
let (mut payload, original, novelties) = {
|
|
||||||
start_timer!(state);
|
|
||||||
state.corpus().get(corpus_idx)?.borrow_mut().load_input()?;
|
|
||||||
mark_feature_time!(state, PerfFeature::GetInputFromCorpus);
|
|
||||||
let mut entry = state.corpus().get(corpus_idx)?.borrow_mut();
|
|
||||||
let input = entry.input_mut().as_mut().unwrap();
|
|
||||||
|
|
||||||
if input.generalized().is_some() {
|
|
||||||
drop(entry);
|
|
||||||
state
|
|
||||||
.metadata_mut()
|
|
||||||
.get_mut::<GeneralizedIndexesMetadata>()
|
|
||||||
.unwrap()
|
|
||||||
.indexes
|
|
||||||
.insert(corpus_idx);
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
|
|
||||||
let payload: Vec<_> = input.bytes().iter().map(|&x| Some(x)).collect();
|
|
||||||
let original = input.clone();
|
|
||||||
let meta = entry.metadata().get::<MapNoveltiesMetadata>().ok_or_else(|| {
|
|
||||||
Error::key_not_found(format!(
|
|
||||||
"MapNoveltiesMetadata needed for GetDepsStage not found in testcase #{} (check the arguments of MapFeedback::new(...))",
|
|
||||||
corpus_idx
|
|
||||||
))
|
|
||||||
})?;
|
|
||||||
(payload, original, meta.as_slice().to_vec())
|
|
||||||
};
|
|
||||||
|
|
||||||
// Do not generalized unstable inputs
|
|
||||||
if !self.verify_input(fuzzer, executor, state, manager, &novelties, &original)? {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<EM, O, OT, S, Z> GetDepsStage<EM, O, OT, S, Z>
|
|
||||||
where
|
|
||||||
O: MapObserver,
|
|
||||||
OT: ObserversTuple<GeneralizedInput, S>,
|
|
||||||
S: HasClientPerfMonitor + HasExecutions + HasMetadata + HasCorpus<GeneralizedInput>,
|
|
||||||
{
|
|
||||||
/// Create a new [`GetDepsStage`].
|
|
||||||
#[must_use]
|
|
||||||
pub fn new(map_observer: &O) -> Self {
|
|
||||||
Self {
|
|
||||||
map_observer_name: map_observer.name().to_string(),
|
|
||||||
phantom: PhantomData,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new [`GetDepsStage`] from name
|
|
||||||
#[must_use]
|
|
||||||
pub fn from_name(map_observer_name: &str) -> Self {
|
|
||||||
Self {
|
|
||||||
map_observer_name: map_observer_name.to_string(),
|
|
||||||
phantom: PhantomData,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user