diff --git a/fuzzers/wcet_qemu_sys/src/lib.rs b/fuzzers/wcet_qemu_sys/src/lib.rs index 5c4c7d64f1..ab85cf7d2e 100644 --- a/fuzzers/wcet_qemu_sys/src/lib.rs +++ b/fuzzers/wcet_qemu_sys/src/lib.rs @@ -1,4 +1,5 @@ #![feature(iter_advance_by)] +#![feature(is_sorted)] #[cfg(target_os = "linux")] pub mod worst; pub mod freertos; diff --git a/fuzzers/wcet_qemu_sys/src/worst.rs b/fuzzers/wcet_qemu_sys/src/worst.rs index af77b67415..e7ef49345b 100644 --- a/fuzzers/wcet_qemu_sys/src/worst.rs +++ b/fuzzers/wcet_qemu_sys/src/worst.rs @@ -1,3 +1,6 @@ +use core::cmp::Ordering::{Greater,Less,Equal}; +use libafl::inputs::BytesInput; +use libafl::inputs::HasTargetBytes; use libafl::feedbacks::MapIndexesMetadata; use libafl::corpus::Testcase; use libafl::corpus::FavFactor; @@ -189,7 +192,7 @@ where let mean_sum_of_squares = (sum_of_square_difference as f64) / (self.target_map.len() as f64); let hit_target = mean_sum_of_squares <= self.target_msd; if hit_target { - #[cfg(debug_assertions)] eprintln!("Hit Feedback trigger"); + // #[cfg(debug_assertions)] eprintln!("Hit Feedback trigger"); Ok(true) } else { Ok(false) @@ -317,7 +320,7 @@ where let mean_sum_of_squares = (sum_of_square_difference as f64) / (self.target_map.len() as f64); let hit_target = mean_sum_of_squares < self.best_msd; if hit_target { - #[cfg(debug_assertions)] eprintln!("Hit Improving: {}",mean_sum_of_squares); + // #[cfg(debug_assertions)] eprintln!("Hit Improving: {}",mean_sum_of_squares); self.best_msd = mean_sum_of_squares; Ok(true) } else { @@ -432,7 +435,7 @@ where EM: EventFirer, OT: ObserversTuple, { - eprintln!("Input was: {:?}",_input); + // eprintln!("Input was: {:?}",_input); Ok(self.response) } } @@ -506,4 +509,62 @@ where let execs_times_length_per_hour = execs_per_hour*entry.cached_len()? as u64; Ok(execs_times_length_per_hour) } -} \ No newline at end of file +} + +/// A Feedback reporting if the Input consists of strictly decreasing bytes. +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct SortedFeedback { +} + +impl Feedback for SortedFeedback +where + S: HasClientPerfMonitor, +{ + fn is_interesting( + &mut self, + _state: &mut S, + _manager: &mut EM, + _input: &BytesInput, + _observers: &OT, + _exit_kind: &ExitKind, + ) -> Result + where + EM: EventFirer, + OT: ObserversTuple, + { + let t = _input.target_bytes(); + let tmp = t.as_slice(); + if tmp.len()<32 {return Ok(false);} + let tmp = Vec::::from(&tmp[0..32]); + // tmp.reverse(); + if tmp.is_sorted_by(|a,b| match a.partial_cmp(b).unwrap_or(Less) { + Less => Some(Greater), + Equal => Some(Greater), + Greater => Some(Less), + }) {return Ok(true)}; + return Ok(false); + } +} + +impl Named for SortedFeedback { + #[inline] + fn name(&self) -> &str { + "Sorted" + } +} + +impl SortedFeedback { + /// Creates a new [`HitFeedback`] + #[must_use] + pub fn new() -> Self { + Self {} + } +} + +impl Default for SortedFeedback { + fn default() -> Self { + Self::new() + } +} + +//=================================================================== \ No newline at end of file