scalability monitor 2nd (#1685)
* tekito * monitor * fix * all * ci * ci
This commit is contained in:
parent
9345b80256
commit
9a1173d4a6
@ -19,7 +19,7 @@ cc = { version = "1.0", features = ["parallel"] }
|
|||||||
which = "4.4"
|
which = "4.4"
|
||||||
|
|
||||||
[dependencies]
|
[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_bolts = { path = "../../libafl_bolts/" }
|
||||||
libafl_targets = { path = "../../libafl_targets/", features = ["sancov_pcguard_hitcounts", "libfuzzer"] }
|
libafl_targets = { path = "../../libafl_targets/", features = ["sancov_pcguard_hitcounts", "libfuzzer"] }
|
||||||
# TODO Include it only when building cc
|
# TODO Include it only when building cc
|
||||||
|
@ -30,7 +30,7 @@ std = ["serde_json", "serde_json/std", "nix", "serde/std", "bincode", "wait-time
|
|||||||
introspection = []
|
introspection = []
|
||||||
|
|
||||||
## Collects stats about scalability
|
## Collects stats about scalability
|
||||||
scalability_introspecition = []
|
scalability_introspection = []
|
||||||
|
|
||||||
## Will build the `pyo3` bindings
|
## Will build the `pyo3` bindings
|
||||||
python = ["pyo3", "concat-idents", "libafl_bolts/python"]
|
python = ["pyo3", "concat-idents", "libafl_bolts/python"]
|
||||||
|
@ -20,6 +20,8 @@ use serde::{Deserialize, Serialize};
|
|||||||
use super::{CustomBufEventResult, HasCustomBufHandlers, ProgressReporter};
|
use super::{CustomBufEventResult, HasCustomBufHandlers, ProgressReporter};
|
||||||
#[cfg(feature = "llmp_compression")]
|
#[cfg(feature = "llmp_compression")]
|
||||||
use crate::events::llmp::COMPRESS_THRESHOLD;
|
use crate::events::llmp::COMPRESS_THRESHOLD;
|
||||||
|
#[cfg(feature = "scalability_introspection")]
|
||||||
|
use crate::state::HasScalabilityMonitor;
|
||||||
use crate::{
|
use crate::{
|
||||||
events::{
|
events::{
|
||||||
llmp::EventStatsCollector, BrokerEventResult, Event, EventConfig, EventFirer, EventManager,
|
llmp::EventStatsCollector, BrokerEventResult, Event, EventConfig, EventFirer, EventManager,
|
||||||
@ -652,34 +654,36 @@ where
|
|||||||
} => {
|
} => {
|
||||||
log::info!("Received new Testcase from {client_id:?} ({client_config:?}, forward {forward_id:?})");
|
log::info!("Received new Testcase from {client_id:?} ({client_config:?}, forward {forward_id:?})");
|
||||||
|
|
||||||
#[cfg(feature = "scalability_introspection")]
|
let res =
|
||||||
println!(
|
if client_config.match_with(&self.configuration()) && observers_buf.is_some() {
|
||||||
"{} {}",
|
|
||||||
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 =
|
let observers: E::Observers =
|
||||||
postcard::from_bytes(observers_buf.as_ref().unwrap())?;
|
postcard::from_bytes(observers_buf.as_ref().unwrap())?;
|
||||||
#[cfg(feature = "scalability_introspection")]
|
#[cfg(feature = "scalability_introspection")]
|
||||||
{
|
{
|
||||||
state.scalability_monitor_mut().testcase_with_observers += 1;
|
state.scalability_monitor_mut().testcase_with_observers += 1;
|
||||||
}
|
}
|
||||||
fuzzer.process_execution(state, self, input, &observers, &exit_kind, true)?
|
fuzzer.process_execution(
|
||||||
|
state,
|
||||||
|
self,
|
||||||
|
input.clone(),
|
||||||
|
&observers,
|
||||||
|
&exit_kind,
|
||||||
|
false,
|
||||||
|
)?
|
||||||
} else {
|
} else {
|
||||||
#[cfg(feature = "scalability_introspection")]
|
#[cfg(feature = "scalability_introspection")]
|
||||||
{
|
{
|
||||||
state.scalability_monitor_mut().testcase_without_observers += 1;
|
state.scalability_monitor_mut().testcase_without_observers += 1;
|
||||||
}
|
}
|
||||||
let res = fuzzer.evaluate_input_with_observers::<E, Self>(
|
fuzzer.evaluate_input_with_observers::<E, Self>(
|
||||||
state,
|
state,
|
||||||
executor,
|
executor,
|
||||||
self,
|
self,
|
||||||
input.clone(),
|
input.clone(),
|
||||||
false,
|
false,
|
||||||
)?;
|
)?
|
||||||
|
};
|
||||||
|
if let Some(item) = res.1 {
|
||||||
if res.1.is_some() {
|
if res.1.is_some() {
|
||||||
self.inner.fire(
|
self.inner.fire(
|
||||||
state,
|
state,
|
||||||
@ -695,9 +699,6 @@ where
|
|||||||
},
|
},
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
res
|
|
||||||
};
|
|
||||||
if let Some(item) = res.1 {
|
|
||||||
log::info!("Added received Testcase as item #{item}");
|
log::info!("Added received Testcase as item #{item}");
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -579,7 +579,7 @@ where
|
|||||||
mgr,
|
mgr,
|
||||||
self.shmem_provider.clone(),
|
self.shmem_provider.clone(),
|
||||||
self.centralized_broker_port,
|
self.centralized_broker_port,
|
||||||
id == 0,
|
index == 1,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
return (self.run_client.take().unwrap())(state, c_mgr, *bind_to);
|
return (self.run_client.take().unwrap())(state, c_mgr, *bind_to);
|
||||||
|
@ -15,6 +15,8 @@ pub mod llmp;
|
|||||||
#[cfg(feature = "tcp_manager")]
|
#[cfg(feature = "tcp_manager")]
|
||||||
#[allow(clippy::ignored_unit_patterns)]
|
#[allow(clippy::ignored_unit_patterns)]
|
||||||
pub mod tcp;
|
pub mod tcp;
|
||||||
|
#[cfg(feature = "scalability_introspection")]
|
||||||
|
use alloc::string::ToString;
|
||||||
use alloc::{boxed::Box, string::String, vec::Vec};
|
use alloc::{boxed::Box, string::String, vec::Vec};
|
||||||
#[cfg(all(unix, feature = "std"))]
|
#[cfg(all(unix, feature = "std"))]
|
||||||
use core::ffi::c_void;
|
use core::ffi::c_void;
|
||||||
@ -48,6 +50,8 @@ use crate::{
|
|||||||
state::{HasExecutions, HasLastReportTime, HasMetadata, State},
|
state::{HasExecutions, HasLastReportTime, HasMetadata, State},
|
||||||
Error,
|
Error,
|
||||||
};
|
};
|
||||||
|
#[cfg(feature = "scalability_introspection")]
|
||||||
|
use crate::{monitors::UserStats::Number, state::HasScalabilityMonitor};
|
||||||
|
|
||||||
/// Check if ctrl-c is sent with this struct
|
/// Check if ctrl-c is sent with this struct
|
||||||
#[cfg(all(unix, feature = "std"))]
|
#[cfg(all(unix, feature = "std"))]
|
||||||
@ -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);
|
*state.last_report_time_mut() = Some(cur);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -8,7 +8,7 @@ use alloc::{borrow::ToOwned, string::ToString, vec::Vec};
|
|||||||
use core::marker::PhantomData;
|
use core::marker::PhantomData;
|
||||||
|
|
||||||
use super::{Stage, TracingStage};
|
use super::{Stage, TracingStage};
|
||||||
#[cfg(feature = "introspection")]
|
#[cfg(all(feature = "introspection", feature = "concolic_mutation"))]
|
||||||
use crate::state::HasClientPerfMonitor;
|
use crate::state::HasClientPerfMonitor;
|
||||||
#[cfg(feature = "concolic_mutation")]
|
#[cfg(feature = "concolic_mutation")]
|
||||||
use crate::state::State;
|
use crate::state::State;
|
||||||
|
@ -123,20 +123,20 @@ impl<T> MaybeHasClientPerfMonitor for T {}
|
|||||||
impl<T> MaybeHasClientPerfMonitor for T where T: HasClientPerfMonitor {}
|
impl<T> MaybeHasClientPerfMonitor for T where T: HasClientPerfMonitor {}
|
||||||
|
|
||||||
/// Intermediate trait for `HasScalabilityMonitor`
|
/// Intermediate trait for `HasScalabilityMonitor`
|
||||||
#[cfg(feature = "scalability_monitor")]
|
#[cfg(feature = "scalability_introspection")]
|
||||||
pub trait MaybeHasScalabilityMonitor: HasScalabilityMonitor {}
|
pub trait MaybeHasScalabilityMonitor: HasScalabilityMonitor {}
|
||||||
/// Intermediate trait for `HasScalabilityMonitor`
|
/// Intermediate trait for `HasScalabilityMonitor`
|
||||||
#[cfg(not(feature = "scalability_monitor"))]
|
#[cfg(not(feature = "scalability_introspection"))]
|
||||||
pub trait MaybeHasScalabilityMonitor {}
|
pub trait MaybeHasScalabilityMonitor {}
|
||||||
|
|
||||||
#[cfg(not(feature = "scalability_monitor"))]
|
#[cfg(not(feature = "scalability_introspection"))]
|
||||||
impl<T> MaybeHasScalabilityMonitor for T {}
|
impl<T> MaybeHasScalabilityMonitor for T {}
|
||||||
|
|
||||||
#[cfg(feature = "scalability_monitor")]
|
#[cfg(feature = "scalability_introspection")]
|
||||||
impl<T> MaybeHasScalabilityMonitor for T where T: HasScalabilityMonitor {}
|
impl<T> MaybeHasScalabilityMonitor for T where T: HasScalabilityMonitor {}
|
||||||
|
|
||||||
/// Trait for offering a [`ScalabilityMonitor`]
|
/// Trait for offering a [`ScalabilityMonitor`]
|
||||||
#[cfg(feature = "scalability_monitor")]
|
#[cfg(feature = "scalability_introspection")]
|
||||||
pub trait HasScalabilityMonitor {
|
pub trait HasScalabilityMonitor {
|
||||||
/// Ref to [`ScalabilityMonitor`]
|
/// Ref to [`ScalabilityMonitor`]
|
||||||
fn scalability_monitor(&self) -> &ScalabilityMonitor;
|
fn scalability_monitor(&self) -> &ScalabilityMonitor;
|
||||||
@ -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")]
|
#[cfg(feature = "python")]
|
||||||
#[allow(missing_docs)]
|
#[allow(missing_docs)]
|
||||||
/// `State` Python bindings
|
/// `State` Python bindings
|
||||||
|
Loading…
x
Reference in New Issue
Block a user