Fix documentation typos (#514)
* Fix typos in LibAFL doc comments * Fix doc comment for ProgressReporter trait * Remove unused comment * Link ShMem by name in doc comment
This commit is contained in:
parent
3dcb191baf
commit
2bb60fb756
@ -216,7 +216,7 @@ Now we want to turn our simple fuzzer into a feedback-based one and increase the
|
|||||||
To do that, we need a way to keep track of if a condition is satisfied. The component that feeds the fuzzer with information about properties of a fuzzing run, the satisfied conditions in our case, is the Observer. We use the `StdMapObserver`, the default observer that uses a map to keep track of covered elements. In our fuzzer, each condition is mapped to an entry of such map.
|
To do that, we need a way to keep track of if a condition is satisfied. The component that feeds the fuzzer with information about properties of a fuzzing run, the satisfied conditions in our case, is the Observer. We use the `StdMapObserver`, the default observer that uses a map to keep track of covered elements. In our fuzzer, each condition is mapped to an entry of such map.
|
||||||
|
|
||||||
We represent such map as a `static mut` variable.
|
We represent such map as a `static mut` variable.
|
||||||
As we don't rely on any instrumentation engine, we have to manually track the satisfied conditions in a map modyfing our tested function:
|
As we don't rely on any instrumentation engine, we have to manually track the satisfied conditions in a map modifying our tested function:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
extern crate libafl;
|
extern crate libafl;
|
||||||
|
@ -8,11 +8,11 @@ use core::{
|
|||||||
|
|
||||||
/// Convert to an Any trait object
|
/// Convert to an Any trait object
|
||||||
pub trait AsAny: Any {
|
pub trait AsAny: Any {
|
||||||
/// returns this as Any trait
|
/// Returns this as Any trait
|
||||||
fn as_any(&self) -> &dyn Any;
|
fn as_any(&self) -> &dyn Any;
|
||||||
/// returns this as mutable Any trait
|
/// Returns this as mutable Any trait
|
||||||
fn as_any_mut(&mut self) -> &mut dyn Any;
|
fn as_any_mut(&mut self) -> &mut dyn Any;
|
||||||
/// returns this as boxed Any trait
|
/// Returns this as boxed Any trait
|
||||||
fn as_any_boxed(self: Box<Self>) -> Box<dyn Any>;
|
fn as_any_boxed(self: Box<Self>) -> Box<dyn Any>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,8 +38,6 @@ macro_rules! impl_asany {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// yolo
|
|
||||||
|
|
||||||
/// Get a `type_id` from its previously unpacked `u64`.
|
/// Get a `type_id` from its previously unpacked `u64`.
|
||||||
/// Opposite of [`unpack_type_id(id)`].
|
/// Opposite of [`unpack_type_id(id)`].
|
||||||
///
|
///
|
||||||
|
@ -16,7 +16,7 @@ pub struct GzipCompressor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl GzipCompressor {
|
impl GzipCompressor {
|
||||||
/// If the buffer is at lest larger as large as the `threshold` value, we compress the buffer.
|
/// If the buffer is at least larger as large as the `threshold` value, we compress the buffer.
|
||||||
/// When given a `threshold` of `0`, the `GzipCompressor` will always compress.
|
/// When given a `threshold` of `0`, the `GzipCompressor` will always compress.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn new(threshold: usize) -> Self {
|
pub fn new(threshold: usize) -> Self {
|
||||||
|
@ -9,7 +9,7 @@ use crate::bolts::current_nanos;
|
|||||||
|
|
||||||
/// Read a timestamp for measurements.
|
/// Read a timestamp for measurements.
|
||||||
///
|
///
|
||||||
/// This function is a wrapper around different ways to get a timestamp, fast
|
/// This function is a wrapper around different ways to get a timestamp, fast.
|
||||||
/// In this way, an experiment only has to
|
/// In this way, an experiment only has to
|
||||||
/// change this implementation rather than every instead of `read_time_counter`.
|
/// change this implementation rather than every instead of `read_time_counter`.
|
||||||
/// It is using `rdtsc` on `x86_64` and `x86`.
|
/// It is using `rdtsc` on `x86_64` and `x86`.
|
||||||
@ -28,7 +28,7 @@ pub fn read_time_counter() -> u64 {
|
|||||||
|
|
||||||
/// Read a timestamp for measurements.
|
/// Read a timestamp for measurements.
|
||||||
///
|
///
|
||||||
/// This function is a wrapper around different ways to get a timestamp, fast
|
/// This function is a wrapper around different ways to get a timestamp, fast.
|
||||||
/// In this way, an experiment only has to
|
/// In this way, an experiment only has to
|
||||||
/// change this implementation rather than every instead of [`read_time_counter`]
|
/// change this implementation rather than every instead of [`read_time_counter`]
|
||||||
/// On unsupported architectures, it's falling back to normal system time, in millis.
|
/// On unsupported architectures, it's falling back to normal system time, in millis.
|
||||||
|
@ -55,8 +55,6 @@ For broker2broker communication, all messages are forwarded via network sockets.
|
|||||||
|
|
||||||
Check out the `llmp_test` example in ./examples, or build it with `cargo run --example llmp_test`.
|
Check out the `llmp_test` example in ./examples, or build it with `cargo run --example llmp_test`.
|
||||||
|
|
||||||
For broker2broker communication, all messages are forwarded via network sockets.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use alloc::{string::String, vec::Vec};
|
use alloc::{string::String, vec::Vec};
|
||||||
@ -168,7 +166,7 @@ static mut GLOBAL_SIGHANDLER_STATE: LlmpBrokerSignalHandler = LlmpBrokerSignalHa
|
|||||||
shutting_down: false,
|
shutting_down: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// TAGs used thorughout llmp
|
/// TAGs used throughout llmp
|
||||||
pub type Tag = u32;
|
pub type Tag = u32;
|
||||||
/// The client ID == the sender id.
|
/// The client ID == the sender id.
|
||||||
pub type ClientId = u32;
|
pub type ClientId = u32;
|
||||||
@ -241,7 +239,7 @@ pub enum TcpResponse {
|
|||||||
},
|
},
|
||||||
/// Notify the client on the other side that it has been accepted.
|
/// Notify the client on the other side that it has been accepted.
|
||||||
LocalClientAccepted {
|
LocalClientAccepted {
|
||||||
/// The ClientId this client should send messages as
|
/// The ClientId this client should send messages as.
|
||||||
/// Mainly used for client-side deduplication of incoming messages
|
/// Mainly used for client-side deduplication of incoming messages
|
||||||
client_id: ClientId,
|
client_id: ClientId,
|
||||||
},
|
},
|
||||||
@ -506,7 +504,7 @@ pub struct LlmpDescription {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
/// Result of an LLMP Mesasge hook
|
/// Result of an LLMP Message hook
|
||||||
pub enum LlmpMsgHookResult {
|
pub enum LlmpMsgHookResult {
|
||||||
/// This has been handled in the broker. No need to forward.
|
/// This has been handled in the broker. No need to forward.
|
||||||
Handled,
|
Handled,
|
||||||
@ -520,7 +518,7 @@ pub enum LlmpMsgHookResult {
|
|||||||
pub struct LlmpMsg {
|
pub struct LlmpMsg {
|
||||||
/// A tag
|
/// A tag
|
||||||
pub tag: Tag, //u32
|
pub tag: Tag, //u32
|
||||||
/// Sender of this messge
|
/// Sender of this message
|
||||||
pub sender: ClientId, //u32
|
pub sender: ClientId, //u32
|
||||||
/// ID of another Broker, for b2b messages
|
/// ID of another Broker, for b2b messages
|
||||||
pub broker: BrokerId, //u32
|
pub broker: BrokerId, //u32
|
||||||
@ -686,7 +684,7 @@ pub struct LlmpPage {
|
|||||||
pub magic: u64,
|
pub magic: u64,
|
||||||
/// The id of the sender
|
/// The id of the sender
|
||||||
pub sender: u32,
|
pub sender: u32,
|
||||||
/// Set to != 1 by the receiver, once it got mapped
|
/// Set to != 1 by the receiver, once it got mapped.
|
||||||
/// It's not safe for the sender to unmap this page before
|
/// It's not safe for the sender to unmap this page before
|
||||||
/// (The os may have tidied up the memory when the receiver starts to map)
|
/// (The os may have tidied up the memory when the receiver starts to map)
|
||||||
pub safe_to_unmap: AtomicU16,
|
pub safe_to_unmap: AtomicU16,
|
||||||
@ -702,7 +700,7 @@ pub struct LlmpPage {
|
|||||||
pub size_total: usize,
|
pub size_total: usize,
|
||||||
/// How much space is used on this page in bytes
|
/// How much space is used on this page in bytes
|
||||||
pub size_used: usize,
|
pub size_used: usize,
|
||||||
/// The maximum amount of bytes that ever got allocated on this page in one go
|
/// The maximum amount of bytes that ever got allocated on this page in one go.
|
||||||
/// An inidactor of what to use as size for future pages
|
/// An inidactor of what to use as size for future pages
|
||||||
pub max_alloc_size: usize,
|
pub max_alloc_size: usize,
|
||||||
/// Pointer to the messages, from here on.
|
/// Pointer to the messages, from here on.
|
||||||
@ -732,7 +730,7 @@ where
|
|||||||
/// Ref to the last message this sender sent on the last page.
|
/// Ref to the last message this sender sent on the last page.
|
||||||
/// If null, a new page (just) started.
|
/// If null, a new page (just) started.
|
||||||
pub last_msg_sent: *const LlmpMsg,
|
pub last_msg_sent: *const LlmpMsg,
|
||||||
/// A vec of page wrappers, each containing an intialized AfShmem
|
/// A vec of page wrappers, each containing an initialized [`ShMem`]
|
||||||
pub out_shmems: Vec<LlmpSharedMap<SP::ShMem>>,
|
pub out_shmems: Vec<LlmpSharedMap<SP::ShMem>>,
|
||||||
/// If true, pages will never be pruned.
|
/// If true, pages will never be pruned.
|
||||||
/// The broker uses this feature.
|
/// The broker uses this feature.
|
||||||
@ -1305,7 +1303,7 @@ where
|
|||||||
{
|
{
|
||||||
/// Id of this provider
|
/// Id of this provider
|
||||||
pub id: u32,
|
pub id: u32,
|
||||||
/// Pointer to the last meg this received
|
/// Pointer to the last message received
|
||||||
pub last_msg_recvd: *const LlmpMsg,
|
pub last_msg_recvd: *const LlmpMsg,
|
||||||
/// The shmem provider
|
/// The shmem provider
|
||||||
pub shmem_provider: SP,
|
pub shmem_provider: SP,
|
||||||
@ -1503,7 +1501,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the next message, tag, buf, if avaliable, else None
|
/// Returns the next message, tag, buf, if available, else None
|
||||||
#[allow(clippy::type_complexity)]
|
#[allow(clippy::type_complexity)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn recv_buf(&mut self) -> Result<Option<(ClientId, Tag, &[u8])>, Error> {
|
pub fn recv_buf(&mut self) -> Result<Option<(ClientId, Tag, &[u8])>, Error> {
|
||||||
@ -1733,7 +1731,7 @@ where
|
|||||||
/// Broadcast map from broker to all clients
|
/// Broadcast map from broker to all clients
|
||||||
pub llmp_out: LlmpSender<SP>,
|
pub llmp_out: LlmpSender<SP>,
|
||||||
/// Users of Llmp can add message handlers in the broker.
|
/// Users of Llmp can add message handlers in the broker.
|
||||||
/// This allows us to intercept messages right in the broker
|
/// This allows us to intercept messages right in the broker.
|
||||||
/// This keeps the out map clean.
|
/// This keeps the out map clean.
|
||||||
pub llmp_clients: Vec<LlmpReceiver<SP>>,
|
pub llmp_clients: Vec<LlmpReceiver<SP>>,
|
||||||
/// The ShMemProvider to use
|
/// The ShMemProvider to use
|
||||||
@ -1974,7 +1972,7 @@ where
|
|||||||
.expect("Error when shutting down broker: Could not send LLMP_TAG_EXITING msg.");
|
.expect("Error when shutting down broker: Could not send LLMP_TAG_EXITING msg.");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Broadcasts the given buf to all lients
|
/// Broadcasts the given buf to all clients
|
||||||
pub fn send_buf(&mut self, tag: Tag, buf: &[u8]) -> Result<(), Error> {
|
pub fn send_buf(&mut self, tag: Tag, buf: &[u8]) -> Result<(), Error> {
|
||||||
self.llmp_out.send_buf(tag, buf)
|
self.llmp_out.send_buf(tag, buf)
|
||||||
}
|
}
|
||||||
@ -1984,7 +1982,7 @@ where
|
|||||||
self.llmp_out.send_buf_with_flags(tag, flags, buf)
|
self.llmp_out.send_buf_with_flags(tag, flags, buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Launches a thread using a tcp listener socket, on which new clients may connect to this broker
|
/// Launches a thread using a tcp listener socket, on which new clients may connect to this broker.
|
||||||
/// Does so on the given port.
|
/// Does so on the given port.
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
pub fn launch_tcp_listener_on(&mut self, port: u16) -> Result<thread::JoinHandle<()>, Error> {
|
pub fn launch_tcp_listener_on(&mut self, port: u16) -> Result<thread::JoinHandle<()>, Error> {
|
||||||
@ -2593,7 +2591,7 @@ where
|
|||||||
self.receiver.recv_blocking()
|
self.receiver.recv_blocking()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The current page could have changed in recv (EOP)
|
/// The current page could have changed in recv (EOP).
|
||||||
/// Alloc the next message, internally handling end of page by allocating a new one.
|
/// Alloc the next message, internally handling end of page by allocating a new one.
|
||||||
/// # Safety
|
/// # Safety
|
||||||
/// Should be safe, but returns an unsafe ptr
|
/// Should be safe, but returns an unsafe ptr
|
||||||
@ -2602,14 +2600,14 @@ where
|
|||||||
self.sender.alloc_next(buf_len)
|
self.sender.alloc_next(buf_len)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the next message, tag, buf, if avaliable, else None
|
/// Returns the next message, tag, buf, if available, else None
|
||||||
#[allow(clippy::type_complexity)]
|
#[allow(clippy::type_complexity)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn recv_buf(&mut self) -> Result<Option<(ClientId, Tag, &[u8])>, Error> {
|
pub fn recv_buf(&mut self) -> Result<Option<(ClientId, Tag, &[u8])>, Error> {
|
||||||
self.receiver.recv_buf()
|
self.receiver.recv_buf()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Receives a buf from the broker, looping until a messages becomes avaliable
|
/// Receives a buf from the broker, looping until a message becomes available
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn recv_buf_blocking(&mut self) -> Result<(ClientId, Tag, &[u8]), Error> {
|
pub fn recv_buf_blocking(&mut self) -> Result<(ClientId, Tag, &[u8]), Error> {
|
||||||
self.receiver.recv_buf_blocking()
|
self.receiver.recv_buf_blocking()
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//! Implements a mini-bsod generator
|
//! Implements a mini-bsod generator.
|
||||||
//! It dumps all important registers and prints a stacktrace.
|
//! It dumps all important registers and prints a stacktrace.
|
||||||
//! You may use the [`crate::bolts::os::unix_signals::ucontext`]
|
//! You may use the [`crate::bolts::os::unix_signals::ucontext`]
|
||||||
//! function to get a [`ucontext_t`].
|
//! function to get a [`ucontext_t`].
|
||||||
@ -8,7 +8,7 @@ use std::io::{BufWriter, Write};
|
|||||||
|
|
||||||
use crate::bolts::os::unix_signals::{ucontext_t, Signal};
|
use crate::bolts::os::unix_signals::{ucontext_t, Signal};
|
||||||
|
|
||||||
/// Write the contens of all important registers
|
/// Write the content of all important registers
|
||||||
#[cfg(all(target_os = "linux", target_arch = "x86_64"))]
|
#[cfg(all(target_os = "linux", target_arch = "x86_64"))]
|
||||||
#[allow(clippy::similar_names)]
|
#[allow(clippy::similar_names)]
|
||||||
pub fn dump_registers<W: Write>(
|
pub fn dump_registers<W: Write>(
|
||||||
@ -44,7 +44,7 @@ pub fn dump_registers<W: Write>(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Write the contens of all important registers
|
/// Write the content of all important registers
|
||||||
#[cfg(all(
|
#[cfg(all(
|
||||||
any(target_os = "linux", target_os = "android"),
|
any(target_os = "linux", target_os = "android"),
|
||||||
target_arch = "aarch64"
|
target_arch = "aarch64"
|
||||||
@ -68,7 +68,7 @@ pub fn dump_registers<W: Write>(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Write the contens of all important registers
|
/// Write the content of all important registers
|
||||||
#[cfg(all(target_os = "linux", target_arch = "arm"))]
|
#[cfg(all(target_os = "linux", target_arch = "arm"))]
|
||||||
pub fn dump_registers<W: Write>(
|
pub fn dump_registers<W: Write>(
|
||||||
writer: &mut BufWriter<W>,
|
writer: &mut BufWriter<W>,
|
||||||
@ -96,7 +96,7 @@ pub fn dump_registers<W: Write>(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Write the contens of all important registers
|
/// Write the content of all important registers
|
||||||
#[cfg(all(target_vendor = "apple", target_arch = "aarch64"))]
|
#[cfg(all(target_vendor = "apple", target_arch = "aarch64"))]
|
||||||
pub fn dump_registers<W: Write>(
|
pub fn dump_registers<W: Write>(
|
||||||
writer: &mut BufWriter<W>,
|
writer: &mut BufWriter<W>,
|
||||||
@ -120,7 +120,7 @@ pub fn dump_registers<W: Write>(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Write the contens of all important registers
|
/// Write the content of all important registers
|
||||||
#[allow(clippy::unnecessary_wraps, clippy::similar_names)]
|
#[allow(clippy::unnecessary_wraps, clippy::similar_names)]
|
||||||
#[cfg(all(target_vendor = "apple", target_arch = "x86_64"))]
|
#[cfg(all(target_vendor = "apple", target_arch = "x86_64"))]
|
||||||
pub fn dump_registers<W: Write>(
|
pub fn dump_registers<W: Write>(
|
||||||
|
@ -171,10 +171,10 @@ impl Cores {
|
|||||||
Self::from_cmdline("all")
|
Self::from_cmdline("all")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses core binding args from user input
|
/// Parses core binding args from user input.
|
||||||
/// Returns a Vec of CPU IDs.
|
/// Returns a Vec of CPU IDs.
|
||||||
/// `./fuzzer --cores 1,2-4,6` -> clients run in cores 1,2,3,4,6
|
/// * `./fuzzer --cores 1,2-4,6`: clients run in cores 1,2,3,4,6
|
||||||
/// ` ./fuzzer --cores all` -> one client runs on each available core
|
/// * `./fuzzer --cores all`: one client runs on each available core
|
||||||
pub fn from_cmdline(args: &str) -> Result<Self, Error> {
|
pub fn from_cmdline(args: &str) -> Result<Self, Error> {
|
||||||
let mut cores: Vec<CoreId> = vec![];
|
let mut cores: Vec<CoreId> = vec![];
|
||||||
|
|
||||||
@ -246,10 +246,10 @@ impl TryFrom<&str> for Cores {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses core binding args from user input
|
/// Parses core binding args from user input.
|
||||||
/// Returns a Vec of CPU IDs.
|
/// Returns a Vec of CPU IDs.
|
||||||
/// `./fuzzer --cores 1,2-4,6` -> clients run in cores 1,2,3,4,6
|
/// * `./fuzzer --cores 1,2-4,6`: clients run in cores 1,2,3,4,6
|
||||||
/// ` ./fuzzer --cores all` -> one client runs on each available core
|
/// * `./fuzzer --cores all`: one client runs on each available core
|
||||||
#[must_use]
|
#[must_use]
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
#[deprecated(since = "0.7.1", note = "Use Cores::from_cmdline instead")]
|
#[deprecated(since = "0.7.1", note = "Use Cores::from_cmdline instead")]
|
||||||
|
@ -207,7 +207,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Wrap a slice and convert to a Vec on serialize
|
/// Wrap a slice and convert to a Vec on serialize.
|
||||||
/// We use a hidden inner enum so the public API can be safe,
|
/// We use a hidden inner enum so the public API can be safe,
|
||||||
/// unless the user uses the unsafe [`OwnedSlice::from_raw_parts`]
|
/// unless the user uses the unsafe [`OwnedSlice::from_raw_parts`]
|
||||||
#[allow(clippy::unsafe_derive_deserialize)]
|
#[allow(clippy::unsafe_derive_deserialize)]
|
||||||
@ -328,7 +328,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Wrap a mutable slice and convert to a Vec on serialize
|
/// Wrap a mutable slice and convert to a Vec on serialize.
|
||||||
/// We use a hidden inner enum so the public API can be safe,
|
/// We use a hidden inner enum so the public API can be safe,
|
||||||
/// unless the user uses the unsafe [`OwnedSliceMut::from_raw_parts_mut`]
|
/// unless the user uses the unsafe [`OwnedSliceMut::from_raw_parts_mut`]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -16,8 +16,8 @@ const HASH_CONST: u64 = 0xa5b35705;
|
|||||||
/// Not cryptographically secure (which is not what you want during fuzzing ;) )
|
/// Not cryptographically secure (which is not what you want during fuzzing ;) )
|
||||||
pub type StdRand = RomuDuoJrRand;
|
pub type StdRand = RomuDuoJrRand;
|
||||||
|
|
||||||
/// Ways to get random around here
|
/// Ways to get random around here.
|
||||||
/// Please note that these are not cryptographically secure
|
/// Please note that these are not cryptographically secure.
|
||||||
/// Or, even if some might be by accident, at least they are not seeded in a cryptographically secure fashion.
|
/// Or, even if some might be by accident, at least they are not seeded in a cryptographically secure fashion.
|
||||||
pub trait Rand: Debug + Serialize + DeserializeOwned {
|
pub trait Rand: Debug + Serialize + DeserializeOwned {
|
||||||
/// Sets the seed of this Rand
|
/// Sets the seed of this Rand
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
//! A generic sharememory region to be used by any functions (queues or feedbacks
|
//! A generic shared memory region to be used by any functions (queues or feedbacks
|
||||||
// too.)
|
//! too.)
|
||||||
|
|
||||||
#[cfg(all(unix, feature = "std"))]
|
#[cfg(all(unix, feature = "std"))]
|
||||||
use crate::bolts::os::pipes::Pipe;
|
use crate::bolts::os::pipes::Pipe;
|
||||||
@ -253,7 +253,7 @@ pub trait ShMemProvider: Clone + Default + Debug {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A Refernce Counted shared map,
|
/// A Reference Counted shared map,
|
||||||
/// that can use internal mutability.
|
/// that can use internal mutability.
|
||||||
/// Useful if the `ShMemProvider` needs to keep local state.
|
/// Useful if the `ShMemProvider` needs to keep local state.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
@ -299,7 +299,7 @@ impl<T: ShMemProvider> Drop for RcShMem<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A Refernce Counted `ShMemProvider`,
|
/// A Reference Counted `ShMemProvider`,
|
||||||
/// that can use internal mutability.
|
/// that can use internal mutability.
|
||||||
/// Useful if the `ShMemProvider` needs to keep local state.
|
/// Useful if the `ShMemProvider` needs to keep local state.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
@ -365,7 +365,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Merge two `TupeList`
|
/// Merge two `TupleList`
|
||||||
pub trait Merge<T> {
|
pub trait Merge<T> {
|
||||||
/// The Resulting [`TupleList`], of an [`Merge::merge()`] call
|
/// The Resulting [`TupleList`], of an [`Merge::merge()`] call
|
||||||
type MergeResult;
|
type MergeResult;
|
||||||
|
@ -90,7 +90,7 @@ where
|
|||||||
self.inner.current()
|
self.inner.current()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Current testcase scheduled (mut)
|
/// Current testcase scheduled (mutable)
|
||||||
#[inline]
|
#[inline]
|
||||||
fn current_mut(&mut self) -> &mut Option<usize> {
|
fn current_mut(&mut self) -> &mut Option<usize> {
|
||||||
self.inner.current_mut()
|
self.inner.current_mut()
|
||||||
|
@ -66,7 +66,7 @@ where
|
|||||||
&self.current
|
&self.current
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Current testcase scheduled (mut)
|
/// Current testcase scheduled (mutable)
|
||||||
#[inline]
|
#[inline]
|
||||||
fn current_mut(&mut self) -> &mut Option<usize> {
|
fn current_mut(&mut self) -> &mut Option<usize> {
|
||||||
&mut self.current
|
&mut self.current
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//! Corpuses contain the testcases, either in mem, on disk, or somewhere else.
|
//! Corpuses contain the testcases, either in memory, on disk, or somewhere else.
|
||||||
|
|
||||||
pub mod testcase;
|
pub mod testcase;
|
||||||
pub use testcase::{PowerScheduleTestcaseMetaData, Testcase};
|
pub use testcase::{PowerScheduleTestcaseMetaData, Testcase};
|
||||||
@ -70,7 +70,7 @@ where
|
|||||||
/// Current testcase scheduled
|
/// Current testcase scheduled
|
||||||
fn current(&self) -> &Option<usize>;
|
fn current(&self) -> &Option<usize>;
|
||||||
|
|
||||||
/// Current testcase scheduled (mut)
|
/// Current testcase scheduled (mutable)
|
||||||
fn current_mut(&mut self) -> &mut Option<usize>;
|
fn current_mut(&mut self) -> &mut Option<usize>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,6 +145,6 @@ impl Default for RandCorpusScheduler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A [`StdCorpusScheduler`] uses the default scheduler in `LibAFL` to schedule [`Testcase`]s
|
/// A [`StdCorpusScheduler`] uses the default scheduler in `LibAFL` to schedule [`Testcase`]s.
|
||||||
/// The current `Std` is a [`RandCorpusScheduler`], although this may change in the future, if another [`CorpusScheduler`] delivers better results.
|
/// The current `Std` is a [`RandCorpusScheduler`], although this may change in the future, if another [`CorpusScheduler`] delivers better results.
|
||||||
pub type StdCorpusScheduler = RandCorpusScheduler;
|
pub type StdCorpusScheduler = RandCorpusScheduler;
|
||||||
|
@ -161,7 +161,7 @@ where
|
|||||||
&self.current
|
&self.current
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Current testcase scheduled (mut)
|
/// Current testcase scheduled (mutable)
|
||||||
#[inline]
|
#[inline]
|
||||||
fn current_mut(&mut self) -> &mut Option<usize> {
|
fn current_mut(&mut self) -> &mut Option<usize> {
|
||||||
&mut self.current
|
&mut self.current
|
||||||
|
@ -130,7 +130,7 @@ where
|
|||||||
&self.exec_time
|
&self.exec_time
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the execution time of the testcase (mut)
|
/// Get the execution time of the testcase (mutable)
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn exec_time_mut(&mut self) -> &mut Option<Duration> {
|
pub fn exec_time_mut(&mut self) -> &mut Option<Duration> {
|
||||||
&mut self.exec_time
|
&mut self.exec_time
|
||||||
@ -148,7 +148,7 @@ where
|
|||||||
&self.executions
|
&self.executions
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the executions (mut)
|
/// Get the executions (mutable)
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn executions_mut(&mut self) -> &mut usize {
|
pub fn executions_mut(&mut self) -> &mut usize {
|
||||||
&mut self.executions
|
&mut self.executions
|
||||||
|
@ -521,7 +521,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A manager that can restart on the fly, storing states in-between (in `on_resatrt`)
|
/// A manager that can restart on the fly, storing states in-between (in `on_restart`)
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct LlmpRestartingEventManager<I, OT, S, SP>
|
pub struct LlmpRestartingEventManager<I, OT, S, SP>
|
||||||
@ -658,7 +658,7 @@ where
|
|||||||
&self.staterestorer
|
&self.staterestorer
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the staterestorer (mut)
|
/// Get the staterestorer (mutable)
|
||||||
pub fn staterestorer_mut(&mut self) -> &mut StateRestorer<SP> {
|
pub fn staterestorer_mut(&mut self) -> &mut StateRestorer<SP> {
|
||||||
&mut self.staterestorer
|
&mut self.staterestorer
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ impl fmt::Display for LogSeverity {
|
|||||||
/// Indicate if an event worked or not
|
/// Indicate if an event worked or not
|
||||||
#[derive(Serialize, Deserialize, Debug, Copy, Clone)]
|
#[derive(Serialize, Deserialize, Debug, Copy, Clone)]
|
||||||
pub enum BrokerEventResult {
|
pub enum BrokerEventResult {
|
||||||
/// The broker haneled this. No need to pass it on.
|
/// The broker handled this. No need to pass it on.
|
||||||
Handled,
|
Handled,
|
||||||
/// Pass this message along to the clients.
|
/// Pass this message along to the clients.
|
||||||
Forward,
|
Forward,
|
||||||
@ -295,10 +295,10 @@ where
|
|||||||
/// In this case, if you `fire` faster than the broker can consume
|
/// In this case, if you `fire` faster than the broker can consume
|
||||||
/// (for example for each [`Input`], on multiple cores)
|
/// (for example for each [`Input`], on multiple cores)
|
||||||
/// the [`llmp`] shared map may fill up and the client will eventually OOM or [`panic`].
|
/// the [`llmp`] shared map may fill up and the client will eventually OOM or [`panic`].
|
||||||
/// This should not happen for a normal use-cases.
|
/// This should not happen for a normal use-case.
|
||||||
fn fire<S>(&mut self, state: &mut S, event: Event<I>) -> Result<(), Error>;
|
fn fire<S>(&mut self, state: &mut S, event: Event<I>) -> Result<(), Error>;
|
||||||
|
|
||||||
/// Send off an [`Event::Log`] event to the broker
|
/// Send off an [`Event::Log`] event to the broker.
|
||||||
/// This is a shortcut for [`EventFirer::fire`] with [`Event::Log`] as argument.
|
/// This is a shortcut for [`EventFirer::fire`] with [`Event::Log`] as argument.
|
||||||
fn log<S>(
|
fn log<S>(
|
||||||
&mut self,
|
&mut self,
|
||||||
@ -330,7 +330,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// [`EventFirer`] fire an event.
|
/// [`ProgressReporter`] report progress to the broker.
|
||||||
pub trait ProgressReporter<I>: EventFirer<I>
|
pub trait ProgressReporter<I>: EventFirer<I>
|
||||||
where
|
where
|
||||||
I: Input,
|
I: Input,
|
||||||
@ -431,10 +431,10 @@ pub trait EventProcessor<E, I, S, Z> {
|
|||||||
}
|
}
|
||||||
/// The id of this [`EventManager`].
|
/// The id of this [`EventManager`].
|
||||||
/// For multi processed [`EventManager`]s,
|
/// For multi processed [`EventManager`]s,
|
||||||
/// each connected client sholud have a unique ids.
|
/// each connected client should have a unique ids.
|
||||||
pub trait HasEventManagerId {
|
pub trait HasEventManagerId {
|
||||||
/// The id of this manager. For Multiprocessed [`EventManager`]s,
|
/// The id of this manager. For Multiprocessed [`EventManager`]s,
|
||||||
/// each client sholud have a unique ids.
|
/// each client should have a unique ids.
|
||||||
fn mgr_id(&self) -> EventManagerId;
|
fn mgr_id(&self) -> EventManagerId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ where
|
|||||||
/// Create a new in mem executor.
|
/// Create a new in mem executor.
|
||||||
/// Caution: crash and restart in one of them will lead to odd behavior if multiple are used,
|
/// Caution: crash and restart in one of them will lead to odd behavior if multiple are used,
|
||||||
/// depending on different corpus or state.
|
/// depending on different corpus or state.
|
||||||
/// * `harness_fn` - the harness, executiong the function
|
/// * `harness_fn` - the harness, executing the function
|
||||||
/// * `observers` - the observers observing the target during execution
|
/// * `observers` - the observers observing the target during execution
|
||||||
/// This may return an error on unix, if signal handler setup fails
|
/// This may return an error on unix, if signal handler setup fails
|
||||||
pub fn new<EM, OF, Z>(
|
pub fn new<EM, OF, Z>(
|
||||||
@ -218,7 +218,7 @@ where
|
|||||||
&self.handlers
|
&self.handlers
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The inprocess handlers, mut
|
/// The inprocess handlers (mutable)
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn handlers_mut(&mut self) -> &mut InProcessHandlers {
|
pub fn handlers_mut(&mut self) -> &mut InProcessHandlers {
|
||||||
&mut self.handlers
|
&mut self.handlers
|
||||||
|
@ -66,7 +66,7 @@ where
|
|||||||
/// Get the linked observers
|
/// Get the linked observers
|
||||||
fn observers(&self) -> &OT;
|
fn observers(&self) -> &OT;
|
||||||
|
|
||||||
/// Get the linked observers
|
/// Get the linked observers (mutable)
|
||||||
fn observers_mut(&mut self) -> &mut OT;
|
fn observers_mut(&mut self) -> &mut OT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ extern "C" {
|
|||||||
#[cfg(all(unix, not(target_os = "linux")))]
|
#[cfg(all(unix, not(target_os = "linux")))]
|
||||||
const ITIMER_REAL: c_int = 0;
|
const ITIMER_REAL: c_int = 0;
|
||||||
|
|
||||||
/// The timeout excutor is a wrapper that sets a timeout before each run
|
/// The timeout executor is a wrapper that sets a timeout before each run
|
||||||
pub struct TimeoutExecutor<E> {
|
pub struct TimeoutExecutor<E> {
|
||||||
executor: E,
|
executor: E,
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//! Concoliic feedback for comcolic fuzzing.
|
//! Concolic feedback for concolic fuzzing.
|
||||||
//! It is used to attach concolic tracing metadata to the testcase.
|
//! It is used to attach concolic tracing metadata to the testcase.
|
||||||
//! This feedback should be used in combination with another feedback as this feedback always considers testcases
|
//! This feedback should be used in combination with another feedback as this feedback always considers testcases
|
||||||
//! to be not interesting.
|
//! to be not interesting.
|
||||||
|
@ -144,7 +144,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A cobined feedback consisting of ultiple [`Feedback`]s
|
/// A combined feedback consisting of multiple [`Feedback`]s
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct CombinedFeedback<A, B, FL, I, S>
|
pub struct CombinedFeedback<A, B, FL, I, S>
|
||||||
where
|
where
|
||||||
@ -271,7 +271,7 @@ where
|
|||||||
I: Input,
|
I: Input,
|
||||||
S: HasClientPerfMonitor,
|
S: HasClientPerfMonitor,
|
||||||
{
|
{
|
||||||
/// The name of this cobination
|
/// The name of this combination
|
||||||
fn name() -> &'static str;
|
fn name() -> &'static str;
|
||||||
|
|
||||||
/// If the feedback pair is interesting
|
/// If the feedback pair is interesting
|
||||||
@ -538,19 +538,19 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Combine two feedbacks with an eager AND operation,
|
/// Combine two feedbacks with an eager AND operation,
|
||||||
/// will call all feedbacks functions even if not necessery to conclude the result
|
/// will call all feedbacks functions even if not necessary to conclude the result
|
||||||
pub type EagerAndFeedback<A, B, I, S> = CombinedFeedback<A, B, LogicEagerAnd, I, S>;
|
pub type EagerAndFeedback<A, B, I, S> = CombinedFeedback<A, B, LogicEagerAnd, I, S>;
|
||||||
|
|
||||||
/// Combine two feedbacks with an fast AND operation,
|
/// Combine two feedbacks with an fast AND operation,
|
||||||
/// might skip calling feedbacks functions if not necessery to conclude the result
|
/// might skip calling feedbacks functions if not necessary to conclude the result
|
||||||
pub type FastAndFeedback<A, B, I, S> = CombinedFeedback<A, B, LogicFastAnd, I, S>;
|
pub type FastAndFeedback<A, B, I, S> = CombinedFeedback<A, B, LogicFastAnd, I, S>;
|
||||||
|
|
||||||
/// Combine two feedbacks with an eager OR operation,
|
/// Combine two feedbacks with an eager OR operation,
|
||||||
/// will call all feedbacks functions even if not necessery to conclude the result
|
/// will call all feedbacks functions even if not necessary to conclude the result
|
||||||
pub type EagerOrFeedback<A, B, I, S> = CombinedFeedback<A, B, LogicEagerOr, I, S>;
|
pub type EagerOrFeedback<A, B, I, S> = CombinedFeedback<A, B, LogicEagerOr, I, S>;
|
||||||
|
|
||||||
/// Combine two feedbacks with an fast OR operation,
|
/// Combine two feedbacks with an fast OR operation,
|
||||||
/// might skip calling feedbacks functions if not necessery to conclude the result
|
/// might skip calling feedbacks functions if not necessary to conclude the result.
|
||||||
/// This means any feedback that is not first might be skipped, use caution when using with
|
/// This means any feedback that is not first might be skipped, use caution when using with
|
||||||
/// `TimeFeedback`
|
/// `TimeFeedback`
|
||||||
pub type FastOrFeedback<A, B, I, S> = CombinedFeedback<A, B, LogicFastOr, I, S>;
|
pub type FastOrFeedback<A, B, I, S> = CombinedFeedback<A, B, LogicFastOr, I, S>;
|
||||||
@ -829,7 +829,7 @@ impl Default for TimeoutFeedback {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Nop feedback that annotates execution time in the new testcase, if any
|
/// Nop feedback that annotates execution time in the new testcase, if any
|
||||||
/// for this Feedback, the testcase is never interesting (use with an OR)
|
/// for this Feedback, the testcase is never interesting (use with an OR).
|
||||||
/// It decides, if the given [`TimeObserver`] value of a run is interesting.
|
/// It decides, if the given [`TimeObserver`] value of a run is interesting.
|
||||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||||
pub struct TimeFeedback {
|
pub struct TimeFeedback {
|
||||||
|
@ -33,7 +33,7 @@ where
|
|||||||
/// The scheduler
|
/// The scheduler
|
||||||
fn scheduler(&self) -> &CS;
|
fn scheduler(&self) -> &CS;
|
||||||
|
|
||||||
/// The scheduler (mut)
|
/// The scheduler (mutable)
|
||||||
fn scheduler_mut(&mut self) -> &mut CS;
|
fn scheduler_mut(&mut self) -> &mut CS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ where
|
|||||||
/// The feedback
|
/// The feedback
|
||||||
fn feedback(&self) -> &F;
|
fn feedback(&self) -> &F;
|
||||||
|
|
||||||
/// The feedback (mut)
|
/// The feedback (mutable)
|
||||||
fn feedback_mut(&mut self) -> &mut F;
|
fn feedback_mut(&mut self) -> &mut F;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,7 +61,7 @@ where
|
|||||||
/// The objective feedback
|
/// The objective feedback
|
||||||
fn objective(&self) -> &OF;
|
fn objective(&self) -> &OF;
|
||||||
|
|
||||||
/// The objective feedback (mut)
|
/// The objective feedback (mutable)
|
||||||
fn objective_mut(&mut self) -> &mut OF;
|
fn objective_mut(&mut self) -> &mut OF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,7 +85,7 @@ where
|
|||||||
EM: EventFirer<I>;
|
EM: EventFirer<I>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Evaluate an input modyfing the state of the fuzzer
|
/// Evaluate an input modifying the state of the fuzzer
|
||||||
pub trait EvaluatorObservers<I, OT, S>: Sized
|
pub trait EvaluatorObservers<I, OT, S>: Sized
|
||||||
where
|
where
|
||||||
I: Input,
|
I: Input,
|
||||||
@ -106,7 +106,7 @@ where
|
|||||||
EM: EventManager<E, I, S, Self>;
|
EM: EventManager<E, I, S, Self>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Evaluate an input modyfing the state of the fuzzer
|
/// Evaluate an input modifying the state of the fuzzer
|
||||||
pub trait Evaluator<E, EM, I, S> {
|
pub trait Evaluator<E, EM, I, S> {
|
||||||
/// Runs the input and triggers observers and feedback,
|
/// Runs the input and triggers observers and feedback,
|
||||||
/// returns if is interesting an (option) the index of the new testcase in the corpus
|
/// returns if is interesting an (option) the index of the new testcase in the corpus
|
||||||
@ -152,8 +152,8 @@ where
|
|||||||
EM: ProgressReporter<I>,
|
EM: ProgressReporter<I>,
|
||||||
S: HasExecutions + HasClientPerfMonitor,
|
S: HasExecutions + HasClientPerfMonitor,
|
||||||
{
|
{
|
||||||
/// Fuzz for a single iteration
|
/// Fuzz for a single iteration.
|
||||||
/// Returns the index of the last fuzzed corpus item
|
/// Returns the index of the last fuzzed corpus item.
|
||||||
///
|
///
|
||||||
/// If you use this fn in a restarting scenario to only run for `n` iterations,
|
/// If you use this fn in a restarting scenario to only run for `n` iterations,
|
||||||
/// before exiting, make sure you call `event_mgr.on_restart(&mut state)?;`.
|
/// before exiting, make sure you call `event_mgr.on_restart(&mut state)?;`.
|
||||||
@ -182,8 +182,8 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Fuzz for n iterations
|
/// Fuzz for n iterations.
|
||||||
/// Returns the index of the last fuzzed corpus item
|
/// Returns the index of the last fuzzed corpus item.
|
||||||
///
|
///
|
||||||
/// If you use this fn in a restarting scenario to only run for `n` iterations,
|
/// If you use this fn in a restarting scenario to only run for `n` iterations,
|
||||||
/// before exiting, make sure you call `event_mgr.on_restart(&mut state)?;`.
|
/// before exiting, make sure you call `event_mgr.on_restart(&mut state)?;`.
|
||||||
@ -225,7 +225,7 @@ where
|
|||||||
pub enum ExecuteInputResult {
|
pub enum ExecuteInputResult {
|
||||||
/// No special input
|
/// No special input
|
||||||
None,
|
None,
|
||||||
/// This input should be stored ini the corpus
|
/// This input should be stored in the corpus
|
||||||
Corpus,
|
Corpus,
|
||||||
/// This input leads to a solution
|
/// This input leads to a solution
|
||||||
Solution,
|
Solution,
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//! Gramamtron generator
|
//! Gramatron generator
|
||||||
use alloc::{string::String, vec::Vec};
|
use alloc::{string::String, vec::Vec};
|
||||||
use core::marker::PhantomData;
|
use core::marker::PhantomData;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@ -32,7 +32,7 @@ pub struct Automaton {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
/// Generates random inputs from a grammar automatron
|
/// Generates random inputs from a grammar automaton
|
||||||
pub struct GramatronGenerator<'a, S>
|
pub struct GramatronGenerator<'a, S>
|
||||||
where
|
where
|
||||||
S: HasRand,
|
S: HasRand,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
//! The `BytesInput` is the "normal" input, a map of bytes, that can be sent directly to the client
|
//! The `BytesInput` is the "normal" input, a map of bytes, that can be sent directly to the client
|
||||||
//! (As opposed to other, more abstract, imputs, like an Grammar-Based AST Input)
|
//! (As opposed to other, more abstract, inputs, like an Grammar-Based AST Input)
|
||||||
|
|
||||||
use ahash::AHasher;
|
use ahash::AHasher;
|
||||||
use alloc::{borrow::ToOwned, rc::Rc, string::String, vec::Vec};
|
use alloc::{borrow::ToOwned, rc::Rc, string::String, vec::Vec};
|
||||||
@ -33,7 +33,7 @@ impl Input for BytesInput {
|
|||||||
write_file_atomic(path, &self.bytes)
|
write_file_atomic(path, &self.bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Load the contents of this input from a file
|
/// Load the content of this input from a file
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
fn from_file<P>(path: P) -> Result<Self, Error>
|
fn from_file<P>(path: P) -> Result<Self, Error>
|
||||||
where
|
where
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
//! The `EncodedInput` is the "normal" input, a map of codes, that can be sent directly to the client
|
//! The `EncodedInput` is the "normal" input, a map of codes, that can be sent directly to the client
|
||||||
//! (As opposed to other, more abstract, imputs, like an Grammar-Based AST Input)
|
//! (As opposed to other, more abstract, inputs, like an Grammar-Based AST Input)
|
||||||
//! See also [the paper on token-level fuzzing](https://www.usenix.org/system/files/sec21-salls.pdf)
|
//! See also [the paper on token-level fuzzing](https://www.usenix.org/system/files/sec21-salls.pdf)
|
||||||
|
|
||||||
use ahash::AHasher;
|
use ahash::AHasher;
|
||||||
@ -32,9 +32,9 @@ pub trait InputDecoder {
|
|||||||
fn decode(&self, input: &EncodedInput, bytes: &mut Vec<u8>) -> Result<(), Error>;
|
fn decode(&self, input: &EncodedInput, bytes: &mut Vec<u8>) -> Result<(), Error>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Tokenizer is a trait that can tokenize bytes into a ][`Vec`] of tokens
|
/// Tokenizer is a trait that can tokenize bytes into a [`Vec`] of tokens
|
||||||
pub trait Tokenizer {
|
pub trait Tokenizer {
|
||||||
/// Tokanize the given bytes
|
/// Tokenize the given bytes
|
||||||
fn tokenize(&self, bytes: &[u8]) -> Result<Vec<String>, Error>;
|
fn tokenize(&self, bytes: &[u8]) -> Result<Vec<String>, Error>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,13 +101,13 @@ impl Default for TokenInputEncoderDecoder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A native tokenizer struct
|
/// A naive tokenizer struct
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct NaiveTokenizer {
|
pub struct NaiveTokenizer {
|
||||||
/// Ident regex
|
/// Ident regex
|
||||||
ident_re: Regex,
|
ident_re: Regex,
|
||||||
/// Comement regex
|
/// Comment regex
|
||||||
comment_re: Regex,
|
comment_re: Regex,
|
||||||
/// String regex
|
/// String regex
|
||||||
string_re: Regex,
|
string_re: Regex,
|
||||||
|
@ -200,7 +200,7 @@ impl GeneralizedInput {
|
|||||||
self.generalized.as_deref()
|
self.generalized.as_deref()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the generalized input (mut)
|
/// Get the generalized input (mutable)
|
||||||
pub fn generalized_mut(&mut self) -> &mut Option<Vec<GeneralizedItem>> {
|
pub fn generalized_mut(&mut self) -> &mut Option<Vec<GeneralizedItem>> {
|
||||||
&mut self.generalized
|
&mut self.generalized
|
||||||
}
|
}
|
||||||
|
@ -91,7 +91,7 @@ impl GramatronInput {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// crop the value to the given length
|
/// Crop the value to the given length
|
||||||
pub fn crop(&self, from: usize, to: usize) -> Result<Self, Error> {
|
pub fn crop(&self, from: usize, to: usize) -> Result<Self, Error> {
|
||||||
if from < to && to <= self.terms.len() {
|
if from < to && to <= self.terms.len() {
|
||||||
let mut terms = vec![];
|
let mut terms = vec![];
|
||||||
|
@ -61,7 +61,7 @@ pub trait Input: Clone + Serialize + serde::de::DeserializeOwned + Debug + Hash
|
|||||||
write_file_atomic(path, &postcard::to_allocvec(self)?)
|
write_file_atomic(path, &postcard::to_allocvec(self)?)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Load the contents of this input from a file
|
/// Load the content of this input from a file
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
fn from_file<P>(path: P) -> Result<Self, Error>
|
fn from_file<P>(path: P) -> Result<Self, Error>
|
||||||
where
|
where
|
||||||
@ -95,8 +95,8 @@ impl HasTargetBytes for NopInput {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO change this to fn target_bytes(&self, buffer: &mut Vec<u8>) -> &[u8];
|
// TODO change this to fn target_bytes(&self, buffer: &mut Vec<u8>) -> &[u8];
|
||||||
/// Can be represented with a vector of bytes
|
/// Can be represented with a vector of bytes.
|
||||||
/// This representation is not necessarily deserializable
|
/// This representation is not necessarily deserializable.
|
||||||
/// Instead, it can be used as bytes input for a target
|
/// Instead, it can be used as bytes input for a target
|
||||||
pub trait HasTargetBytes {
|
pub trait HasTargetBytes {
|
||||||
/// Target bytes, that can be written to a target
|
/// Target bytes, that can be written to a target
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//! Keep stats, and dispaly them to the user. Usually used in a broker, or main node, of some sort.
|
//! Keep stats, and display them to the user. Usually used in a broker, or main node, of some sort.
|
||||||
|
|
||||||
pub mod multi;
|
pub mod multi;
|
||||||
pub use multi::MultiMonitor;
|
pub use multi::MultiMonitor;
|
||||||
@ -145,18 +145,18 @@ impl ClientStats {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The monitor trait keeps track of all the client's monitor, and offers methods to dispaly them.
|
/// The monitor trait keeps track of all the client's monitor, and offers methods to display them.
|
||||||
pub trait Monitor {
|
pub trait Monitor {
|
||||||
/// the client monitor (mut)
|
/// The client monitor (mutable)
|
||||||
fn client_stats_mut(&mut self) -> &mut Vec<ClientStats>;
|
fn client_stats_mut(&mut self) -> &mut Vec<ClientStats>;
|
||||||
|
|
||||||
/// the client monitor
|
/// The client monitor
|
||||||
fn client_stats(&self) -> &[ClientStats];
|
fn client_stats(&self) -> &[ClientStats];
|
||||||
|
|
||||||
/// creation time
|
/// Creation time
|
||||||
fn start_time(&mut self) -> Duration;
|
fn start_time(&mut self) -> Duration;
|
||||||
|
|
||||||
/// show the monitor to the user
|
/// Show the monitor to the user
|
||||||
fn display(&mut self, event_msg: String, sender_id: u32);
|
fn display(&mut self, event_msg: String, sender_id: u32);
|
||||||
|
|
||||||
/// Amount of elements in the corpus (combined for all children)
|
/// Amount of elements in the corpus (combined for all children)
|
||||||
@ -212,12 +212,12 @@ pub struct NopMonitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Monitor for NopMonitor {
|
impl Monitor for NopMonitor {
|
||||||
/// the client monitor, mutable
|
/// The client monitor, mutable
|
||||||
fn client_stats_mut(&mut self) -> &mut Vec<ClientStats> {
|
fn client_stats_mut(&mut self) -> &mut Vec<ClientStats> {
|
||||||
&mut self.client_stats
|
&mut self.client_stats
|
||||||
}
|
}
|
||||||
|
|
||||||
/// the client monitor
|
/// The client monitor
|
||||||
fn client_stats(&self) -> &[ClientStats] {
|
fn client_stats(&self) -> &[ClientStats] {
|
||||||
&self.client_stats
|
&self.client_stats
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//! Monitor to disply both cumulative and per-client monitor
|
//! Monitor to display both cumulative and per-client monitor
|
||||||
|
|
||||||
use alloc::{string::String, vec::Vec};
|
use alloc::{string::String, vec::Vec};
|
||||||
use core::time::Duration;
|
use core::time::Duration;
|
||||||
|
@ -15,10 +15,10 @@ use core::{
|
|||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
/// A Struct for managing MOpt-mutator parameters
|
/// A Struct for managing MOpt-mutator parameters.
|
||||||
/// There are 2 modes for `MOpt` scheduler, the core fuzzing mode and the pilot fuzzing mode
|
/// There are 2 modes for `MOpt` scheduler, the core fuzzing mode and the pilot fuzzing mode.
|
||||||
/// In short, in the pilot fuzzing mode, the fuzzer employs several `swarms` to compute the probability to choose the mutation operator
|
/// In short, in the pilot fuzzing mode, the fuzzer employs several `swarms` to compute the probability to choose the mutation operator.
|
||||||
/// On the other hand, in the core fuzzing mode, the fuzzer chooses the best `swarms`, which was determined during the pilot fuzzing mode, to compute the probability to choose the operation operator
|
/// On the other hand, in the core fuzzing mode, the fuzzer chooses the best `swarms`, which was determined during the pilot fuzzing mode, to compute the probability to choose the operation operator.
|
||||||
/// With the current implementation we are always in the pacemaker fuzzing mode.
|
/// With the current implementation we are always in the pacemaker fuzzing mode.
|
||||||
#[derive(Serialize, Deserialize, Clone)]
|
#[derive(Serialize, Deserialize, Clone)]
|
||||||
pub struct MOpt {
|
pub struct MOpt {
|
||||||
@ -620,7 +620,7 @@ where
|
|||||||
&self.mutations
|
&self.mutations
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the mutations (mut)
|
// Get the mutations (mutable)
|
||||||
#[inline]
|
#[inline]
|
||||||
fn mutations_mut(&mut self) -> &mut MT {
|
fn mutations_mut(&mut self) -> &mut MT {
|
||||||
&mut self.mutations
|
&mut self.mutations
|
||||||
|
@ -62,7 +62,7 @@ where
|
|||||||
/// Get the mutations
|
/// Get the mutations
|
||||||
fn mutations(&self) -> &MT;
|
fn mutations(&self) -> &MT;
|
||||||
|
|
||||||
/// Get the mutations (mut)
|
/// Get the mutations (mutable)
|
||||||
fn mutations_mut(&mut self) -> &mut MT;
|
fn mutations_mut(&mut self) -> &mut MT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ where
|
|||||||
/// Get the next mutation to apply
|
/// Get the next mutation to apply
|
||||||
fn schedule(&self, state: &mut S, input: &I) -> usize;
|
fn schedule(&self, state: &mut S, input: &I) -> usize;
|
||||||
|
|
||||||
/// New default implementation for mutate
|
/// New default implementation for mutate.
|
||||||
/// Implementations must forward mutate() to this method
|
/// Implementations must forward mutate() to this method
|
||||||
fn scheduled_mutate(
|
fn scheduled_mutate(
|
||||||
&mut self,
|
&mut self,
|
||||||
@ -158,7 +158,7 @@ where
|
|||||||
&self.mutations
|
&self.mutations
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the mutations (mut)
|
// Get the mutations (mutable)
|
||||||
#[inline]
|
#[inline]
|
||||||
fn mutations_mut(&mut self) -> &mut MT {
|
fn mutations_mut(&mut self) -> &mut MT {
|
||||||
&mut self.mutations
|
&mut self.mutations
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//! Tokens are what afl calls extras or dictionaries.
|
//! Tokens are what AFL calls extras or dictionaries.
|
||||||
//! They may be inserted as part of mutations during fuzzing.
|
//! They may be inserted as part of mutations during fuzzing.
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
use crate::mutators::str_decode;
|
use crate::mutators::str_decode;
|
||||||
@ -412,7 +412,7 @@ impl TokenReplace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// A `I2SRandReplace` [`Mutator`] replaces a random matching input-2-state comparison operand with the other.
|
/// A `I2SRandReplace` [`Mutator`] replaces a random matching input-2-state comparison operand with the other.
|
||||||
/// it needs a valid [`CmpValuesMetadata`] in the state.
|
/// It needs a valid [`CmpValuesMetadata`] in the state.
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
pub struct I2SRandReplace;
|
pub struct I2SRandReplace;
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ where
|
|||||||
/// Get the `CmpMap`
|
/// Get the `CmpMap`
|
||||||
fn cmp_map(&self) -> &CM;
|
fn cmp_map(&self) -> &CM;
|
||||||
|
|
||||||
/// Get the `CmpMap` (mut)
|
/// Get the `CmpMap` (mutable)
|
||||||
fn cmp_map_mut(&mut self) -> &mut CM;
|
fn cmp_map_mut(&mut self) -> &mut CM;
|
||||||
|
|
||||||
/// Add [`struct@CmpValuesMetadata`] to the State including the logged values.
|
/// Add [`struct@CmpValuesMetadata`] to the State including the logged values.
|
||||||
|
@ -16,7 +16,7 @@ use serde::{Deserialize, Serialize};
|
|||||||
pub type SymExprRef = NonZeroUsize;
|
pub type SymExprRef = NonZeroUsize;
|
||||||
|
|
||||||
/// [`Location`]s are code locations encountered during concolic tracing, that are constructed from pointers, but not always in a meaningful way.
|
/// [`Location`]s are code locations encountered during concolic tracing, that are constructed from pointers, but not always in a meaningful way.
|
||||||
/// Therefore, a location is an opague value that can only be compared against itself.
|
/// Therefore, a location is an opaque value that can only be compared against itself.
|
||||||
///
|
///
|
||||||
/// It is possible to get at the underlying value using [`Into::into`], should this restriction be too inflexible for your usecase.
|
/// It is possible to get at the underlying value using [`Into::into`], should this restriction be too inflexible for your usecase.
|
||||||
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
|
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
|
||||||
|
@ -446,7 +446,7 @@ pub const DEFAULT_ENV_NAME: &str = "SHARED_MEMORY_MESSAGES";
|
|||||||
/// The default shared memory size used by the concolic tracing.
|
/// The default shared memory size used by the concolic tracing.
|
||||||
///
|
///
|
||||||
/// This amounts to 1GiB of memory, which is considered to be enough for any reasonable trace. It is also assumed
|
/// This amounts to 1GiB of memory, which is considered to be enough for any reasonable trace. It is also assumed
|
||||||
/// that the memory will not be phsyically mapped until accessed, alleviating reource concerns.
|
/// that the memory will not be physically mapped until accessed, alleviating resource concerns.
|
||||||
pub const DEFAULT_SIZE: usize = 1024 * 1024 * 1024;
|
pub const DEFAULT_SIZE: usize = 1024 * 1024 * 1024;
|
||||||
|
|
||||||
impl<'buffer> MessageFileReader<Cursor<&'buffer [u8]>> {
|
impl<'buffer> MessageFileReader<Cursor<&'buffer [u8]>> {
|
||||||
|
@ -37,7 +37,7 @@ fn hash_slice<T: PrimInt>(slice: &[T]) -> u64 {
|
|||||||
hasher.finish()
|
hasher.finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A [`MapObserver`] observes the static map, as oftentimes used for afl-like coverage information
|
/// A [`MapObserver`] observes the static map, as oftentimes used for AFL-like coverage information
|
||||||
pub trait MapObserver: HasLen + Named + Serialize + serde::de::DeserializeOwned + Debug {
|
pub trait MapObserver: HasLen + Named + Serialize + serde::de::DeserializeOwned + Debug {
|
||||||
/// Type of each entry in this map
|
/// Type of each entry in this map
|
||||||
type Entry: PrimInt + Default + Copy + Debug;
|
type Entry: PrimInt + Default + Copy + Debug;
|
||||||
@ -70,7 +70,7 @@ pub trait MapObserver: HasLen + Named + Serialize + serde::de::DeserializeOwned
|
|||||||
/// Get the initial value for reset()
|
/// Get the initial value for reset()
|
||||||
fn initial(&self) -> Self::Entry;
|
fn initial(&self) -> Self::Entry;
|
||||||
|
|
||||||
/// Get the initial value for reset()
|
/// Get the initial value for reset() (mutable)
|
||||||
fn initial_mut(&mut self) -> &mut Self::Entry;
|
fn initial_mut(&mut self) -> &mut Self::Entry;
|
||||||
|
|
||||||
/// Set the initial value for reset()
|
/// Set the initial value for reset()
|
||||||
|
@ -49,7 +49,7 @@ pub trait Observer<I, S>: Named + Debug {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Called right after execution finish.
|
/// Called right after execution finishes.
|
||||||
#[inline]
|
#[inline]
|
||||||
fn post_exec(
|
fn post_exec(
|
||||||
&mut self,
|
&mut self,
|
||||||
@ -66,7 +66,7 @@ pub trait Observer<I, S>: Named + Debug {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Called right after execution finish in the child process, if any.
|
/// Called right after execution finishes in the child process, if any.
|
||||||
#[inline]
|
#[inline]
|
||||||
fn post_exec_child(
|
fn post_exec_child(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
@ -4,7 +4,7 @@ A well-known [`Stage`], for example, is the mutational stage, running multiple [
|
|||||||
Other stages may enrich [`crate::corpus::Testcase`]s with metadata.
|
Other stages may enrich [`crate::corpus::Testcase`]s with metadata.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/// Mutational stage is the normal fuzzing stage,
|
/// Mutational stage is the normal fuzzing stage.
|
||||||
pub mod mutational;
|
pub mod mutational;
|
||||||
pub use mutational::{MutationalStage, StdMutationalStage};
|
pub use mutational::{MutationalStage, StdMutationalStage};
|
||||||
|
|
||||||
@ -193,7 +193,7 @@ where
|
|||||||
S: HasClientPerfMonitor + HasCorpus<I> + HasRand + HasExecutions,
|
S: HasClientPerfMonitor + HasCorpus<I> + HasRand + HasExecutions,
|
||||||
Z: ExecutionProcessor<I, OT, S> + EvaluatorObservers<I, OT, S> + HasCorpusScheduler<CS, I, S>,
|
Z: ExecutionProcessor<I, OT, S> + EvaluatorObservers<I, OT, S> + HasCorpusScheduler<CS, I, S>,
|
||||||
{
|
{
|
||||||
/// Create a new [`PushStageAdapter`], warpping the given [`PushStage`]
|
/// Create a new [`PushStageAdapter`], wrapping the given [`PushStage`]
|
||||||
/// to be used as a normal [`Stage`]
|
/// to be used as a normal [`Stage`]
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn new(push_stage: PS) -> Self {
|
pub fn new(push_stage: PS) -> Self {
|
||||||
|
@ -77,7 +77,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Default value, how many iterations each stage gets, as an upper bound
|
/// Default value, how many iterations each stage gets, as an upper bound.
|
||||||
/// It may randomly continue earlier.
|
/// It may randomly continue earlier.
|
||||||
pub static DEFAULT_MUTATIONAL_MAX_ITERATIONS: u64 = 128;
|
pub static DEFAULT_MUTATIONAL_MAX_ITERATIONS: u64 = 128;
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
//! The push stage relies on internal muttability of the supplied `Observers`.
|
//! The push stage relies on internal muttability of the supplied `Observers`.
|
||||||
//!
|
//!
|
||||||
|
|
||||||
/// Mutational stage is the normal fuzzing stage,
|
/// Mutational stage is the normal fuzzing stage.
|
||||||
pub mod mutational;
|
pub mod mutational;
|
||||||
pub use mutational::StdMutationalPushStage;
|
pub use mutational::StdMutationalPushStage;
|
||||||
|
|
||||||
@ -93,7 +93,7 @@ where
|
|||||||
/// The shared state, keeping track of the corpus and the fuzzer
|
/// The shared state, keeping track of the corpus and the fuzzer
|
||||||
#[allow(clippy::type_complexity)]
|
#[allow(clippy::type_complexity)]
|
||||||
pub shared_state: Rc<RefCell<Option<PushStageSharedState<CS, EM, I, OT, S, Z>>>>,
|
pub shared_state: Rc<RefCell<Option<PushStageSharedState<CS, EM, I, OT, S, Z>>>>,
|
||||||
/// If the last iteraation failed
|
/// If the last iteration failed
|
||||||
pub errored: bool,
|
pub errored: bool,
|
||||||
|
|
||||||
/// The corpus index we're currently working on
|
/// The corpus index we're currently working on
|
||||||
@ -191,10 +191,10 @@ where
|
|||||||
{
|
{
|
||||||
/// Gets the [`PushStageHelper`]
|
/// Gets the [`PushStageHelper`]
|
||||||
fn push_stage_helper(&self) -> &PushStageHelper<CS, EM, I, OT, S, Z>;
|
fn push_stage_helper(&self) -> &PushStageHelper<CS, EM, I, OT, S, Z>;
|
||||||
/// Gets the [`PushStageHelper`], mut
|
/// Gets the [`PushStageHelper`] (mutable)
|
||||||
fn push_stage_helper_mut(&mut self) -> &mut PushStageHelper<CS, EM, I, OT, S, Z>;
|
fn push_stage_helper_mut(&mut self) -> &mut PushStageHelper<CS, EM, I, OT, S, Z>;
|
||||||
|
|
||||||
/// Set the current corpus index this stagve works on
|
/// Set the current corpus index this stage works on
|
||||||
fn set_current_corpus_idx(&mut self, corpus_idx: usize) {
|
fn set_current_corpus_idx(&mut self, corpus_idx: usize) {
|
||||||
self.push_stage_helper_mut().current_corpus_idx = Some(corpus_idx);
|
self.push_stage_helper_mut().current_corpus_idx = Some(corpus_idx);
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ pub static DEFAULT_MUTATIONAL_MAX_ITERATIONS: u64 = 128;
|
|||||||
/// being applied to the input one by one, between executions.
|
/// being applied to the input one by one, between executions.
|
||||||
/// The push version, in contrast to the normal stage, will return each testcase, instead of executing it.
|
/// The push version, in contrast to the normal stage, will return each testcase, instead of executing it.
|
||||||
///
|
///
|
||||||
/// Default value, how many iterations each stage gets, as an upper bound
|
/// Default value, how many iterations each stage gets, as an upper bound.
|
||||||
/// It may randomly continue earlier.
|
/// It may randomly continue earlier.
|
||||||
///
|
///
|
||||||
/// The default mutational push stage
|
/// The default mutational push stage
|
||||||
|
@ -26,8 +26,8 @@ use crate::{
|
|||||||
/// The maximum size of a testcase
|
/// The maximum size of a testcase
|
||||||
pub const DEFAULT_MAX_SIZE: usize = 1_048_576;
|
pub const DEFAULT_MAX_SIZE: usize = 1_048_576;
|
||||||
|
|
||||||
/// The [`State`] of the fuzzer
|
/// The [`State`] of the fuzzer.
|
||||||
/// Contains all important information about the current run
|
/// Contains all important information about the current run.
|
||||||
/// Will be used to restart the fuzzing process at any timme.
|
/// Will be used to restart the fuzzing process at any timme.
|
||||||
pub trait State: Serialize + DeserializeOwned {}
|
pub trait State: Serialize + DeserializeOwned {}
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ pub trait HasCorpus<I: Input> {
|
|||||||
type Corpus: Corpus<I>;
|
type Corpus: Corpus<I>;
|
||||||
/// The testcase corpus
|
/// The testcase corpus
|
||||||
fn corpus(&self) -> &Self::Corpus;
|
fn corpus(&self) -> &Self::Corpus;
|
||||||
/// The testcase corpus (mut)
|
/// The testcase corpus (mutable)
|
||||||
fn corpus_mut(&mut self) -> &mut Self::Corpus;
|
fn corpus_mut(&mut self) -> &mut Self::Corpus;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ pub trait HasSolutions<I: Input> {
|
|||||||
type Solutions: Corpus<I>;
|
type Solutions: Corpus<I>;
|
||||||
/// The solutions corpus
|
/// The solutions corpus
|
||||||
fn solutions(&self) -> &Self::Solutions;
|
fn solutions(&self) -> &Self::Solutions;
|
||||||
/// The solutions corpus (mut)
|
/// The solutions corpus (mutable)
|
||||||
fn solutions_mut(&mut self) -> &mut Self::Solutions;
|
fn solutions_mut(&mut self) -> &mut Self::Solutions;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,7 +65,7 @@ pub trait HasRand {
|
|||||||
type Rand: Rand;
|
type Rand: Rand;
|
||||||
/// The rand instance
|
/// The rand instance
|
||||||
fn rand(&self) -> &Self::Rand;
|
fn rand(&self) -> &Self::Rand;
|
||||||
/// The rand instance (mut)
|
/// The rand instance (mutable)
|
||||||
fn rand_mut(&mut self) -> &mut Self::Rand;
|
fn rand_mut(&mut self) -> &mut Self::Rand;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ pub trait HasClientPerfMonitor {
|
|||||||
/// This node's stability
|
/// This node's stability
|
||||||
fn stability(&self) -> &Option<f32>;
|
fn stability(&self) -> &Option<f32>;
|
||||||
|
|
||||||
/// This node's stability (mut)
|
/// This node's stability (mutable)
|
||||||
fn stability_mut(&mut self) -> &mut Option<f32>;
|
fn stability_mut(&mut self) -> &mut Option<f32>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,7 +88,7 @@ pub trait HasClientPerfMonitor {
|
|||||||
pub trait HasMetadata {
|
pub trait HasMetadata {
|
||||||
/// A map, storing all metadata
|
/// A map, storing all metadata
|
||||||
fn metadata(&self) -> &SerdeAnyMap;
|
fn metadata(&self) -> &SerdeAnyMap;
|
||||||
/// A map, storing all metadata (mut)
|
/// A map, storing all metadata (mutable)
|
||||||
fn metadata_mut(&mut self) -> &mut SerdeAnyMap;
|
fn metadata_mut(&mut self) -> &mut SerdeAnyMap;
|
||||||
|
|
||||||
/// Add a metadata to the metadata map
|
/// Add a metadata to the metadata map
|
||||||
@ -117,7 +117,7 @@ pub trait HasFeedbackStates {
|
|||||||
/// The feedback states
|
/// The feedback states
|
||||||
fn feedback_states(&self) -> &Self::FeedbackStates;
|
fn feedback_states(&self) -> &Self::FeedbackStates;
|
||||||
|
|
||||||
/// The feedback states (mut)
|
/// The feedback states (mutable)
|
||||||
fn feedback_states_mut(&mut self) -> &mut Self::FeedbackStates;
|
fn feedback_states_mut(&mut self) -> &mut Self::FeedbackStates;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,7 +126,7 @@ pub trait HasExecutions {
|
|||||||
/// The executions counter
|
/// The executions counter
|
||||||
fn executions(&self) -> &usize;
|
fn executions(&self) -> &usize;
|
||||||
|
|
||||||
/// The executions counter (mut)
|
/// The executions counter (mutable)
|
||||||
fn executions_mut(&mut self) -> &mut usize;
|
fn executions_mut(&mut self) -> &mut usize;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +135,7 @@ pub trait HasStartTime {
|
|||||||
/// The starting time
|
/// The starting time
|
||||||
fn start_time(&self) -> &Duration;
|
fn start_time(&self) -> &Duration;
|
||||||
|
|
||||||
/// The starting time (mut)
|
/// The starting time (mutable)
|
||||||
fn start_time_mut(&mut self) -> &mut Duration;
|
fn start_time_mut(&mut self) -> &mut Duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,7 +202,7 @@ where
|
|||||||
&self.rand
|
&self.rand
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The rand instance (mut)
|
/// The rand instance (mutable)
|
||||||
#[inline]
|
#[inline]
|
||||||
fn rand_mut(&mut self) -> &mut Self::Rand {
|
fn rand_mut(&mut self) -> &mut Self::Rand {
|
||||||
&mut self.rand
|
&mut self.rand
|
||||||
@ -248,7 +248,7 @@ where
|
|||||||
&self.solutions
|
&self.solutions
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the solutions corpus (mut)
|
/// Returns the solutions corpus (mutable)
|
||||||
#[inline]
|
#[inline]
|
||||||
fn solutions_mut(&mut self) -> &mut SC {
|
fn solutions_mut(&mut self) -> &mut SC {
|
||||||
&mut self.solutions
|
&mut self.solutions
|
||||||
@ -292,7 +292,7 @@ where
|
|||||||
&self.feedback_states
|
&self.feedback_states
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The feedback states (mut)
|
/// The feedback states (mutable)
|
||||||
#[inline]
|
#[inline]
|
||||||
fn feedback_states_mut(&mut self) -> &mut FT {
|
fn feedback_states_mut(&mut self) -> &mut FT {
|
||||||
&mut self.feedback_states
|
&mut self.feedback_states
|
||||||
@ -313,7 +313,7 @@ where
|
|||||||
&self.executions
|
&self.executions
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The executions counter (mut)
|
/// The executions counter (mutable)
|
||||||
#[inline]
|
#[inline]
|
||||||
fn executions_mut(&mut self) -> &mut usize {
|
fn executions_mut(&mut self) -> &mut usize {
|
||||||
&mut self.executions
|
&mut self.executions
|
||||||
@ -351,7 +351,7 @@ where
|
|||||||
&self.start_time
|
&self.start_time
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The starting time (mut)
|
/// The starting time (mutable)
|
||||||
#[inline]
|
#[inline]
|
||||||
fn start_time_mut(&mut self) -> &mut Duration {
|
fn start_time_mut(&mut self) -> &mut Duration {
|
||||||
&mut self.start_time
|
&mut self.start_time
|
||||||
@ -367,7 +367,7 @@ where
|
|||||||
FT: FeedbackStatesTuple,
|
FT: FeedbackStatesTuple,
|
||||||
SC: Corpus<I>,
|
SC: Corpus<I>,
|
||||||
{
|
{
|
||||||
/// loads inputs from a directory
|
/// Loads inputs from a directory.
|
||||||
/// If `forced` is `true`, the value will be loaded,
|
/// If `forced` is `true`, the value will be loaded,
|
||||||
/// even if it's not considered to be `interesting`.
|
/// even if it's not considered to be `interesting`.
|
||||||
pub fn load_from_directory<E, EM, Z>(
|
pub fn load_from_directory<E, EM, Z>(
|
||||||
@ -602,7 +602,7 @@ where
|
|||||||
&self.stability
|
&self.stability
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This node's stability (mut)
|
/// This node's stability (mutable)
|
||||||
#[inline]
|
#[inline]
|
||||||
fn stability_mut(&mut self) -> &mut Option<f32> {
|
fn stability_mut(&mut self) -> &mut Option<f32> {
|
||||||
&mut self.stability
|
&mut self.stability
|
||||||
@ -632,7 +632,7 @@ where
|
|||||||
&self.stability
|
&self.stability
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This node's stability (mut)
|
/// This node's stability (mutable)
|
||||||
#[inline]
|
#[inline]
|
||||||
fn stability_mut(&mut self) -> &mut Option<f32> {
|
fn stability_mut(&mut self) -> &mut Option<f32> {
|
||||||
&mut self.stability
|
&mut self.stability
|
||||||
|
@ -327,7 +327,7 @@ impl AsanRuntime {
|
|||||||
&self.allocator
|
&self.allocator
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets the allocator, mut
|
/// Gets the allocator (mutable)
|
||||||
pub fn allocator_mut(&mut self) -> &mut Allocator {
|
pub fn allocator_mut(&mut self) -> &mut Allocator {
|
||||||
&mut self.allocator
|
&mut self.allocator
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user