diff --git a/fuzzers/FRET/src/clock.rs b/fuzzers/FRET/src/clock.rs index 28e10771e7..c5ce7110e2 100644 --- a/fuzzers/FRET/src/clock.rs +++ b/fuzzers/FRET/src/clock.rs @@ -14,7 +14,7 @@ use libafl::{ observers::ObserversTuple, prelude::UsesInput, impl_serdeany, }; use serde::{Deserialize, Serialize}; -use std::{cell::UnsafeCell, cmp::max, env, fs::OpenOptions, io::Write}; +use std::{cell::UnsafeCell, cmp::max, env, fs::OpenOptions, io::Write, time::Instant}; use libafl::bolts::tuples::Named; use libafl_qemu::{ @@ -36,6 +36,8 @@ use core::{fmt::Debug, time::Duration}; use libafl::bolts::tuples::MatchName; use std::time::{SystemTime, UNIX_EPOCH}; +pub static mut FUZZ_START_TIMESTAMP : SystemTime = UNIX_EPOCH; + //========== Metadata #[derive(Debug, SerdeAny, Serialize, Deserialize)] pub struct QemuIcountMetadata { @@ -138,15 +140,16 @@ where // println!("Number of Ticks: {} <- {} {}",self.end_tick - self.start_tick, self.end_tick, self.start_tick); let metadata =_state.metadata_mut(); let hist = metadata.get_mut::(); + let timestamp = SystemTime::now().duration_since(unsafe {FUZZ_START_TIMESTAMP}).unwrap().as_millis(); match hist { None => { - metadata.insert(IcHist(vec![(self.end_tick - self.start_tick, SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis())], - (self.end_tick - self.start_tick, SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis()))); + metadata.insert(IcHist(vec![(self.end_tick - self.start_tick, timestamp)], + (self.end_tick - self.start_tick, timestamp))); } Some(v) => { - v.0.push((self.end_tick - self.start_tick, SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis())); + v.0.push((self.end_tick - self.start_tick, timestamp)); if (v.1.0 < self.end_tick-self.start_tick) { - v.1 = (self.end_tick - self.start_tick, SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis()); + v.1 = (self.end_tick - self.start_tick, timestamp); } if v.0.len() >= 100 { if let Ok(td) = env::var("TIME_DUMP") { diff --git a/fuzzers/FRET/src/fuzzer.rs b/fuzzers/FRET/src/fuzzer.rs index 3b3b059896..bac563b3f6 100644 --- a/fuzzers/FRET/src/fuzzer.rs +++ b/fuzzers/FRET/src/fuzzer.rs @@ -35,7 +35,7 @@ use libafl_qemu::{ }; use rand::{SeedableRng, StdRng, Rng}; use crate::{ - clock::{QemuClockObserver, ClockTimeFeedback, QemuClockIncreaseFeedback, IcHist}, + clock::{QemuClockObserver, ClockTimeFeedback, QemuClockIncreaseFeedback, IcHist, FUZZ_START_TIMESTAMP}, qemustate::QemuStateRestoreHelper, systemstate::{mutators::{MINIMUM_INTER_ARRIVAL_TIME}, helpers::QemuSystemStateHelper, observers::QemuSystemStateObserver, feedbacks::{DumpSystraceFeedback, NovelSystemStateFeedback}, graph::{SysMapFeedback, SysGraphFeedbackState, GraphMaximizerCorpusScheduler}, schedulers::{LongestTraceScheduler, GenerationScheduler}}, worst::{TimeMaximizerCorpusScheduler, ExecTimeIncFeedback, TimeStateMaximizerCorpusScheduler, AlwaysTrueFeedback}, mutational::MyStateStage, @@ -68,7 +68,8 @@ extern "C" { } pub fn fuzz() { - let starttime = std::time::Instant::now(); + unsafe {FUZZ_START_TIMESTAMP = SystemTime::now();} + let mut starttime = std::time::Instant::now(); if let Ok(s) = env::var("FUZZ_SIZE") { str::parse::(&s).expect("FUZZ_SIZE was not a number"); }; @@ -515,9 +516,10 @@ pub fn fuzz() { } println!("Start running until saturation"); let mut last = state.metadata().get::().unwrap().1; - while SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis() < last.1 + Duration::from_secs(10800).as_millis() { + while SystemTime::now().duration_since(unsafe {FUZZ_START_TIMESTAMP}).unwrap().as_millis() < last.1 + Duration::from_secs(10800).as_millis() { + starttime=starttime.checked_add(Duration::from_secs(30)).unwrap(); fuzzer - .fuzz_loop_until(&mut stages, &mut executor, &mut state, &mut mgr, starttime.checked_add(Duration::from_secs(5)).unwrap()) + .fuzz_loop_until(&mut stages, &mut executor, &mut state, &mut mgr, starttime) .unwrap(); let after = state.metadata().get::().unwrap().1; if after.0 > last.0 {