Skip to content

Commit

Permalink
Add the feature that AFLStats is computed and reported in AFLStatsStage
Browse files Browse the repository at this point in the history
  • Loading branch information
toseven authored and toseven committed Jul 18, 2023
1 parent 29b1122 commit 4ae8c9b
Show file tree
Hide file tree
Showing 14 changed files with 160 additions and 193 deletions.
4 changes: 2 additions & 2 deletions libafl/src/events/centralized.rs
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ where
impl<E, EM, SP, Z> EventManager<E, Z> for CentralizedEventManager<EM, SP>
where
EM: EventStatsCollector + EventManager<E, Z>,
EM::State: HasClientPerfMonitor + HasExecutions + HasMetadata + HasLastReportTime + HaF,
EM::State: HasClientPerfMonitor + HasExecutions + HasMetadata + HasLastReportTime,
SP: ShMemProvider,
E: HasObservers<State = Self::State> + Executor<Self, Z>,
for<'a> E::Observers: Deserialize<'a>,
Expand Down Expand Up @@ -352,7 +352,7 @@ where
impl<EM, SP> ProgressReporter for CentralizedEventManager<EM, SP>
where
EM: EventStatsCollector + ProgressReporter + HasEventManagerId,
EM::State: HasClientPerfMonitor + HasMetadata + HasExecutions + HasLastReportTime + HasAFLStats,
EM::State: HasClientPerfMonitor + HasMetadata + HasExecutions + HasLastReportTime,
SP: ShMemProvider,
{
}
Expand Down
10 changes: 4 additions & 6 deletions libafl/src/events/llmp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ use crate::{
inputs::{Input, InputConverter, UsesInput},
monitors::Monitor,
observers::ObserversTuple,
state::{HasClientPerfMonitor, HasExecutions, HasLastReportTime, HasMetadata, UsesState,HasAFLStats},
state::{HasClientPerfMonitor, HasExecutions, HasLastReportTime, HasMetadata, UsesState},
Error,
};

