exectime increase feedback

This commit is contained in:
Alwin Berger 2023-01-11 16:09:06 +01:00
parent 68c4887dad
commit eeaf7eb43f
6 changed files with 69 additions and 10 deletions

View File

@ -5,7 +5,7 @@ authors = ["Andrea Fioraldi <andreafioraldi@gmail.com>", "Dominik Maier <domenuk
edition = "2021" edition = "2021"
[features] [features]
default = ["std", "snapshot_fast", "singlecore"] default = ["std", "snapshot_restore", "singlecore"]
std = [] std = []
snapshot_restore = [] snapshot_restore = []
snapshot_fast = [ "snapshot_restore" ] snapshot_fast = [ "snapshot_restore" ]

View File

@ -1,4 +1,4 @@
TIME=7200 TIME=3600
corpora/%/seed: corpora/%/seed:
mkdir -p $$(dirname $@) mkdir -p $$(dirname $@)
@ -28,5 +28,7 @@ timedump/%$(FUZZ_RANDOM): corpora/%/seed
all_sequential: timedump/sequential/mpeg2$(FUZZ_RANDOM) timedump/sequential/dijkstra$(FUZZ_RANDOM) timedump/sequential/epic$(FUZZ_RANDOM) all_sequential: timedump/sequential/mpeg2$(FUZZ_RANDOM) timedump/sequential/dijkstra$(FUZZ_RANDOM) timedump/sequential/epic$(FUZZ_RANDOM)
all_kernel: timedump/kernel/bsort$(FUZZ_RANDOM) timedump/kernel/insertsort$(FUZZ_RANDOM) # timedump/kernel/fft$(FUZZ_RANDOM)
clean: clean:
rm -rf corpora timedump rm -rf corpora timedump

View File

@ -1,5 +1,8 @@
kernel,main_function,input_symbol,input_size,return_function kernel,main_function,input_symbol,input_size,return_function
mpeg2,main,mpeg2_oldorgframe,90112,mpeg2_return mpeg2,mpeg2_main,mpeg2_oldorgframe,90112,mpeg2_return
audiobeam,main,audiobeam_input,11520,audiobeam_return audiobeam,audiobeam_main,audiobeam_input,11520,audiobeam_return
epic,main,epic_image,4096,epic_return epic,epic_main,epic_image,4096,epic_return
dijkstra,main,dijkstra_AdjMatrix,10000,dijkstra_return dijkstra,dijkstra_main,dijkstra_AdjMatrix,10000,dijkstra_return
fft,fft_main,fft_twidtable,2046,fft_return
bsort,bsort_main,bsort_Array,400,bsort_return
insertsort,insertsort_main,insertsort_a,44,insertsort_return
1 kernel main_function input_symbol input_size return_function
2 mpeg2 main mpeg2_main mpeg2_oldorgframe 90112 mpeg2_return
3 audiobeam main audiobeam_main audiobeam_input 11520 audiobeam_return
4 epic main epic_main epic_image 4096 epic_return
5 dijkstra main dijkstra_main dijkstra_AdjMatrix 10000 dijkstra_return
6 fft fft_main fft_twidtable 2046 fft_return
7 bsort bsort_main bsort_Array 400 bsort_return
8 insertsort insertsort_main insertsort_a 44 insertsort_return

View File

@ -13,4 +13,4 @@ cd "$parent_path"
[ -n "$9" -a "$9" != "+" -a -z "$SHOWMAP_TEXTINPUT" ] && export SHOWMAP_TEXTINPUT="$9" [ -n "$9" -a "$9" != "+" -a -z "$SHOWMAP_TEXTINPUT" ] && export SHOWMAP_TEXTINPUT="$9"
[ -z "$FUZZER" ] && export FUZZER=target/debug/fret [ -z "$FUZZER" ] && export FUZZER=target/debug/fret
$FUZZER -icount shift=3,align=off,sleep=off -machine mps2-an385 -monitor null -kernel $KERNEL -serial null -nographic -S -semihosting --semihosting-config enable=on,target=native # -snapshot -drive if=none,format=qcow2,file=dummy.qcow2 $FUZZER -icount shift=3,align=off,sleep=off -machine mps2-an385 -monitor null -kernel $KERNEL -serial null -nographic -S -semihosting --semihosting-config enable=on,target=native -snapshot -drive if=none,format=qcow2,file=dummy.qcow2

View File

@ -37,7 +37,7 @@ use libafl_qemu::{
use crate::{ use crate::{
clock::{QemuClockObserver, ClockTimeFeedback, QemuClockIncreaseFeedback, ICOUNT_HISTORY}, clock::{QemuClockObserver, ClockTimeFeedback, QemuClockIncreaseFeedback, ICOUNT_HISTORY},
qemustate::QemuStateRestoreHelper, qemustate::QemuStateRestoreHelper,
systemstate::{helpers::QemuSystemStateHelper, observers::QemuSystemStateObserver, feedbacks::DumpSystraceFeedback}, worst::TimeMaximizerCorpusScheduler, systemstate::{helpers::QemuSystemStateHelper, observers::QemuSystemStateObserver, feedbacks::DumpSystraceFeedback}, worst::{TimeMaximizerCorpusScheduler, ExecTimeIncFeedback},
}; };
pub static mut MAX_INPUT_SIZE: usize = 32; pub static mut MAX_INPUT_SIZE: usize = 32;
@ -63,7 +63,7 @@ pub fn fuzz() {
str::parse::<usize>(&s).expect("FUZZ_SIZE was not a number"); str::parse::<usize>(&s).expect("FUZZ_SIZE was not a number");
}; };
// Hardcoded parameters // Hardcoded parameters
let timeout = Duration::from_secs(3); let timeout = Duration::from_secs(1);
let broker_port = 1337; let broker_port = 1337;
let cores = Cores::from_cmdline("1").unwrap(); let cores = Cores::from_cmdline("1").unwrap();
let corpus_dirs = [PathBuf::from("./corpus")]; let corpus_dirs = [PathBuf::from("./corpus")];
@ -208,7 +208,9 @@ pub fn fuzz() {
MaxMapFeedback::new_tracking(&edges_observer, true, true), MaxMapFeedback::new_tracking(&edges_observer, true, true),
// QemuClockIncreaseFeedback::default(), // QemuClockIncreaseFeedback::default(),
// Time feedback, this one does not need a feedback state // 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")] #[cfg(feature = "systemstate")]
let mut feedback = feedback_or!( let mut feedback = feedback_or!(

View File

@ -262,3 +262,55 @@ impl Named for ExecTimeCollectorFeedbackState
"ExecTimeCollectorFeedbackState" "ExecTimeCollectorFeedbackState"
} }
} }
//===================================================================
/// A Feedback which expects a certain minimum execution time
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct ExecTimeIncFeedback
{
longest_time: u64,
}
impl<S> Feedback<S> for ExecTimeIncFeedback
where
S: UsesInput + HasClientPerfMonitor,
{
#[allow(clippy::wrong_self_convention)]
fn is_interesting<EM, OT>(
&mut self,
_state: &mut S,
_manager: &mut EM,
_input: &S::Input,
observers: &OT,
_exit_kind: &ExitKind,
) -> Result<bool, Error>
where
EM: EventFirer<State = S>,
OT: ObserversTuple<S>,
{
let observer = observers.match_name::<QemuClockObserver>("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}
}
}