parent
405a1919b8
commit
66b5fe8678
@ -315,10 +315,11 @@ fn fuzz(
|
|||||||
5,
|
5,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let power = StdMutationalStage::new(mutator);
|
let power = StdPowerMutationalStage::new(mutator, &edges_observer);
|
||||||
|
|
||||||
// A minimization+queue policy to get testcasess from the corpus
|
// A minimization+queue policy to get testcasess from the corpus
|
||||||
let scheduler = IndexesLenTimeMinimizerScheduler::new(StdWeightedScheduler::new());
|
let scheduler =
|
||||||
|
IndexesLenTimeMinimizerScheduler::new(StdWeightedScheduler::new(Some(PowerSchedule::FAST)));
|
||||||
|
|
||||||
// A fuzzer with feedbacks and a corpus scheduler
|
// A fuzzer with feedbacks and a corpus scheduler
|
||||||
let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective);
|
let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective);
|
||||||
|
@ -27,7 +27,9 @@ use libafl::{
|
|||||||
mutators::scheduled::{havoc_mutations, tokens_mutations, StdScheduledMutator},
|
mutators::scheduled::{havoc_mutations, tokens_mutations, StdScheduledMutator},
|
||||||
mutators::token_mutations::Tokens,
|
mutators::token_mutations::Tokens,
|
||||||
observers::{HitcountsMapObserver, StdMapObserver, TimeObserver},
|
observers::{HitcountsMapObserver, StdMapObserver, TimeObserver},
|
||||||
schedulers::{IndexesLenTimeMinimizerScheduler, StdWeightedScheduler},
|
schedulers::{
|
||||||
|
powersched::PowerSchedule, IndexesLenTimeMinimizerScheduler, StdWeightedScheduler,
|
||||||
|
},
|
||||||
stages::{calibrate::CalibrationStage, power::StdPowerMutationalStage},
|
stages::{calibrate::CalibrationStage, power::StdPowerMutationalStage},
|
||||||
state::{HasCorpus, HasMetadata, StdState},
|
state::{HasCorpus, HasMetadata, StdState},
|
||||||
Error,
|
Error,
|
||||||
@ -139,7 +141,8 @@ fn fuzz(corpus_dirs: &[PathBuf], objective_dir: PathBuf, broker_port: u16) -> Re
|
|||||||
let mut stages = tuple_list!(calibration, power);
|
let mut stages = tuple_list!(calibration, power);
|
||||||
|
|
||||||
// A minimization+queue policy to get testcasess from the corpus
|
// A minimization+queue policy to get testcasess from the corpus
|
||||||
let scheduler = IndexesLenTimeMinimizerScheduler::new(StdWeightedScheduler::new());
|
let scheduler =
|
||||||
|
IndexesLenTimeMinimizerScheduler::new(StdWeightedScheduler::new(Some(PowerSchedule::FAST)));
|
||||||
|
|
||||||
// A fuzzer with feedbacks and a corpus scheduler
|
// A fuzzer with feedbacks and a corpus scheduler
|
||||||
let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective);
|
let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective);
|
||||||
|
@ -11,7 +11,7 @@ use crate::{
|
|||||||
corpus::{Corpus, SchedulerTestcaseMetaData},
|
corpus::{Corpus, SchedulerTestcaseMetaData},
|
||||||
inputs::Input,
|
inputs::Input,
|
||||||
schedulers::{
|
schedulers::{
|
||||||
powersched::SchedulerMetadata,
|
powersched::{PowerSchedule, SchedulerMetadata},
|
||||||
testcase_score::{CorpusWeightTestcaseScore, TestcaseScore},
|
testcase_score::{CorpusWeightTestcaseScore, TestcaseScore},
|
||||||
Scheduler,
|
Scheduler,
|
||||||
},
|
},
|
||||||
@ -89,20 +89,10 @@ crate::impl_serdeany!(WeightedScheduleMetadata);
|
|||||||
/// A corpus scheduler using power schedules with weighted queue item selection algo.
|
/// A corpus scheduler using power schedules with weighted queue item selection algo.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct WeightedScheduler<F, I, S> {
|
pub struct WeightedScheduler<F, I, S> {
|
||||||
|
strat: Option<PowerSchedule>,
|
||||||
phantom: PhantomData<(F, I, S)>,
|
phantom: PhantomData<(F, I, S)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F, I, S> Default for WeightedScheduler<F, I, S>
|
|
||||||
where
|
|
||||||
F: TestcaseScore<I, S>,
|
|
||||||
I: Input,
|
|
||||||
S: HasCorpus<I> + HasMetadata + HasRand,
|
|
||||||
{
|
|
||||||
fn default() -> Self {
|
|
||||||
Self::new()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<F, I, S> WeightedScheduler<F, I, S>
|
impl<F, I, S> WeightedScheduler<F, I, S>
|
||||||
where
|
where
|
||||||
F: TestcaseScore<I, S>,
|
F: TestcaseScore<I, S>,
|
||||||
@ -111,8 +101,9 @@ where
|
|||||||
{
|
{
|
||||||
/// Create a new [`WeightedScheduler`]
|
/// Create a new [`WeightedScheduler`]
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn new() -> Self {
|
pub fn new(strat: Option<PowerSchedule>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
strat,
|
||||||
phantom: PhantomData,
|
phantom: PhantomData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -216,7 +207,7 @@ where
|
|||||||
/// Add an entry to the corpus and return its index
|
/// Add an entry to the corpus and return its index
|
||||||
fn on_add(&self, state: &mut S, idx: usize) -> Result<(), Error> {
|
fn on_add(&self, state: &mut S, idx: usize) -> Result<(), Error> {
|
||||||
if !state.has_metadata::<SchedulerMetadata>() {
|
if !state.has_metadata::<SchedulerMetadata>() {
|
||||||
state.add_metadata(SchedulerMetadata::new(None));
|
state.add_metadata(SchedulerMetadata::new(self.strat));
|
||||||
}
|
}
|
||||||
|
|
||||||
if !state.has_metadata::<WeightedScheduleMetadata>() {
|
if !state.has_metadata::<WeightedScheduleMetadata>() {
|
||||||
@ -294,6 +285,21 @@ where
|
|||||||
psmeta.set_queue_cycles(psmeta.queue_cycles() + 1);
|
psmeta.set_queue_cycles(psmeta.queue_cycles() + 1);
|
||||||
}
|
}
|
||||||
*state.corpus_mut().current_mut() = Some(idx);
|
*state.corpus_mut().current_mut() = Some(idx);
|
||||||
|
|
||||||
|
// Update the handicap
|
||||||
|
let mut testcase = state.corpus().get(idx)?.borrow_mut();
|
||||||
|
let tcmeta = testcase
|
||||||
|
.metadata_mut()
|
||||||
|
.get_mut::<SchedulerTestcaseMetaData>()
|
||||||
|
.ok_or_else(|| {
|
||||||
|
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
|
||||||
|
})?;
|
||||||
|
|
||||||
|
if tcmeta.handicap() >= 4 {
|
||||||
|
tcmeta.set_handicap(tcmeta.handicap() - 4);
|
||||||
|
} else if tcmeta.handicap() > 0 {
|
||||||
|
tcmeta.set_handicap(tcmeta.handicap() - 1);
|
||||||
|
}
|
||||||
Ok(idx)
|
Ok(idx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user