From 88c5c8a19fbb44204c4a0835fe119b259373e1e9 Mon Sep 17 00:00:00 2001 From: Alwin Berger Date: Mon, 6 May 2024 16:00:11 +0200 Subject: [PATCH] feedback for aggregated traces --- fuzzers/FRET/Cargo.toml | 6 ++++-- fuzzers/FRET/benchmark/Snakefile | 21 ++++++++++++++++----- fuzzers/FRET/src/systemstate/stg.rs | 28 +++++++++++++++++++++++++--- 3 files changed, 45 insertions(+), 10 deletions(-) diff --git a/fuzzers/FRET/Cargo.toml b/fuzzers/FRET/Cargo.toml index b522cc320e..df86886d50 100644 --- a/fuzzers/FRET/Cargo.toml +++ b/fuzzers/FRET/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Andrea Fioraldi ", "Dominik Maier {output[1]} 2>&1 + echo $(pwd)/{input[1]}/debug/fret -n $(pwd)/timedump/{wildcards.fuzzer}/{wildcards.target}#{wildcards.num} -t -a -r -g -k {input[0]} -c ./target_symbols.csv fuzz -t {RUNTIME} -s {wildcards.num} + $(pwd)/{input[1]}/debug/fret -n $(pwd)/timedump/{wildcards.fuzzer}/{wildcards.target}#{wildcards.num} -t -a -r -g -k {input[0]} -c ./target_symbols.csv fuzz -t {RUNTIME} -s {wildcards.num} > {output[1]} 2>&1 exit 0 """ if wildcards.fuzzer.find('random') >= 0: @@ -259,6 +266,10 @@ rule clusterfuzz: expand("timedump/{fuzzer}/{target}.{num}", fuzzer=['afl','frafl','feedlongest'], target=['waters','watersv2'],num=MY_RANGE_B), expand("timedump/{fuzzer}/{target}.{num}", fuzzer=['afl_int','frafl_int','feedlongest_int'], target=['waters_int','watersv2_int'],num=MY_RANGE_B), +rule all_new: + input: + expand("timedump/{fuzzer}/{target}#{num}.time", fuzzer=['feedgeneration100', 'frafl', 'state', 'stg'], target=['waters', 'watersv2'],num=range(0,3)) + rule all_bins: input: expand("bins/target_{target}{flag}",target=['random','afl','frafl','state','feedgeneration100'],flag=['','_int']) \ No newline at end of file diff --git a/fuzzers/FRET/src/systemstate/stg.rs b/fuzzers/FRET/src/systemstate/stg.rs index a769c53043..28528a46f8 100644 --- a/fuzzers/FRET/src/systemstate/stg.rs +++ b/fuzzers/FRET/src/systemstate/stg.rs @@ -86,10 +86,13 @@ impl PartialEq for STGNode { #[derive(Debug, Serialize, Deserialize, SerdeAny, Clone)] pub struct STGFeedbackState { + // aggregated traces as a graph pub graph: DiGraph, index: HashMap, entrypoint: NodeIndex, exit: NodeIndex, + // Metadata about aggregated traces. aggegated meaning, order has been removed + worst_observed_per_aggegated_path: HashMap,u64> } impl Default for STGFeedbackState { @@ -112,7 +115,8 @@ impl Default for STGFeedbackState { graph, index, entrypoint, - exit + exit, + worst_observed_per_aggegated_path: HashMap::new(), } } } @@ -142,6 +146,7 @@ pub struct StgFeedback } const INTEREST_EDGE : bool = true; const INTEREST_NODE : bool = true; +const INTEREST_AGGREGATE : bool = true; fn set_observer_map(trace : &Vec) { unsafe { for i in 0..MAX_STG_NUM { @@ -238,6 +243,8 @@ where { let observer = observers.match_name::("systemstate") .expect("QemuSystemStateObserver not found"); + let clock_observer = observers.match_name::("clocktime") + .expect("QemuClockObserver not found"); let feedbackstate = match state .named_metadata_map_mut() .get_mut::("stgfeedbackstate") { @@ -251,14 +258,29 @@ where let abbs = trace_to_state_abb(&observer.last_run); // println!("{:?}",abbs); - let (trace, _, new_edge) = StgFeedback::update_stg(&observer.last_run, abbs, feedbackstate); + let (trace, _, mut interesting) = StgFeedback::update_stg(&observer.last_run, abbs, feedbackstate); + if INTEREST_AGGREGATE { + // aggegation by sorting, order of states is not relevant + let mut tmp = trace.clone(); + tmp.sort(); + if let Some(x) = feedbackstate.worst_observed_per_aggegated_path.get_mut(&tmp) { + let t = clock_observer.last_runtime(); + if t > *x { + *x = t; + interesting |= true; + } + } else { + feedbackstate.worst_observed_per_aggegated_path.insert(tmp, clock_observer.last_runtime()); + interesting |= true; + } + } // let out = feedbackstate.graph.map(|i,x| x.pretty_print(), |_,_| ""); // let outs = Dot::with_config(&out, &[Config::EdgeNoLabel]).to_string(); // let outs = outs.replace(';',"\\n"); // fs::write("./mystg.dot",outs).expect("Failed to write graph"); - Ok(false) + Ok(interesting) } /// Append to the testcase the generated metadata in case of a new corpus item