rate-limit testcase printing
This commit is contained in:
parent
e6ec643781
commit
ab6026535c
@ -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);
|
||||||
|
@ -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,
|
||||||
@ -433,3 +434,60 @@ where
|
|||||||
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()
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user