Expand Down Expand Up @@ -788,7 +788,7 @@ impl<E, S, SP, Z> EventManager<E, Z> for LlmpEventManager<S, SP>
where
E: HasObservers<State = S> + Executor<Self, Z>,
for<'a> E::Observers: Deserialize<'a>,
S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime + HasAFLStats,
S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime,
SP: ShMemProvider,
Z: EvaluatorObservers<E::Observers, State = S> + ExecutionProcessor<E::Observers, State = S>,
{
Expand All @@ -809,7 +809,7 @@ where

impl<S, SP> ProgressReporter for LlmpEventManager<S, SP>
where
S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime+ HasAFLStats,
S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime,
SP: ShMemProvider,
{
}
Expand Down Expand Up @@ -900,8 +900,7 @@ where
+ HasClientPerfMonitor
+ HasMetadata
+ HasLastReportTime
+ Serialize
+ HasAFLStats,
+ Serialize,
SP: ShMemProvider,
{
}
Expand Down Expand Up @@ -990,7 +989,6 @@ where
+ HasClientPerfMonitor
+ HasMetadata
+ HasLastReportTime
+ HasAFLStats
+ Serialize,
SP: ShMemProvider + 'static,
Z: EvaluatorObservers<E::Observers, State = S> + ExecutionProcessor<E::Observers>, //CE: CustomEvent<I>,
Expand Down
81 changes: 7 additions & 74 deletions libafl/src/events/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,7 @@ pub use centralized::*;
pub mod llmp;
#[cfg(feature = "tcp_manager")]
pub mod tcp;
use alloc::{
boxed::Box,
string::{String, ToString},
vec::Vec,
};
use alloc::{boxed::Box, string::String, vec::Vec};
#[cfg(all(unix, feature = "std"))]
use core::ffi::c_void;
use core::{
Expand All @@ -38,7 +34,7 @@ use crate::{
inputs::Input,
monitors::UserStats,
observers::ObserversTuple,
state::{HasClientPerfMonitor, HasExecutions, HasLastReportTime, HasMetadata,HasAFLStats},
state::{HasClientPerfMonitor, HasExecutions, HasLastReportTime, HasMetadata},
Error,
};

Expand Down Expand Up @@ -455,7 +451,7 @@ pub trait EventFirer: UsesState {
/// [`ProgressReporter`] report progress to the broker.
pub trait ProgressReporter: EventFirer
where
Self::State: HasClientPerfMonitor + HasMetadata + HasExecutions + HasLastReportTime + HasAFLStats,
Self::State: HasClientPerfMonitor + HasMetadata + HasExecutions + HasLastReportTime,
{
/// Given the last time, if `monitor_timeout` seconds passed, send off an info/monitor/heartbeat message to the broker.
/// Returns the new `last` time (so the old one, unless `monitor_timeout` time has passed and monitor have been sent)
Expand All @@ -464,7 +460,7 @@ where
&mut self,
state: &mut Self::State,
monitor_timeout: Duration,
) -> Result<Duration, Error> {
) -> Result<(), Error> {
let Some(last_report_time) = state.last_report_time() else {
// this is the first time we execute, no need to report progress just yet.
*state.last_report_time_mut() = Some(current_time());
Expand All @@ -485,13 +481,6 @@ where
let executions = *state.executions();
let cur = current_time();

let executions = *state.executions();
let pending_size = *state.pending();
let pend_favored_size = *state.pend_favored();
let own_finds_size = *state.own_finds();
let imported_size = *state.imported();


// Default no introspection implmentation
#[cfg(not(feature = "introspection"))]
self.fire(
Expand Down Expand Up @@ -521,62 +510,6 @@ where
phantom: PhantomData,
},
)?;

self.fire(
state,
Event::UpdateUserStats {
name: "pending".to_string(),
value: UserStats::Number(pending_size as u64),
phantom: PhantomData,
},
)?;

self.fire(
state,
Event::UpdateUserStats {
name: "pend_fav".to_string(),
value: UserStats::Number(pend_favored_size as u64),
phantom: PhantomData,
},
)?;

self.fire(
state,
Event::UpdateUserStats {
name: "own_finds".to_string(),
value: UserStats::Number(own_finds_size as u64),
phantom: PhantomData,
},
)?;

self.fire(
state,
Event::UpdateUserStats {
name: "imported".to_string(),
value: UserStats::Number(imported_size as u64),
phantom: PhantomData,
},
)?;

// If performance monitor are requested, fire the `UpdatePerfMonitor` event
#[cfg(feature = "introspection")]
{
state
.introspection_monitor_mut()
.set_current_time(crate::bolts::cpu::read_time_counter());

// Send the current monitor over to the manager. This `.clone` shouldn't be
// costly as `ClientPerfMonitor` impls `Copy` since it only contains `u64`s
self.fire(
state,
Event::UpdatePerfMonitor {
executions,
time: cur,
introspection_monitor: Box::new(state.introspection_monitor().clone()),
phantom: PhantomData,
},
)?;
}
}

*state.last_report_time_mut() = Some(cur);
Expand Down Expand Up @@ -629,7 +562,7 @@ pub trait HasEventManagerId {
pub trait EventManager<E, Z>:
EventFirer + EventProcessor<E, Z> + EventRestarter + HasEventManagerId + ProgressReporter
where
Self::State: HasClientPerfMonitor + HasMetadata + HasExecutions + HasLastReportTime + HasAFLStats,
Self::State: HasClientPerfMonitor + HasMetadata + HasExecutions + HasLastReportTime,
{
}

Expand Down Expand Up @@ -696,7 +629,7 @@ where
}

impl<E, S, Z> EventManager<E, Z> for NopEventManager<S> where
S: UsesInput + HasClientPerfMonitor + HasExecutions + HasLastReportTime + HasMetadata + HasAFLStats,
S: UsesInput + HasClientPerfMonitor + HasExecutions + HasLastReportTime + HasMetadata
{
}

Expand All @@ -714,7 +647,7 @@ where
}

impl<S> ProgressReporter for NopEventManager<S> where
S: UsesInput + HasClientPerfMonitor + HasExecutions + HasLastReportTime + HasMetadata + HasAFLStats
S: UsesInput + HasClientPerfMonitor + HasExecutions + HasLastReportTime + HasMetadata
{
}

Expand Down
9 changes: 4 additions & 5 deletions libafl/src/events/simple.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ use crate::{
},
inputs::UsesInput,
monitors::Monitor,
state::{HasClientPerfMonitor, HasExecutions, HasLastReportTime, HasMetadata, UsesState,HasAFLStats},
state::{HasClientPerfMonitor, HasExecutions, HasLastReportTime, HasMetadata, UsesState},
Error,
};
#[cfg(feature = "std")]
Expand Down Expand Up @@ -132,7 +132,7 @@ where
impl<E, MT, S, Z> EventManager<E, Z> for SimpleEventManager<MT, S>
where
MT: Monitor,
S: UsesInput + HasClientPerfMonitor + HasExecutions + HasLastReportTime + HasMetadata + HasAFLStats,
S: UsesInput + HasClientPerfMonitor + HasExecutions + HasLastReportTime + HasMetadata,
{
}

Expand All @@ -155,7 +155,7 @@ where
impl<MT, S> ProgressReporter for SimpleEventManager<MT, S>
where
MT: Monitor,
S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime + HasAFLStats,
S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime,
{
}

Expand Down Expand Up @@ -384,7 +384,6 @@ where
+ HasClientPerfMonitor
+ HasMetadata
+ HasLastReportTime
+ HasAFLStats
+ Serialize,
SP: ShMemProvider,
{
Expand All @@ -409,7 +408,7 @@ where
impl<MT, S, SP> ProgressReporter for SimpleRestartingEventManager<MT, S, SP>
where
MT: Monitor,
S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime + HasAFLStats,
S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime,
SP: ShMemProvider,
{
}
Expand Down
8 changes: 3 additions & 5 deletions libafl/src/events/tcp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ use crate::{
fuzzer::{EvaluatorObservers, ExecutionProcessor},
inputs::{Input, UsesInput},
monitors::Monitor,
state::{HasClientPerfMonitor, HasExecutions, HasLastReportTime, HasMetadata, UsesState,HasAFLStats},
state::{HasClientPerfMonitor, HasExecutions, HasLastReportTime, HasMetadata, UsesState},
Error,
};

Expand Down Expand Up @@ -622,7 +622,7 @@ impl<E, S, Z> EventManager<E, Z> for TcpEventManager<S>
where
E: HasObservers<State = S> + Executor<Self, Z>,
for<'a> E::Observers: Deserialize<'a>,
S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime + HasAFLStats,
S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime,
Z: EvaluatorObservers<E::Observers, State = S> + ExecutionProcessor<E::Observers, State = S>,
{
}
Expand All @@ -640,7 +640,7 @@ where
}

impl<S> ProgressReporter for TcpEventManager<S> where
S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime + HasAFLStats
S: UsesInput + HasExecutions + HasClientPerfMonitor + HasMetadata + HasLastReportTime
{
}

Expand Down Expand Up @@ -688,7 +688,6 @@ where
+ HasClientPerfMonitor
+ HasMetadata
+ HasLastReportTime
+ HasAFLStats
+ Serialize,
SP: ShMemProvider,
{
Expand Down Expand Up @@ -769,7 +768,6 @@ where
+ HasClientPerfMonitor
+ HasMetadata
+ HasLastReportTime
+ HasAFLStats
+ Serialize,
SP: ShMemProvider + 'static,
Z: EvaluatorObservers<E::Observers, State = S> + ExecutionProcessor<E::Observers>, //CE: CustomEvent<I>,
Expand Down
7 changes: 4 additions & 3 deletions libafl/src/fuzzer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ use crate::{
stages::StagesTuple,
start_timer,
state::{
HasClientPerfMonitor, HasCorpus, HasExecutions, HasLastReportTime, HasMetadata,
HasSolutions, UsesState,HasAFLStats,
HasAFLStats, HasClientPerfMonitor, HasCorpus, HasExecutions, HasLastReportTime,
HasMetadata, HasSolutions, UsesState,
},
Error,
};
Expand Down Expand Up @@ -158,7 +158,8 @@ where
/// The main fuzzer trait.
pub trait Fuzzer<E, EM, ST>: Sized + UsesState
where
Self::State: HasClientPerfMonitor + HasMetadata + HasExecutions + HasLastReportTime + HasAFLStats,
Self::State:
HasClientPerfMonitor + HasMetadata + HasExecutions + HasLastReportTime + HasAFLStats,
E: UsesState<State = Self::State>,
EM: ProgressReporter<State = Self::State>,
ST: StagesTuple<E, EM, Self::State, Self>,
Expand Down
1 change: 1 addition & 0 deletions libafl/src/schedulers/minimizer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ where
/// Add an entry to the corpus and return its index
fn on_add(&mut self, state: &mut CS::State, idx: CorpusId) -> Result<(), Error> {
self.base.on_add(state, idx)?;
*state.pending_mut() += 1;
self.update_score(state, idx)
}

Expand Down
36 changes: 4 additions & 32 deletions libafl/src/stages/calibrate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,9 @@ use crate::{
inputs::UsesInput,
monitors::UserStats,
observers::{MapObserver, ObserversTuple, UsesObserver},
schedulers::{minimizer::IsFavoredMetadata, powersched::SchedulerMetadata},
schedulers::powersched::SchedulerMetadata,
stages::Stage,
state::{
HasAFLStats, HasClientPerfMonitor, HasCorpus, HasMetadata, HasNamedMetadata, UsesState,
},
state::{HasClientPerfMonitor, HasCorpus, HasMetadata, HasNamedMetadata, UsesState},
Error,
};

Expand Down Expand Up @@ -88,7 +86,7 @@ where
O: MapObserver,
for<'de> <O as MapObserver>::Entry: Serialize + Deserialize<'de> + 'static,
OT: ObserversTuple<E::State>,
E::State: HasCorpus + HasMetadata + HasClientPerfMonitor + HasNamedMetadata + HasAFLStats,
E::State: HasCorpus + HasMetadata + HasClientPerfMonitor + HasNamedMetadata,
Z: Evaluator<E, EM, State = E::State>,
{
#[inline]
Expand All @@ -105,42 +103,16 @@ where
mgr: &mut EM,
corpus_idx: CorpusId,
) -> Result<(), Error> {
let mut has_calibration = false;
let mut is_favored = false;
// Run this stage only once for each corpus entry and only if we haven't already inspected it
{
let corpus = state.corpus().get(corpus_idx)?.borrow();
// println!("calibration; corpus.scheduled_count() : {}", corpus.scheduled_count());

if corpus.scheduled_count() > 0 {
has_calibration = true;
}
if corpus.has_metadata::<IsFavoredMetadata>() {
is_favored = true;
return Ok(());
}
}

// The number of pending testcases decrease if this testcase has been calibrated
if has_calibration {
let pending_size = state.pending_mut();
if *pending_size > 0 {
*pending_size -= 1;
}
return Ok(());
}

// The number of "pend_favored" testcases decrease if this testcase is favored and is firstly calibrated.
if is_favored {
let pend_favored_size = state.pend_favored_mut();
if *pend_favored_size > 0 {
*state.pend_favored_mut() -= 1;
}
}

*state.pending_mut() += 1;

*state.own_finds_mut() = state.corpus().count() - state.imported();

let mut iter = self.stage_max;

let input = state.corpus().cloned_input_for_id(corpus_idx)?;
Expand Down
Loading

0 comments on commit 4ae8c9b

Please sign in to comment.