Extend weighted scheduler (#685)

* extend

* fix

* fmt

* more fix
This commit is contained in:
Dongjia Zhang 2022-06-29 09:43:42 +09:00 committed by GitHub
parent 405a1919b8
commit 66b5fe8678
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 18 deletions

View File

@ -315,10 +315,11 @@ fn fuzz(
5,
)?;
let power = StdMutationalStage::new(mutator);
let power = StdPowerMutationalStage::new(mutator, &edges_observer);
// 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
let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective);

View File

@ -27,7 +27,9 @@ use libafl::{
mutators::scheduled::{havoc_mutations, tokens_mutations, StdScheduledMutator},
mutators::token_mutations::Tokens,
observers::{HitcountsMapObserver, StdMapObserver, TimeObserver},
schedulers::{IndexesLenTimeMinimizerScheduler, StdWeightedScheduler},
schedulers::{
powersched::PowerSchedule, IndexesLenTimeMinimizerScheduler, StdWeightedScheduler,
},
stages::{calibrate::CalibrationStage, power::StdPowerMutationalStage},
state::{HasCorpus, HasMetadata, StdState},
Error,
@ -139,7 +141,8 @@ fn fuzz(corpus_dirs: &[PathBuf], objective_dir: PathBuf, broker_port: u16) -> Re
let mut stages = tuple_list!(calibration, power);
// 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
let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective);

View File

@ -11,7 +11,7 @@ use crate::{
corpus::{Corpus, SchedulerTestcaseMetaData},
inputs::Input,
schedulers::{
powersched::SchedulerMetadata,
powersched::{PowerSchedule, SchedulerMetadata},
testcase_score::{CorpusWeightTestcaseScore, TestcaseScore},
Scheduler,
},
@ -89,20 +89,10 @@ crate::impl_serdeany!(WeightedScheduleMetadata);
/// A corpus scheduler using power schedules with weighted queue item selection algo.
#[derive(Clone, Debug)]
pub struct WeightedScheduler<F, I, S> {
strat: Option<PowerSchedule>,
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>
where
F: TestcaseScore<I, S>,
@ -111,8 +101,9 @@ where
{
/// Create a new [`WeightedScheduler`]
#[must_use]
pub fn new() -> Self {
pub fn new(strat: Option<PowerSchedule>) -> Self {
Self {
strat,
phantom: PhantomData,
}
}
@ -216,7 +207,7 @@ where
/// Add an entry to the corpus and return its index
fn on_add(&self, state: &mut S, idx: usize) -> Result<(), Error> {
if !state.has_metadata::<SchedulerMetadata>() {
state.add_metadata(SchedulerMetadata::new(None));
state.add_metadata(SchedulerMetadata::new(self.strat));
}
if !state.has_metadata::<WeightedScheduleMetadata>() {
@ -294,6 +285,21 @@ where
psmeta.set_queue_cycles(psmeta.queue_cycles() + 1);
}
*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)
}
}