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 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::{
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;
@ -677,7 +677,7 @@ let run_client = |state: Option<_>, mut mgr, _core_id| {
#[cfg(feature = "singlecore")]
{
let monitor = SimplePrintingMonitor::new();
let monitor = RateLimitedMonitor::new();
#[cfg(not(feature = "restarting"))]
{
let mgr = SimpleEventManager::new(monitor);

View File

@ -4,7 +4,7 @@ use libafl::inputs::BytesInput;
use libafl::inputs::HasTargetBytes;
use libafl::feedbacks::MapIndexesMetadata;
use libafl::corpus::Testcase;
use libafl::prelude::{UsesInput};
use libafl::prelude::{ClientStats, Monitor, SimplePrintingMonitor, UsesInput};
use core::marker::PhantomData;
use libafl::schedulers::{MinimizerScheduler, ProbabilitySamplingScheduler, TestcaseScore};
use std::path::PathBuf;
@ -22,11 +22,12 @@ use libafl_qemu::edges::QemuEdgesMapMetadata;
use libafl::observers::MapObserver;
use serde::{Deserialize, Serialize};
use std::cmp;
use std::time::Duration;
use std::time::Instant;
use std::ops::Sub;
use libafl_bolts::{
Named,
HasLen,
AsSlice,
AsSlice, ClientId, HasLen, Named
};
use libafl::{
observers::Observer,
@ -433,3 +434,60 @@ where
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()
}
}