From eeaf7eb43f76fe744617e47807081c8cc447380b Mon Sep 17 00:00:00 2001 From: Alwin Berger Date: Wed, 11 Jan 2023 16:09:06 +0100 Subject: [PATCH] exectime increase feedback --- fuzzers/FRET/Cargo.toml | 2 +- fuzzers/FRET/benchmark/Makefile | 4 +- fuzzers/FRET/benchmark/target_symbols.csv | 11 +++-- fuzzers/FRET/fuzzer.sh | 2 +- fuzzers/FRET/src/fuzzer.rs | 8 ++-- fuzzers/FRET/src/worst.rs | 52 +++++++++++++++++++++++ 6 files changed, 69 insertions(+), 10 deletions(-) diff --git a/fuzzers/FRET/Cargo.toml b/fuzzers/FRET/Cargo.toml index d4f946f3dc..62ffbf41c9 100644 --- a/fuzzers/FRET/Cargo.toml +++ b/fuzzers/FRET/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Andrea Fioraldi ", "Dominik Maier (&s).expect("FUZZ_SIZE was not a number"); }; // Hardcoded parameters - let timeout = Duration::from_secs(3); + let timeout = Duration::from_secs(1); let broker_port = 1337; let cores = Cores::from_cmdline("1").unwrap(); let corpus_dirs = [PathBuf::from("./corpus")]; @@ -208,7 +208,9 @@ pub fn fuzz() { MaxMapFeedback::new_tracking(&edges_observer, true, true), // QemuClockIncreaseFeedback::default(), // Time feedback, this one does not need a feedback state - ClockTimeFeedback::new_with_observer(&clock_time_observer) + ClockTimeFeedback::new_with_observer(&clock_time_observer), + // Feedback to reward any input which increses the execution time + ExecTimeIncFeedback::new() ); #[cfg(feature = "systemstate")] let mut feedback = feedback_or!( diff --git a/fuzzers/FRET/src/worst.rs b/fuzzers/FRET/src/worst.rs index 17b467df8c..c16a2b99c5 100644 --- a/fuzzers/FRET/src/worst.rs +++ b/fuzzers/FRET/src/worst.rs @@ -261,4 +261,56 @@ impl Named for ExecTimeCollectorFeedbackState fn name(&self) -> &str { "ExecTimeCollectorFeedbackState" } +} + +//=================================================================== +/// A Feedback which expects a certain minimum execution time +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct ExecTimeIncFeedback +{ + longest_time: u64, +} + +impl Feedback for ExecTimeIncFeedback +where + S: UsesInput + HasClientPerfMonitor, +{ + #[allow(clippy::wrong_self_convention)] + fn is_interesting( + &mut self, + _state: &mut S, + _manager: &mut EM, + _input: &S::Input, + observers: &OT, + _exit_kind: &ExitKind, + ) -> Result + where + EM: EventFirer, + OT: ObserversTuple, + { + let observer = observers.match_name::("clocktime") + .expect("QemuClockObserver not found"); + if observer.last_runtime() > self.longest_time { + self.longest_time = observer.last_runtime(); + } + Ok(observer.last_runtime() > self.longest_time) + } +} + +impl Named for ExecTimeIncFeedback +{ + #[inline] + fn name(&self) -> &str { + "ExecTimeReachedFeedback" + } +} + +impl ExecTimeIncFeedback +where +{ + /// Creates a new [`ExecTimeReachedFeedback`] + #[must_use] + pub fn new() -> Self { + Self {longest_time: 0} + } } \ No newline at end of file