rate-limit testcase printing

This commit is contained in:
Alwin Berger 2024-11-08 11:05:36 +01:00
parent e6ec643781
commit ab6026535c
2 changed files with 64 additions and 6 deletions

View File

@ -16,7 +16,7 @@ edges::{self, edges_map_mut_ptr, QemuEdgeCoverageHelper, MAX_EDGES_FOUND}, elf::
use rand::{SeedableRng, StdRng, Rng}; use rand::{SeedableRng, StdRng, Rng};
use crate::{ use crate::{
systemstate::{self, feedbacks::{DumpSystraceFeedback, SystraceErrorFeedback}, helpers::{get_function_range, load_symbol, try_load_symbol, QemuSystemStateHelper}, mutational::{input_bytes_to_interrupt_times, InterruptShiftStage, STGSnippetStage}, observers::QemuSystemStateObserver, schedulers::{GenerationScheduler, LongestTraceScheduler}, stg::{stg_map_mut_slice, GraphMaximizerCorpusScheduler, STGEdge, STGNode, StgFeedback, MAX_STG_NUM}}, time::{ systemstate::{self, feedbacks::{DumpSystraceFeedback, SystraceErrorFeedback}, helpers::{get_function_range, load_symbol, try_load_symbol, QemuSystemStateHelper}, mutational::{input_bytes_to_interrupt_times, InterruptShiftStage, STGSnippetStage}, observers::QemuSystemStateObserver, schedulers::{GenerationScheduler, LongestTraceScheduler}, stg::{stg_map_mut_slice, GraphMaximizerCorpusScheduler, STGEdge, STGNode, StgFeedback, MAX_STG_NUM}}, time::{
clock::{ClockTimeFeedback, IcHist, QemuClockIncreaseFeedback, QemuClockObserver, FUZZ_START_TIMESTAMP, QEMU_ICOUNT_SHIFT, QEMU_ISNS_PER_USEC}, qemustate::QemuStateRestoreHelper, worst::{AlwaysTrueFeedback, ExecTimeIncFeedback, TimeMaximizerCorpusScheduler, TimeProbMassScheduler, TimeStateMaximizerCorpusScheduler} clock::{ClockTimeFeedback, IcHist, QemuClockIncreaseFeedback, QemuClockObserver, FUZZ_START_TIMESTAMP, QEMU_ICOUNT_SHIFT, QEMU_ISNS_PER_USEC}, qemustate::QemuStateRestoreHelper, worst::{AlwaysTrueFeedback, ExecTimeIncFeedback, RateLimitedMonitor, TimeMaximizerCorpusScheduler, TimeProbMassScheduler, TimeStateMaximizerCorpusScheduler}
} }
}; };
use std::time::SystemTime; use std::time::SystemTime;
@ -677,7 +677,7 @@ let run_client = |state: Option<_>, mut mgr, _core_id| {
#[cfg(feature = "singlecore")] #[cfg(feature = "singlecore")]
{ {
let monitor = SimplePrintingMonitor::new(); let monitor = RateLimitedMonitor::new();
#[cfg(not(feature = "restarting"))] #[cfg(not(feature = "restarting"))]
{ {
let mgr = SimpleEventManager::new(monitor); let mgr = SimpleEventManager::new(monitor);

View File

@ -4,7 +4,7 @@ use libafl::inputs::BytesInput;
use libafl::inputs::HasTargetBytes; use libafl::inputs::HasTargetBytes;
use libafl::feedbacks::MapIndexesMetadata; use libafl::feedbacks::MapIndexesMetadata;
use libafl::corpus::Testcase; use libafl::corpus::Testcase;
use libafl::prelude::{UsesInput}; use libafl::prelude::{ClientStats, Monitor, SimplePrintingMonitor, UsesInput};
use core::marker::PhantomData; use core::marker::PhantomData;
use libafl::schedulers::{MinimizerScheduler, ProbabilitySamplingScheduler, TestcaseScore}; use libafl::schedulers::{MinimizerScheduler, ProbabilitySamplingScheduler, TestcaseScore};
use std::path::PathBuf; use std::path::PathBuf;
@ -22,11 +22,12 @@ use libafl_qemu::edges::QemuEdgesMapMetadata;
use libafl::observers::MapObserver; use libafl::observers::MapObserver;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::cmp; use std::cmp;
use std::time::Duration;
use std::time::Instant;
use std::ops::Sub;
use libafl_bolts::{ use libafl_bolts::{
Named, AsSlice, ClientId, HasLen, Named
HasLen,
AsSlice,
}; };
use libafl::{ use libafl::{
observers::Observer, observers::Observer,
@ -432,4 +433,61 @@ where
let tns : i64 = et.as_nanos().try_into().expect("failed to convert time"); let tns : i64 = et.as_nanos().try_into().expect("failed to convert time");
Ok(((tns as f64)/1000.0).powf(2.0)) //microseconds Ok(((tns as f64)/1000.0).powf(2.0)) //microseconds
} }
}
/// Monitor that prints with a limited rate.
#[derive(Debug, Clone)]
pub struct RateLimitedMonitor {
inner: SimplePrintingMonitor,
last: Instant,
}
impl Monitor for RateLimitedMonitor {
/// The client monitor, mutable
fn client_stats_mut(&mut self) -> &mut Vec<ClientStats> {
self.inner.client_stats_mut()
}
/// The client monitor
fn client_stats(&self) -> &[ClientStats] {
self.inner.client_stats()
}
/// Time this fuzzing run stated
fn start_time(&self) -> Duration {
self.inner.start_time()
}
/// Time this fuzzing run stated
fn set_start_time(&mut self, time: Duration) {
self.inner.set_start_time(time);
}
#[inline]
fn display(&mut self, event_msg: &str, sender_id: ClientId) {
let now = Instant::now();
const RATE : Duration = Duration::from_secs(5);
if event_msg!="Testcase" || now.duration_since(self.last) > RATE {
self.inner.display(event_msg, sender_id);
self.last = now;
}
}
}
impl RateLimitedMonitor {
/// Create new [`NopMonitor`]
#[must_use]
pub fn new() -> Self {
Self {
inner: SimplePrintingMonitor::new(),
last: Instant::now().sub(Duration::from_secs(7200)),
}
}
}
impl Default for RateLimitedMonitor {
fn default() -> Self {
Self::new()
}
} }