Skip to content

Commit

Permalink
scalability monitor 2nd (AFLplusplus#1685)
Browse files Browse the repository at this point in the history
* tekito

* monitor

* fix

* all

* ci

* ci
  • Loading branch information
tokatoka authored Nov 21, 2023
1 parent 9345b80 commit 9a1173d
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 40 deletions.
2 changes: 1 addition & 1 deletion fuzzers/libfuzzer_libpng_centralized/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ cc = { version = "1.0", features = ["parallel"] }
which = "4.4"

[dependencies]
libafl = { path = "../../libafl/", features = ["std", "derive", "rand_trait", "fork", "prelude", "gzip", "regex"] }
libafl = { path = "../../libafl/", features = ["std", "derive", "rand_trait", "fork", "prelude", "gzip", "regex", "scalability_introspection"] }
libafl_bolts = { path = "../../libafl_bolts/" }
libafl_targets = { path = "../../libafl_targets/", features = ["sancov_pcguard_hitcounts", "libfuzzer"] }
# TODO Include it only when building cc
Expand Down
2 changes: 1 addition & 1 deletion libafl/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ std = ["serde_json", "serde_json/std", "nix", "serde/std", "bincode", "wait-time
introspection = []

## Collects stats about scalability
scalability_introspecition = []
scalability_introspection = []

## Will build the `pyo3` bindings
python = ["pyo3", "concat-idents", "libafl_bolts/python"]
Expand Down
63 changes: 32 additions & 31 deletions libafl/src/events/centralized.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ use serde::{Deserialize, Serialize};
use super::{CustomBufEventResult, HasCustomBufHandlers, ProgressReporter};
#[cfg(feature = "llmp_compression")]
use crate::events::llmp::COMPRESS_THRESHOLD;
#[cfg(feature = "scalability_introspection")]
use crate::state::HasScalabilityMonitor;
use crate::{
events::{
llmp::EventStatsCollector, BrokerEventResult, Event, EventConfig, EventFirer, EventManager,
Expand Down Expand Up @@ -652,34 +654,36 @@ where
} => {
log::info!("Received new Testcase from {client_id:?} ({client_config:?}, forward {forward_id:?})");

#[cfg(feature = "scalability_introspection")]
println!(
"{} {}",
state.scalability_monitor().testcase_with_observers,
state.scalability_monitor().testcase_without_observers
);
let res = if client_config.match_with(&self.configuration())
&& observers_buf.is_some()
{
let observers: E::Observers =
postcard::from_bytes(observers_buf.as_ref().unwrap())?;
#[cfg(feature = "scalability_introspection")]
{
state.scalability_monitor_mut().testcase_with_observers += 1;
}
fuzzer.process_execution(state, self, input, &observers, &exit_kind, true)?
} else {
#[cfg(feature = "scalability_introspection")]
{
state.scalability_monitor_mut().testcase_without_observers += 1;
}
let res = fuzzer.evaluate_input_with_observers::<E, Self>(
state,
executor,
self,
input.clone(),
false,
)?;
let res =
if client_config.match_with(&self.configuration()) && observers_buf.is_some() {
let observers: E::Observers =
postcard::from_bytes(observers_buf.as_ref().unwrap())?;
#[cfg(feature = "scalability_introspection")]
{
state.scalability_monitor_mut().testcase_with_observers += 1;
}
fuzzer.process_execution(
state,
self,
input.clone(),
&observers,
&exit_kind,
false,
)?
} else {
#[cfg(feature = "scalability_introspection")]
{
state.scalability_monitor_mut().testcase_without_observers += 1;
}
fuzzer.evaluate_input_with_observers::<E, Self>(
state,
executor,
self,
input.clone(),
false,
)?
};
if let Some(item) = res.1 {
if res.1.is_some() {
self.inner.fire(
state,
Expand All @@ -695,9 +699,6 @@ where
},
)?;
}
res
};
if let Some(item) = res.1 {
log::info!("Added received Testcase as item #{item}");
}
Ok(())
Expand Down
2 changes: 1 addition & 1 deletion libafl/src/events/launcher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -579,7 +579,7 @@ where
mgr,
self.shmem_provider.clone(),
self.centralized_broker_port,
id == 0,
index == 1,
)?;

return (self.run_client.take().unwrap())(state, c_mgr, *bind_to);
Expand Down
20 changes: 20 additions & 0 deletions libafl/src/events/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ pub mod llmp;
#[cfg(feature = "tcp_manager")]
#[allow(clippy::ignored_unit_patterns)]
pub mod tcp;
#[cfg(feature = "scalability_introspection")]
use alloc::string::ToString;
use alloc::{boxed::Box, string::String, vec::Vec};
#[cfg(all(unix, feature = "std"))]
use core::ffi::c_void;
Expand Down Expand Up @@ -48,6 +50,8 @@ use crate::{
state::{HasExecutions, HasLastReportTime, HasMetadata, State},
Error,
};
#[cfg(feature = "scalability_introspection")]
use crate::{monitors::UserStats::Number, state::HasScalabilityMonitor};

/// Check if ctrl-c is sent with this struct
#[cfg(all(unix, feature = "std"))]
Expand Down Expand Up @@ -525,6 +529,22 @@ where
)?;
}

// If we are measuring scalability stuff..
#[cfg(feature = "scalability_introspection")]
{
let imported_with_observer = state.scalability_monitor().testcase_with_observers;
let imported_without_observer = state.scalability_monitor().testcase_without_observers;

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

*state.last_report_time_mut() = Some(cur);

Ok(())
Expand Down
2 changes: 1 addition & 1 deletion libafl/src/stages/concolic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use alloc::{borrow::ToOwned, string::ToString, vec::Vec};
use core::marker::PhantomData;

use super::{Stage, TracingStage};
#[cfg(feature = "introspection")]
#[cfg(all(feature = "introspection", feature = "concolic_mutation"))]
use crate::state::HasClientPerfMonitor;
#[cfg(feature = "concolic_mutation")]
use crate::state::State;
Expand Down
21 changes: 16 additions & 5 deletions libafl/src/state/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,20 +123,20 @@ impl<T> MaybeHasClientPerfMonitor for T {}
impl<T> MaybeHasClientPerfMonitor for T where T: HasClientPerfMonitor {}

/// Intermediate trait for `HasScalabilityMonitor`
#[cfg(feature = "scalability_monitor")]
#[cfg(feature = "scalability_introspection")]
pub trait MaybeHasScalabilityMonitor: HasScalabilityMonitor {}
/// Intermediate trait for `HasScalabilityMonitor`
#[cfg(not(feature = "scalability_monitor"))]
#[cfg(not(feature = "scalability_introspection"))]
pub trait MaybeHasScalabilityMonitor {}

#[cfg(not(feature = "scalability_monitor"))]
#[cfg(not(feature = "scalability_introspection"))]
impl<T> MaybeHasScalabilityMonitor for T {}

#[cfg(feature = "scalability_monitor")]
#[cfg(feature = "scalability_introspection")]
impl<T> MaybeHasScalabilityMonitor for T where T: HasScalabilityMonitor {}

/// Trait for offering a [`ScalabilityMonitor`]
#[cfg(feature = "scalability_monitor")]
#[cfg(feature = "scalability_introspection")]
pub trait HasScalabilityMonitor {
/// Ref to [`ScalabilityMonitor`]
fn scalability_monitor(&self) -> &ScalabilityMonitor;
Expand Down Expand Up @@ -1011,6 +1011,17 @@ impl<I> HasClientPerfMonitor for NopState<I> {
}
}

#[cfg(feature = "scalability_introspection")]
impl<I> HasScalabilityMonitor for NopState<I> {
fn scalability_monitor(&self) -> &ScalabilityMonitor {
unimplemented!();
}

fn scalability_monitor_mut(&mut self) -> &mut ScalabilityMonitor {
unimplemented!();
}
}

#[cfg(feature = "python")]
#[allow(missing_docs)]
/// `State` Python bindings
Expand Down

0 comments on commit 9a1173d

Please sign in to comment.