Fix cfg uses across codebase (#2154)

* start fixup of cfgs

* whoops

* remaining issues

* maybe fixup macos

* apparently that is ios code?

* fix no_std

* Re-enable tcp_compression

* fix tcp broker

* remove tcp_debug flag

* fmt

* clippy

* less unwrap while we're at it

* doc

* add back pub star uses for libafl_qemu

---------

Co-authored-by: Dominik Maier <dmnk@google.com>
This commit is contained in:
Addison Crump 2024-05-08 14:31:10 +02:00 committed by GitHub
parent f6d2eaacb4
commit 614b149cae
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
43 changed files with 236 additions and 223 deletions

View File

@ -61,6 +61,9 @@ handle_sigpipe = []
## Enables `TcpEventManager`, a simple EventManager proxying everything via TCP. This uses `tokio`. ## Enables `TcpEventManager`, a simple EventManager proxying everything via TCP. This uses `tokio`.
tcp_manager = ["tokio", "std"] tcp_manager = ["tokio", "std"]
## Enables compression for the TCP manager
tcp_compression = ["tcp_manager", "libafl_bolts/gzip"]
## Enables the `NaiveTokenizer` and `StacktraceObserver` ## Enables the `NaiveTokenizer` and `StacktraceObserver`
regex = ["std", "dep:regex"] regex = ["std", "dep:regex"]

View File

@ -1,20 +1,20 @@
use std::error::Error; #![forbid(unexpected_cfgs)]
#[rustversion::nightly] #[rustversion::nightly]
#[allow(clippy::unnecessary_wraps)] fn nightly() {
fn main() -> Result<(), Box<dyn Error>> {
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rustc-cfg=nightly"); println!("cargo:rustc-cfg=nightly");
Ok(())
} }
#[rustversion::not(nightly)] #[rustversion::not(nightly)]
#[allow(clippy::unnecessary_wraps)] fn nightly() {
fn main() -> Result<(), Box<dyn Error>> {
println!("cargo:rerun-if-changed=build.rs");
assert!( assert!(
cfg!(all(not(docrs), not(feature = "nautilus"))), cfg!(all(not(docrs), not(feature = "nautilus"))),
"The 'nautilus' feature of libafl requires a nightly compiler" "The 'nautilus' feature of libafl requires a nightly compiler"
); );
Ok(()) }
fn main() {
println!("cargo:rustc-check-cfg=cfg(nightly)");
println!("cargo:rerun-if-changed=build.rs");
nightly();
} }

View File

@ -435,9 +435,9 @@ where
OnDiskMetadataFormat::Json => serde_json::to_vec(&ondisk_meta)?, OnDiskMetadataFormat::Json => serde_json::to_vec(&ondisk_meta)?,
OnDiskMetadataFormat::JsonPretty => serde_json::to_vec_pretty(&ondisk_meta)?, OnDiskMetadataFormat::JsonPretty => serde_json::to_vec_pretty(&ondisk_meta)?,
#[cfg(feature = "gzip")] #[cfg(feature = "gzip")]
OnDiskMetadataFormat::JsonGzip => GzipCompressor::new(0) OnDiskMetadataFormat::JsonGzip => {
.compress(&serde_json::to_vec_pretty(&ondisk_meta)?)? GzipCompressor::new().compress(&serde_json::to_vec_pretty(&ondisk_meta)?)
.unwrap(), }
}; };
tmpfile.write_all(&serialized)?; tmpfile.write_all(&serialized)?;
fs::rename(&tmpfile_path, &metafile_path)?; fs::rename(&tmpfile_path, &metafile_path)?;

View File

@ -86,7 +86,7 @@ where
Ok(Self { Ok(Self {
llmp, llmp,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
phantom: PhantomData, phantom: PhantomData,
}) })
} }
@ -100,7 +100,7 @@ where
// TODO switch to false after solving the bug // TODO switch to false after solving the bug
llmp: LlmpBroker::with_keep_pages_attach_to_tcp(shmem_provider, port, true)?, llmp: LlmpBroker::with_keep_pages_attach_to_tcp(shmem_provider, port, true)?,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
phantom: PhantomData, phantom: PhantomData,
}) })
} }
@ -475,7 +475,7 @@ where
inner, inner,
client, client,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
is_main, is_main,
}) })
} }
@ -492,7 +492,7 @@ where
inner, inner,
client, client,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
time_ref: time_obs.handle(), time_ref: time_obs.handle(),
is_main, is_main,
}) })
@ -509,7 +509,7 @@ where
inner, inner,
client, client,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
is_main, is_main,
}) })
} }
@ -531,7 +531,7 @@ where
inner, inner,
client, client,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
time_ref: time_obs.handle(), time_ref: time_obs.handle(),
is_main, is_main,
}) })
@ -550,7 +550,7 @@ where
inner, inner,
client: LlmpClient::on_existing_from_env(shmem_provider, env_name)?, client: LlmpClient::on_existing_from_env(shmem_provider, env_name)?,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
is_main, is_main,
}) })
} }
@ -569,7 +569,7 @@ where
inner, inner,
client: LlmpClient::on_existing_from_env(shmem_provider, env_name)?, client: LlmpClient::on_existing_from_env(shmem_provider, env_name)?,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
time_ref: time_obs.handle(), time_ref: time_obs.handle(),
is_main, is_main,
}) })
@ -587,7 +587,7 @@ where
inner, inner,
client: LlmpClient::existing_client_from_description(shmem_provider, description)?, client: LlmpClient::existing_client_from_description(shmem_provider, description)?,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
is_main, is_main,
}) })
} }
@ -605,7 +605,7 @@ where
inner, inner,
client: LlmpClient::existing_client_from_description(shmem_provider, description)?, client: LlmpClient::existing_client_from_description(shmem_provider, description)?,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
time_ref: time_obs.handle(), time_ref: time_obs.handle(),
is_main, is_main,
}) })
@ -642,7 +642,7 @@ where
let serialized = postcard::to_allocvec(event)?; let serialized = postcard::to_allocvec(event)?;
let flags = LLMP_FLAG_INITIALIZED; let flags = LLMP_FLAG_INITIALIZED;
match self.compressor.compress(&serialized)? { match self.compressor.maybe_compress(&serialized) {
Some(comp_buf) => { Some(comp_buf) => {
self.client.send_buf_with_flags( self.client.send_buf_with_flags(
_LLMP_TAG_TO_MAIN, _LLMP_TAG_TO_MAIN,

View File

@ -81,7 +81,7 @@ const _LLMP_TAG_RESTART: Tag = Tag(0x8357A87);
const _LLMP_TAG_NO_RESTART: Tag = Tag(0x57A7EE71); const _LLMP_TAG_NO_RESTART: Tag = Tag(0x57A7EE71);
/// The minimum buffer size at which to compress LLMP IPC messages. /// The minimum buffer size at which to compress LLMP IPC messages.
#[cfg(feature = "llmp_compression")] #[cfg(any(feature = "llmp_compression", feature = "tcp_compression"))]
pub const COMPRESS_THRESHOLD: usize = 1024; pub const COMPRESS_THRESHOLD: usize = 1024;
/// An LLMP-backed event manager for scalable multi-processed fuzzing /// An LLMP-backed event manager for scalable multi-processed fuzzing
@ -112,7 +112,7 @@ where
monitor, monitor,
llmp, llmp,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
phantom: PhantomData, phantom: PhantomData,
}) })
} }
@ -126,7 +126,7 @@ where
monitor, monitor,
llmp: llmp::LlmpBroker::create_attach_to_tcp(shmem_provider, port)?, llmp: llmp::LlmpBroker::create_attach_to_tcp(shmem_provider, port)?,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
phantom: PhantomData, phantom: PhantomData,
}) })
} }
@ -451,7 +451,7 @@ where
hooks: tuple_list!(), hooks: tuple_list!(),
llmp, llmp,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
configuration, configuration,
phantom: PhantomData, phantom: PhantomData,
custom_buf_handlers: vec![], custom_buf_handlers: vec![],
@ -506,7 +506,7 @@ where
hooks: tuple_list!(), hooks: tuple_list!(),
llmp, llmp,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
configuration, configuration,
serialization_time: Duration::ZERO, serialization_time: Duration::ZERO,
deserialization_time: Duration::ZERO, deserialization_time: Duration::ZERO,
@ -575,7 +575,7 @@ where
hooks, hooks,
llmp, llmp,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
configuration, configuration,
phantom: PhantomData, phantom: PhantomData,
custom_buf_handlers: vec![], custom_buf_handlers: vec![],
@ -636,7 +636,7 @@ where
hooks, hooks,
llmp, llmp,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
configuration, configuration,
serialization_time: Duration::ZERO, serialization_time: Duration::ZERO,
deserialization_time: Duration::ZERO, deserialization_time: Duration::ZERO,
@ -855,7 +855,7 @@ where
let serialized = postcard::to_allocvec(&event)?; let serialized = postcard::to_allocvec(&event)?;
let flags = LLMP_FLAG_INITIALIZED; let flags = LLMP_FLAG_INITIALIZED;
match self.compressor.compress(&serialized)? { match self.compressor.maybe_compress(&serialized) {
Some(comp_buf) => { Some(comp_buf) => {
self.llmp.send_buf_with_flags( self.llmp.send_buf_with_flags(
LLMP_TAG_EVENT_TO_BOTH, LLMP_TAG_EVENT_TO_BOTH,
@ -1761,7 +1761,7 @@ where
Ok(Self { Ok(Self {
llmp, llmp,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
converter, converter,
converter_back, converter_back,
phantom: PhantomData, phantom: PhantomData,
@ -1781,7 +1781,7 @@ where
Ok(Self { Ok(Self {
llmp, llmp,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
converter, converter,
converter_back, converter_back,
phantom: PhantomData, phantom: PhantomData,
@ -1800,7 +1800,7 @@ where
Ok(Self { Ok(Self {
llmp: LlmpClient::on_existing_from_env(shmem_provider, env_name)?, llmp: LlmpClient::on_existing_from_env(shmem_provider, env_name)?,
#[cfg(feature = "llmp_compression")] #[cfg(feature = "llmp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::with_threshold(COMPRESS_THRESHOLD),
phantom: PhantomData, phantom: PhantomData,
converter, converter,
converter_back, converter_back,
@ -1997,7 +1997,7 @@ where
let serialized = postcard::to_allocvec(&converted_event)?; let serialized = postcard::to_allocvec(&converted_event)?;
let flags = LLMP_FLAG_INITIALIZED; let flags = LLMP_FLAG_INITIALIZED;
match self.compressor.compress(&serialized)? { match self.compressor.maybe_compress(&serialized) {
Some(comp_buf) => { Some(comp_buf) => {
self.llmp.send_buf_with_flags( self.llmp.send_buf_with_flags(
LLMP_TAG_EVENT_TO_BOTH, LLMP_TAG_EVENT_TO_BOTH,

View File

@ -15,6 +15,8 @@ use std::{
sync::Arc, sync::Arc,
}; };
#[cfg(feature = "tcp_compression")]
use libafl_bolts::compress::GzipCompressor;
#[cfg(feature = "std")] #[cfg(feature = "std")]
use libafl_bolts::core_affinity::CoreId; use libafl_bolts::core_affinity::CoreId;
#[cfg(all(feature = "std", any(windows, not(feature = "fork"))))] #[cfg(all(feature = "std", any(windows, not(feature = "fork"))))]
@ -182,8 +184,7 @@ where
// we forward the sender id as well, so we add 4 bytes to the message length // we forward the sender id as well, so we add 4 bytes to the message length
len += 4; len += 4;
#[cfg(feature = "tcp_debug")] log::debug!("TCP Manager - len +4 = {len:?}");
println!("len +4 = {len:?}");
let mut buf = vec![0; len as usize]; let mut buf = vec![0; len as usize];
@ -198,8 +199,7 @@ where
return; return;
} }
#[cfg(feature = "tcp_debug")] log::debug!("TCP Manager - len: {len:?} - {buf:?}");
println!("len: {len:?} - {buf:?}");
tx_inner.send(buf).await.expect("Could not send"); tx_inner.send(buf).await.expect("Could not send");
} }
}; };
@ -232,8 +232,7 @@ where
_ => panic!("Could not receive"), _ => panic!("Could not receive"),
}; };
#[cfg(feature = "tcp_debug")] log::debug!("TCP Manager - {buf:?}");
println!("{buf:?}");
if buf.len() <= 4 { if buf.len() <= 4 {
log::warn!("We got no contents (or only the length) in a broadcast"); log::warn!("We got no contents (or only the length) in a broadcast");
@ -241,9 +240,7 @@ where
} }
if buf[..4] == this_client_id_bytes { if buf[..4] == this_client_id_bytes {
#[cfg(feature = "tcp_debug")] log::debug!("TCP Manager - Not forwarding message from this very client ({this_client_id:?})."
eprintln!(
"Not forwarding message from this very client ({this_client_id:?})."
); );
continue; continue;
} }
@ -287,8 +284,12 @@ where
// cut off the ID. // cut off the ID.
let event_bytes = &buf[4..]; let event_bytes = &buf[4..];
let event: Event<I> = postcard::from_bytes(event_bytes).unwrap(); #[cfg(feature = "tcp_compression")]
match Self::handle_in_broker(&mut self.monitor, client_id, &event).unwrap() { let event_bytes = GzipCompressor::new().decompress(event_bytes)?;
#[allow(clippy::needless_borrow)] // make decompressed vec and slice compatible
let event: Event<I> = postcard::from_bytes(&event_bytes)?;
match Self::handle_in_broker(&mut self.monitor, client_id, &event)? {
BrokerEventResult::Forward => { BrokerEventResult::Forward => {
tx_bc.send(buf).expect("Could not send"); tx_bc.send(buf).expect("Could not send");
} }
@ -300,9 +301,7 @@ where
break; break;
} }
} }
log::info!("TCP Manager - The last client quit. Exiting.");
#[cfg(feature = "tcp_debug")]
println!("The last client quit. Exiting.");
Err(Error::shutting_down()) Err(Error::shutting_down())
} }
@ -551,7 +550,7 @@ where
tcp, tcp,
client_id, client_id,
#[cfg(feature = "tcp_compression")] #[cfg(feature = "tcp_compression")]
compressor: GzipCompressor::new(COMPRESS_THRESHOLD), compressor: GzipCompressor::new(),
configuration, configuration,
phantom: PhantomData, phantom: PhantomData,
custom_buf_handlers: vec![], custom_buf_handlers: vec![],
@ -712,38 +711,17 @@ where
EMH: EventManagerHooksTuple<S>, EMH: EventManagerHooksTuple<S>,
S: State, S: State,
{ {
#[cfg(feature = "tcp_compression")]
fn fire( fn fire(
&mut self, &mut self,
_state: &mut Self::State, _state: &mut Self::State,
event: Event<<Self::State as UsesInput>::Input>, event: Event<<Self::State as UsesInput>::Input>,
) -> Result<(), Error> { ) -> Result<(), Error> {
let serialized = postcard::to_allocvec(&event)?; let serialized = postcard::to_allocvec(&event)?;
let flags = TCP_FLAG_INITIALIZED;
match self.compressor.compress(&serialized)? { #[cfg(feature = "tcp_compression")]
Some(comp_buf) => { let serialized = self.compressor.compress(&serialized);
self.tcp.send_buf_with_flags(
TCP_TAG_EVENT_TO_BOTH,
flags | TCP_FLAG_COMPRESSED,
&comp_buf,
)?;
}
None => {
self.tcp.send_buf(TCP_TAG_EVENT_TO_BOTH, &serialized)?;
}
}
Ok(())
}
#[cfg(not(feature = "tcp_compression"))] let size = u32::try_from(serialized.len())?;
fn fire(
&mut self,
_state: &mut Self::State,
event: Event<<Self::State as UsesInput>::Input>,
) -> Result<(), Error> {
let serialized = postcard::to_allocvec(&event)?;
let size = u32::try_from(serialized.len()).unwrap();
self.tcp.write_all(&size.to_le_bytes())?; self.tcp.write_all(&size.to_le_bytes())?;
self.tcp.write_all(&self.client_id.0.to_le_bytes())?; self.tcp.write_all(&self.client_id.0.to_le_bytes())?;
self.tcp.write_all(&serialized)?; self.tcp.write_all(&serialized)?;
@ -796,7 +774,7 @@ where
self.tcp.set_nonblocking(false).expect("set to blocking"); self.tcp.set_nonblocking(false).expect("set to blocking");
let len = u32::from_le_bytes(len_buf); let len = u32::from_le_bytes(len_buf);
let mut buf = vec![0_u8; len as usize + 4_usize]; let mut buf = vec![0_u8; len as usize + 4_usize];
self.tcp.read_exact(&mut buf).unwrap(); self.tcp.read_exact(&mut buf)?;
let mut client_id_buf = [0_u8; 4]; let mut client_id_buf = [0_u8; 4];
client_id_buf.copy_from_slice(&buf[..4]); client_id_buf.copy_from_slice(&buf[..4]);
@ -809,7 +787,14 @@ where
} else { } else {
log::info!("{self_id:?} (from {other_client_id:?}) Received: {buf:?}"); log::info!("{self_id:?} (from {other_client_id:?}) Received: {buf:?}");
let event = postcard::from_bytes(&buf[4..])?; let buf = &buf[4..];
#[cfg(feature = "tcp_compression")]
let buf = self.compressor.decompress(buf)?;
// make decompressed vec and slice compatible
#[allow(clippy::needless_borrow)]
let event = postcard::from_bytes(&buf)?;
self.handle_in_client(fuzzer, executor, state, other_client_id, event)?; self.handle_in_client(fuzzer, executor, state, other_client_id, event)?;
count += 1; count += 1;
} }

View File

@ -4,6 +4,7 @@ Welcome to `LibAFL`
#![doc = include_str!("../README.md")] #![doc = include_str!("../README.md")]
/*! */ /*! */
#![cfg_attr(feature = "document-features", doc = document_features::document_features!())] #![cfg_attr(feature = "document-features", doc = document_features::document_features!())]
#![forbid(unexpected_cfgs)]
#![allow(incomplete_features)] #![allow(incomplete_features)]
#![no_std] #![no_std]
// For `type_eq` // For `type_eq`

View File

@ -26,7 +26,7 @@ use core::{fmt::Debug, time::Duration};
#[cfg(feature = "std")] #[cfg(feature = "std")]
use std::time::Instant; use std::time::Instant;
#[cfg(feature = "no_std")] #[cfg(not(feature = "std"))]
use libafl_bolts::current_time; use libafl_bolts::current_time;
use libafl_bolts::{tuples::MatchName, Named}; use libafl_bolts::{tuples::MatchName, Named};
pub use list::*; pub use list::*;
@ -406,7 +406,7 @@ pub struct TimeObserver {
#[serde(with = "instant_serializer")] #[serde(with = "instant_serializer")]
start_time: Instant, start_time: Instant,
#[cfg(feature = "no_std")] #[cfg(not(feature = "std"))]
start_time: Duration, start_time: Duration,
last_runtime: Option<Duration>, last_runtime: Option<Duration>,
@ -448,7 +448,7 @@ impl TimeObserver {
#[cfg(feature = "std")] #[cfg(feature = "std")]
start_time: Instant::now(), start_time: Instant::now(),
#[cfg(feature = "no_std")] #[cfg(not(feature = "std"))]
start_time: Duration::from_secs(0), start_time: Duration::from_secs(0),
last_runtime: None, last_runtime: None,
@ -473,7 +473,7 @@ where
Ok(()) Ok(())
} }
#[cfg(feature = "no_std")] #[cfg(not(feature = "std"))]
fn pre_exec(&mut self, _state: &mut S, _input: &S::Input) -> Result<(), Error> { fn pre_exec(&mut self, _state: &mut S, _input: &S::Input) -> Result<(), Error> {
self.last_runtime = None; self.last_runtime = None;
self.start_time = current_time(); self.start_time = current_time();
@ -491,7 +491,7 @@ where
Ok(()) Ok(())
} }
#[cfg(feature = "no_std")] #[cfg(not(feature = "std"))]
fn post_exec( fn post_exec(
&mut self, &mut self,
_state: &mut S, _state: &mut S,
@ -499,6 +499,7 @@ where
_exit_kind: &ExitKind, _exit_kind: &ExitKind,
) -> Result<(), Error> { ) -> Result<(), Error> {
self.last_runtime = current_time().checked_sub(self.start_time); self.last_runtime = current_time().checked_sub(self.start_time);
Ok(())
} }
} }

View File

@ -1,14 +1,15 @@
#[rustversion::nightly] #[rustversion::nightly]
fn main() { fn nightly() {
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rustc-cfg=nightly"); println!("cargo:rustc-cfg=nightly");
#[cfg(target_env = "musl")]
println!("cargo:rustc-link-lib=ucontext");
} }
#[rustversion::not(nightly)] #[rustversion::not(nightly)]
fn nightly() {}
fn main() { fn main() {
println!("cargo:rerun-if-changed=build.rs"); println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rustc-check-cfg=cfg(nightly)");
nightly();
#[cfg(target_env = "musl")] #[cfg(target_env = "musl")]
println!("cargo:rustc-link-lib=ucontext"); println!("cargo:rustc-link-lib=ucontext");
} }

View File

@ -22,27 +22,45 @@ impl GzipCompressor {
/// If the buffer is at least 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 with_threshold(threshold: usize) -> Self {
Self { threshold } Self { threshold }
} }
/// Create a [`GzipCompressor`] that will always compress
#[must_use]
pub fn new() -> Self {
Self { threshold: 0 }
}
}
impl Default for GzipCompressor {
fn default() -> Self {
Self::new()
}
} }
impl GzipCompressor { impl GzipCompressor {
/// Compression. /// Compression.
/// If the buffer is smaller than the threshold of this compressor, `None` will be returned. /// If the buffer is smaller than the threshold of this compressor, `None` will be returned.
/// Else, the buffer is compressed. /// Else, the buffer is compressed.
pub fn compress(&self, buf: &[u8]) -> Result<Option<Vec<u8>>, Error> { #[must_use]
pub fn maybe_compress(&self, buf: &[u8]) -> Option<Vec<u8>> {
if buf.len() >= self.threshold { if buf.len() >= self.threshold {
//compress if the buffer is large enough //compress if the buffer is large enough
let compressed = compress_to_vec(buf, CompressionLevel::BestSpeed as u8); Some(self.compress(buf))
Ok(Some(compressed))
} else { } else {
Ok(None) None
} }
} }
/// Force compression.
/// Will ignore the preset threshold, and always compress.
#[must_use]
pub fn compress(&self, buf: &[u8]) -> Vec<u8> {
compress_to_vec(buf, CompressionLevel::BestSpeed as u8)
}
/// Decompression. /// Decompression.
/// Flag is used to indicate if it's compressed or not
#[allow(clippy::unused_self)] #[allow(clippy::unused_self)]
pub fn decompress(&self, buf: &[u8]) -> Result<Vec<u8>, Error> { pub fn decompress(&self, buf: &[u8]) -> Result<Vec<u8>, Error> {
let decompressed = decompress_to_vec(buf); let decompressed = decompress_to_vec(buf);
@ -60,10 +78,10 @@ mod tests {
#[test] #[test]
fn test_compression() { fn test_compression() {
let compressor = GzipCompressor::new(1); let compressor = GzipCompressor::with_threshold(1);
assert!( assert!(
compressor compressor
.decompress(&compressor.compress(&[1u8; 1024]).unwrap().unwrap()) .decompress(&compressor.maybe_compress(&[1u8; 1024]).unwrap())
.unwrap() .unwrap()
== vec![1u8; 1024] == vec![1u8; 1024]
); );
@ -71,8 +89,8 @@ mod tests {
#[test] #[test]
fn test_threshold() { fn test_threshold() {
let compressor = GzipCompressor::new(1024); let compressor = GzipCompressor::with_threshold(1024);
assert!(compressor.compress(&[1u8; 1023]).unwrap().is_none()); assert!(compressor.maybe_compress(&[1u8; 1023]).is_none());
assert!(compressor.compress(&[1u8; 1024]).unwrap().is_some()); assert!(compressor.maybe_compress(&[1u8; 1024]).is_some());
} }
} }

View File

@ -9,7 +9,7 @@ use core::arch::asm;
target_arch = "aarch64", target_arch = "aarch64",
target_arch = "arm", target_arch = "arm",
target_arch = "riscv64", target_arch = "riscv64",
target_arsch = "riscv32" target_arch = "riscv32"
)))] )))]
use crate::current_nanos; use crate::current_nanos;

View File

@ -4,6 +4,7 @@
#![doc = include_str!("../README.md")] #![doc = include_str!("../README.md")]
/*! */ /*! */
#![cfg_attr(feature = "document-features", doc = document_features::document_features!())] #![cfg_attr(feature = "document-features", doc = document_features::document_features!())]
#![forbid(unexpected_cfgs)]
#![allow(incomplete_features)] #![allow(incomplete_features)]
#![no_std] #![no_std]
// For `type_eq` // For `type_eq`

View File

@ -2543,7 +2543,7 @@ where
// Crete a new ShMemProvider for this background thread // Crete a new ShMemProvider for this background thread
let shmem_provider_bg = SP::new().unwrap(); let shmem_provider_bg = SP::new().unwrap();
#[cfg(fature = "llmp_debug")] #[cfg(feature = "llmp_debug")]
log::info!("B2b: Spawned proxy thread"); log::info!("B2b: Spawned proxy thread");
// The background thread blocks on the incoming connection for 15 seconds (if no data is available), then checks if it should forward own messages, then blocks some more. // The background thread blocks on the incoming connection for 15 seconds (if no data is available), then checks if it should forward own messages, then blocks some more.

View File

@ -130,7 +130,7 @@ pub fn dump_registers<W: Write>(
} }
/// Write the content of all important registers /// Write the content of all important registers
#[cfg(all(target_vendor = "freebsd", target_arch = "aarch64"))] #[cfg(all(target_os = "freebsd", target_arch = "aarch64"))]
#[allow(clippy::similar_names)] #[allow(clippy::similar_names)]
pub fn dump_registers<W: Write>( pub fn dump_registers<W: Write>(
writer: &mut BufWriter<W>, writer: &mut BufWriter<W>,
@ -776,7 +776,7 @@ fn write_minibsod<W: Write>(writer: &mut BufWriter<W>) -> Result<(), std::io::Er
libc::VM_PROC, libc::VM_PROC,
libc::VM_PROC_MAP, libc::VM_PROC_MAP,
-1, -1,
std::mem::size_of::<libc::kinfo_vmentry>() size_of::<libc::kinfo_vmentry>()
.try_into() .try_into()
.expect("Invalid libc::kinfo_vmentry size"), .expect("Invalid libc::kinfo_vmentry size"),
]; ];
@ -809,7 +809,7 @@ fn write_minibsod<W: Write>(writer: &mut BufWriter<W>) -> Result<(), std::io::Er
.try_into() .try_into()
.expect("invalid kve_structsize value"); .expect("invalid kve_structsize value");
#[cfg(target_os = "netbsd")] #[cfg(target_os = "netbsd")]
let sz = std::mem::size_of::<libc::kinfo_vmentry>(); let sz = size_of::<libc::kinfo_vmentry>();
if sz == 0 { if sz == 0 {
break; break;
} }
@ -838,7 +838,7 @@ fn write_minibsod<W: Write>(writer: &mut BufWriter<W>) -> Result<(), std::io::Er
#[cfg(target_os = "openbsd")] #[cfg(target_os = "openbsd")]
fn write_minibsod<W: Write>(writer: &mut BufWriter<W>) -> Result<(), std::io::Error> { fn write_minibsod<W: Write>(writer: &mut BufWriter<W>) -> Result<(), std::io::Error> {
let mut pentry = std::mem::MaybeUninit::<libc::kinfo_vmentry>::uninit(); let mut pentry = std::mem::MaybeUninit::<libc::kinfo_vmentry>::uninit();
let mut s = std::mem::size_of::<libc::kinfo_vmentry>(); let mut s = size_of::<libc::kinfo_vmentry>();
let arr = &[libc::CTL_KERN, libc::KERN_PROC_VMMAP, unsafe { let arr = &[libc::CTL_KERN, libc::KERN_PROC_VMMAP, unsafe {
libc::getpid() libc::getpid()
}]; }];
@ -887,6 +887,8 @@ fn write_minibsod<W: Write>(writer: &mut BufWriter<W>) -> Result<(), std::io::Er
#[cfg(target_vendor = "apple")] #[cfg(target_vendor = "apple")]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
fn write_minibsod<W: Write>(writer: &mut BufWriter<W>) -> Result<(), std::io::Error> { fn write_minibsod<W: Write>(writer: &mut BufWriter<W>) -> Result<(), std::io::Error> {
use core::mem::size_of;
type vm_region_recurse_info_t = *mut libc::c_int; type vm_region_recurse_info_t = *mut libc::c_int;
type mach_vm_address_t = u64; type mach_vm_address_t = u64;
type mach_vm_size_t = u64; type mach_vm_size_t = u64;
@ -944,8 +946,10 @@ fn write_minibsod<W: Write>(writer: &mut BufWriter<W>) -> Result<(), std::io::Er
loop { loop {
let mut pvminfo = std::mem::MaybeUninit::<vm_region_submap_info_64>::uninit(); let mut pvminfo = std::mem::MaybeUninit::<vm_region_submap_info_64>::uninit();
_cnt = (std::mem::size_of::<vm_region_submap_info_64>() / std::mem::size_of::<natural_t>()) _cnt = mach_msg_type_number_t::try_from(
as mach_msg_type_number_t; size_of::<vm_region_submap_info_64>() / size_of::<natural_t>(),
)
.unwrap();
r = unsafe { r = unsafe {
mach_vm_region_recurse( mach_vm_region_recurse(
task, task,
@ -964,9 +968,9 @@ fn write_minibsod<W: Write>(writer: &mut BufWriter<W>) -> Result<(), std::io::Er
// We are only interested by the first level of the maps // We are only interested by the first level of the maps
if vminfo.is_submap == 0 { if vminfo.is_submap == 0 {
let i = format!("{}-{}\n", addr, addr + sz); let i = format!("{}-{}\n", addr, addr + sz);
writer.write(&i.into_bytes())?; writer.write_all(&i.into_bytes())?;
} }
addr = addr + sz; addr += sz;
} }
Ok(()) Ok(())

View File

@ -3,6 +3,7 @@
#![deny(rustdoc::broken_intra_doc_links)] #![deny(rustdoc::broken_intra_doc_links)]
#![deny(clippy::all)] #![deny(clippy::all)]
#![deny(clippy::pedantic)] #![deny(clippy::pedantic)]
#![forbid(unexpected_cfgs)]
#![allow( #![allow(
clippy::unreadable_literal, clippy::unreadable_literal,
clippy::type_repetition_in_bounds, clippy::type_repetition_in_bounds,

View File

@ -1,6 +1,7 @@
//! This is a 'meta-package' for libafl that exposes a consistent URL and commit hash for the //! This is a 'meta-package' for libafl that exposes a consistent URL and commit hash for the
//! [`SymCC` fork](https://github.com/AFLplusplus/symcc). //! [`SymCC` fork](https://github.com/AFLplusplus/symcc).
#![allow(clippy::module_name_repetitions)] #![allow(clippy::module_name_repetitions)]
#![forbid(unexpected_cfgs)]
/// The URL of the `LibAFL` `SymCC` fork. /// The URL of the `LibAFL` `SymCC` fork.
pub const SYMCC_REPO_URL: &str = "https://github.com/AFLplusplus/symcc.git"; pub const SYMCC_REPO_URL: &str = "https://github.com/AFLplusplus/symcc.git";

View File

@ -32,6 +32,7 @@
clippy::missing_panics_doc, clippy::missing_panics_doc,
clippy::pub_underscore_fields clippy::pub_underscore_fields
)] )]
#![forbid(unexpected_cfgs)]
pub mod filter; pub mod filter;
pub mod tracing; pub mod tracing;

View File

@ -1,6 +1,7 @@
//! This is a straight-forward command line utility that can dump constraints written by a tracing runtime. //! This is a straight-forward command line utility that can dump constraints written by a tracing runtime.
//! It achieves this by running an instrumented target program with the necessary environment variables set. //! It achieves this by running an instrumented target program with the necessary environment variables set.
//! When the program has finished executing, it dumps the traced constraints to a file. //! When the program has finished executing, it dumps the traced constraints to a file.
#![forbid(unexpected_cfgs)]
use std::{ use std::{
ffi::OsString, ffi::OsString,

View File

@ -1,5 +1,6 @@
// this is required to be allowed to call the final executable what we want (and need) in Cargo.toml // this is required to be allowed to call the final executable what we want (and need) in Cargo.toml
#![allow(non_snake_case)] #![allow(non_snake_case)]
#![forbid(unexpected_cfgs)]
//! Just a small runtime to be used in the smoke test. //! Just a small runtime to be used in the smoke test.
use symcc_runtime::{ use symcc_runtime::{

View File

@ -1,6 +1,7 @@
//! Derives for `LibAFL` //! Derives for `LibAFL`
#![no_std] #![no_std]
#![forbid(unexpected_cfgs)]
#![deny(rustdoc::broken_intra_doc_links)] #![deny(rustdoc::broken_intra_doc_links)]
#![deny(clippy::all)] #![deny(clippy::all)]
#![deny(clippy::pedantic)] #![deny(clippy::pedantic)]

View File

@ -1,4 +1,5 @@
// build.rs // build.rs
#![forbid(unexpected_cfgs)]
fn main() { fn main() {
let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap(); let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap();

View File

@ -5,6 +5,7 @@ It can report coverage and, on supported architectures, even reports memory acce
Additional documentation is available in [the `LibAFL` book](https://aflplus.plus/libafl-book/advanced_features/frida.html). Additional documentation is available in [the `LibAFL` book](https://aflplus.plus/libafl-book/advanced_features/frida.html).
*/ */
#![forbid(unexpected_cfgs)]
#![deny(rustdoc::broken_intra_doc_links)] #![deny(rustdoc::broken_intra_doc_links)]
#![deny(clippy::all)] #![deny(clippy::all)]
#![deny(clippy::pedantic)] #![deny(clippy::pedantic)]

View File

@ -10,11 +10,11 @@ edition = "2021"
categories = ["development-tools::testing", "fuzzing"] categories = ["development-tools::testing", "fuzzing"]
include = [ include = [
"/src", "/src",
"/Cargo.toml", "/Cargo.toml",
"/build.rs", "/build.rs",
"/libafl_libfuzzer_runtime", "/libafl_libfuzzer_runtime",
"!/libafl_libfuzzer_runtime/target", "!/libafl_libfuzzer_runtime/target",
] ]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@ -24,12 +24,20 @@ cc = "1.0"
rustversion = "1.0" rustversion = "1.0"
[features] [features]
default = ["fork"]
document-features = ["dep:document-features"]
#! ## Feature Flags #! ## Feature Flags
## Enables the derive macros for the arbitrary dependency, transparently forwarded from libfuzzer-sys ## Enables the derive macros for the arbitrary dependency, transparently forwarded from libfuzzer-sys
arbitrary-derive = ["libfuzzer-sys/arbitrary-derive"] arbitrary-derive = ["libfuzzer-sys/arbitrary-derive"]
## Enables fuzzer introspection with LibAFL's `introspection` feature ## Enables fuzzer introspection with LibAFL's `introspection` feature
introspection = [] introspection = []
## Enables forking in the fuzzer runtime for restarting managers for Unix systems (on by default)
fork = []
## Embeds the built libafl_libfuzzer_runtime library into the crate with include_bytes! for use ## Embeds the built libafl_libfuzzer_runtime library into the crate with include_bytes! for use
## in downstream cases like libafl_cc linking the runtime with: ## in downstream cases like libafl_cc linking the runtime with:
## `-fsanitize=fuzzer-no-link -l:libafl_libfuzzer_runtime.a` ## `-fsanitize=fuzzer-no-link -l:libafl_libfuzzer_runtime.a`
@ -40,7 +48,7 @@ rabbit = []
[dependencies] [dependencies]
libfuzzer-sys = { version = "0.4.7", default-features = false } libfuzzer-sys = { version = "0.4.7", default-features = false }
document-features = { version = "0.2" } document-features = { version = "0.2", optional = true }
[package.metadata.docs.rs] [package.metadata.docs.rs]
features = ["document-features"] features = ["document-features"]

View File

@ -13,7 +13,7 @@ const NAMESPACE_LEN: usize = NAMESPACE.as_bytes().len();
#[allow(clippy::too_many_lines)] #[allow(clippy::too_many_lines)]
fn main() { fn main() {
if cfg!(any(feature = "cargo-clippy", docsrs)) { if cfg!(any(clippy, docsrs)) {
return; // skip when clippy or docs is running return; // skip when clippy or docs is running
} }

View File

@ -1,74 +1,7 @@
//! The `LibAFL` `LibFuzzer` runtime, exposing the same functions as the original [`LibFuzzer`](https://llvm.org/docs/LibFuzzer.html). //! The `LibAFL` `LibFuzzer` runtime, exposing the same functions as the original [`LibFuzzer`](https://llvm.org/docs/LibFuzzer.html).
#![allow(incomplete_features)] #![forbid(unexpected_cfgs)]
// For `type_eq` #![allow(clippy::unsafe_derive_deserialize)]
#![cfg_attr(unstable_feature, feature(specialization))]
// For `type_id` and owned things
#![cfg_attr(unstable_feature, feature(intrinsics))]
// For `std::simd`
#![cfg_attr(unstable_feature, feature(portable_simd))]
#![warn(clippy::cargo)]
#![allow(ambiguous_glob_reexports)]
#![deny(clippy::cargo_common_metadata)]
#![deny(rustdoc::broken_intra_doc_links)]
#![deny(clippy::all)]
#![deny(clippy::pedantic)]
#![allow(
clippy::unreadable_literal,
clippy::type_repetition_in_bounds,
clippy::missing_errors_doc,
clippy::cast_possible_truncation,
clippy::used_underscore_binding,
clippy::ptr_as_ptr,
clippy::missing_panics_doc,
clippy::missing_docs_in_private_items,
clippy::module_name_repetitions,
clippy::ptr_cast_constness,
clippy::unsafe_derive_deserialize
)]
#![cfg_attr(not(test), warn(
missing_debug_implementations,
missing_docs,
//trivial_casts,
trivial_numeric_casts,
unused_extern_crates,
unused_import_braces,
unused_qualifications,
//unused_results
))]
#![cfg_attr(test, deny(
missing_debug_implementations,
missing_docs,
//trivial_casts,
trivial_numeric_casts,
unused_extern_crates,
unused_import_braces,
unused_qualifications,
unused_must_use,
//unused_results
))]
#![cfg_attr(
test,
deny(
bad_style,
dead_code,
improper_ctypes,
non_shorthand_field_patterns,
no_mangle_generic_items,
overflowing_literals,
path_statements,
patterns_in_fns_without_body,
unconditional_recursion,
unused,
unused_allocation,
unused_comparisons,
unused_parens,
while_true
)
)]
// Till they fix this buggy lint in clippy
#![allow(clippy::borrow_as_ptr)]
#![allow(clippy::borrow_deref_ref)]
use core::ffi::{c_char, c_int, CStr}; use core::ffi::{c_char, c_int, CStr};
use std::{fs::File, io::stderr, os::fd::RawFd}; use std::{fs::File, io::stderr, os::fd::RawFd};
@ -110,11 +43,6 @@ mod harness_wrap {
} }
pub(crate) use harness_wrap::libafl_libfuzzer_test_one_input; pub(crate) use harness_wrap::libafl_libfuzzer_test_one_input;
#[cfg(feature = "mimalloc")]
use mimalloc::MiMalloc;
#[global_allocator]
#[cfg(feature = "mimalloc")]
static GLOBAL: MiMalloc = MiMalloc;
#[allow(clippy::struct_excessive_bools)] #[allow(clippy::struct_excessive_bools)]
struct CustomMutationStatus { struct CustomMutationStatus {

View File

@ -75,6 +75,7 @@
//! to the runtime (e.g., to prevent coverage being collected on the runtime). //! to the runtime (e.g., to prevent coverage being collected on the runtime).
//! //!
#![cfg_attr(feature = "document-features", doc = document_features::document_features!())] #![cfg_attr(feature = "document-features", doc = document_features::document_features!())]
#![forbid(unexpected_cfgs)]
use std::ffi::{c_char, c_int}; use std::ffi::{c_char, c_int};

View File

@ -1,4 +1,6 @@
#![allow(clippy::module_name_repetitions, clippy::missing_panics_doc)] #![allow(clippy::module_name_repetitions, clippy::missing_panics_doc)]
#![forbid(unexpected_cfgs)]
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
pub mod executor; pub mod executor;
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]

View File

@ -9,14 +9,15 @@ mod host_specific {
} }
#[rustversion::nightly] #[rustversion::nightly]
fn main() { fn nightly() {
println!("cargo:rustc-cfg=nightly"); println!("cargo:rustc-cfg=nightly");
println!("cargo::rustc-check-cfg=cfg(nightly)");
host_specific::build();
} }
#[rustversion::not(nightly)] #[rustversion::not(nightly)]
fn nightly() {}
fn main() { fn main() {
println!("cargo::rustc-check-cfg=cfg(nightly)"); println!("cargo:rustc-check-cfg=cfg(nightly)");
nightly();
host_specific::build(); host_specific::build();
} }

View File

@ -1,17 +1,23 @@
use std::{env, fs, path::{Path, PathBuf}, process::Command}; use std::{
env, fs,
path::{Path, PathBuf},
process::Command,
};
#[allow(clippy::too_many_lines)] #[allow(clippy::too_many_lines)]
pub fn build() { pub fn build() {
// Note: Unique features are checked in libafl_qemu_sys // Note: Unique features are checked in libafl_qemu_sys
println!(r#"cargo::rustc-check-cfg=cfg(emulation_mode, values("usermode", "systemmode"))"#);
println!(
r#"cargo::rustc-check-cfg=cfg(cpu_target, values("arm", "aarch64", "hexagon", "i386", "mips", "ppc", "x86_64"))"#
);
let emulation_mode = if cfg!(feature = "usermode") { let emulation_mode = if cfg!(feature = "usermode") {
"usermode".to_string() "usermode".to_string()
} else if cfg!(feature = "systemmode") { } else if cfg!(feature = "systemmode") {
"systemmode".to_string() "systemmode".to_string()
} else { } else {
env::var("EMULATION_MODE").unwrap_or_else(|_| { env::var("EMULATION_MODE").unwrap_or_else(|_| "usermode".to_string())
"usermode".to_string()
})
}; };
let src_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); let src_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
@ -60,9 +66,7 @@ pub fn build() {
} else if cfg!(feature = "hexagon") { } else if cfg!(feature = "hexagon") {
"hexagon".to_string() "hexagon".to_string()
} else { } else {
env::var("CPU_TARGET").unwrap_or_else(|_| { env::var("CPU_TARGET").unwrap_or_else(|_| "x86_64".to_string())
"x86_64".to_string()
})
}; };
println!("cargo:rerun-if-env-changed=CPU_TARGET"); println!("cargo:rerun-if-env-changed=CPU_TARGET");
println!("cargo:rustc-cfg=cpu_target=\"{cpu_target}\""); println!("cargo:rustc-cfg=cpu_target=\"{cpu_target}\"");
@ -82,13 +86,18 @@ pub fn build() {
}; };
if env::var("DOCS_RS").is_ok() || cfg!(feature = "clippy") { if env::var("DOCS_RS").is_ok() || cfg!(feature = "clippy") {
fs::copy(&stub_runtime_bindings_file, &runtime_bindings_file).expect("Could not copy stub bindings file"); fs::copy(&stub_runtime_bindings_file, &runtime_bindings_file)
.expect("Could not copy stub bindings file");
return; // only build when we're not generating docs return; // only build when we're not generating docs
} }
fs::create_dir_all(&include_dir).expect("Could not create include dir"); fs::create_dir_all(&include_dir).expect("Could not create include dir");
fs::copy(libafl_qemu_hdr.clone(), include_dir.join(libafl_qemu_hdr_name)).expect("Could not copy libafl_qemu.h to out directory."); fs::copy(
libafl_qemu_hdr.clone(),
include_dir.join(libafl_qemu_hdr_name),
)
.expect("Could not copy libafl_qemu.h to out directory.");
bindgen::Builder::default() bindgen::Builder::default()
.derive_debug(true) .derive_debug(true)
@ -105,7 +114,12 @@ pub fn build() {
.write_to_file(&runtime_bindings_file) .write_to_file(&runtime_bindings_file)
.expect("Could not write bindings."); .expect("Could not write bindings.");
libafl_qemu_build::store_generated_content_if_different(&stub_runtime_bindings_file, fs::read(&runtime_bindings_file).expect("Could not read generated bindings file").as_slice()); libafl_qemu_build::store_generated_content_if_different(
&stub_runtime_bindings_file,
fs::read(&runtime_bindings_file)
.expect("Could not read generated bindings file")
.as_slice(),
);
if (emulation_mode == "usermode") && (qemu_asan || qemu_asan_guest) { if (emulation_mode == "usermode") && (qemu_asan || qemu_asan_guest) {
let qasan_dir = Path::new("libqasan"); let qasan_dir = Path::new("libqasan");

View File

@ -1,4 +1,6 @@
#![forbid(unexpected_cfgs)]
#![allow(clippy::missing_panics_doc)] #![allow(clippy::missing_panics_doc)]
use std::{ use std::{
collections::hash_map, collections::hash_map,
env, fs, env, fs,

View File

@ -1,3 +1,5 @@
#![forbid(unexpected_cfgs)]
use std::path::PathBuf; use std::path::PathBuf;
use libafl_qemu_build::build_with_bindings; use libafl_qemu_build::build_with_bindings;

View File

@ -1,3 +1,5 @@
#![forbid(unexpected_cfgs)]
mod host_specific { mod host_specific {
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
include!("build_linux.rs"); include!("build_linux.rs");
@ -9,14 +11,15 @@ mod host_specific {
} }
#[rustversion::nightly] #[rustversion::nightly]
fn main() { fn nightly() {
println!("cargo:rustc-cfg=nightly"); println!("cargo:rustc-cfg=nightly");
println!("cargo::rustc-check-cfg=cfg(nightly)");
host_specific::build();
} }
#[rustversion::not(nightly)] #[rustversion::not(nightly)]
fn nightly() {}
fn main() { fn main() {
println!("cargo::rustc-check-cfg=cfg(nightly)"); println!("cargo:rustc-check-cfg=cfg(nightly)");
nightly();
host_specific::build(); host_specific::build();
} }

View File

@ -1,9 +1,8 @@
#[rustversion::nightly]
use std::fs;
use std::{env, fs::copy, path::PathBuf}; use std::{env, fs::copy, path::PathBuf};
use libafl_qemu_build::build_with_bindings; use libafl_qemu_build::build_with_bindings;
#[rustversion::nightly]
use std::fs;
#[rustversion::nightly] #[rustversion::nightly]
use libafl_qemu_build::store_generated_content_if_different; use libafl_qemu_build::store_generated_content_if_different;
@ -20,18 +19,37 @@ macro_rules! assert_unique_feature {
} }
#[rustversion::nightly] #[rustversion::nightly]
fn maybe_generate_stub_bindings(cpu_target: &str, emulation_mode: &str, stub_bindings_file: &PathBuf, bindings_file: &PathBuf) { fn maybe_generate_stub_bindings(
cpu_target: &str,
emulation_mode: &str,
stub_bindings_file: &PathBuf,
bindings_file: &PathBuf,
) {
if cpu_target == "x86_64" && emulation_mode == "usermode" { if cpu_target == "x86_64" && emulation_mode == "usermode" {
store_generated_content_if_different(stub_bindings_file, fs::read(bindings_file).expect("Could not read generated bindings file").as_slice()); store_generated_content_if_different(
stub_bindings_file,
fs::read(bindings_file)
.expect("Could not read generated bindings file")
.as_slice(),
);
} }
} }
#[rustversion::not(nightly)] #[rustversion::not(nightly)]
fn maybe_generate_stub_bindings(_cpu_target: &str, _emulation_mode: &str, _stub_bindings_file: &PathBuf, _bindings_file: &PathBuf) { fn maybe_generate_stub_bindings(
_cpu_target: &str,
_emulation_mode: &str,
_stub_bindings_file: &PathBuf,
_bindings_file: &PathBuf,
) {
// Do nothing // Do nothing
} }
pub fn build() { pub fn build() {
println!(r#"cargo::rustc-check-cfg=cfg(emulation_mode, values("usermode", "systemmode"))"#);
println!(
r#"cargo::rustc-check-cfg=cfg(cpu_target, values("arm", "aarch64", "hexagon", "i386", "mips", "ppc", "x86_64"))"#
);
// Make sure that exactly one qemu mode is set // Make sure that exactly one qemu mode is set
assert_unique_feature!("usermode", "systemmode"); assert_unique_feature!("usermode", "systemmode");
let emulation_mode = if cfg!(feature = "usermode") { let emulation_mode = if cfg!(feature = "usermode") {
@ -76,7 +94,7 @@ pub fn build() {
} else { } else {
env::var("CPU_TARGET").unwrap_or_else(|_| { env::var("CPU_TARGET").unwrap_or_else(|_| {
println!( println!(
"cargo:warning=No architecture feature enabled or CPU_TARGET env specified for libafl_qemu, supported: arm, aarch64, i386, x86_64 - defaulting to x86_64" "cargo:warning=No architecture feature enabled or CPU_TARGET env specified for libafl_qemu, supported: arm, aarch64, hexagon, i386, mips, ppc, x86_64 - defaulting to x86_64"
); );
"x86_64".to_string() "x86_64".to_string()
}) })
@ -92,7 +110,7 @@ pub fn build() {
let out_dir = env::var("OUT_DIR").unwrap(); let out_dir = env::var("OUT_DIR").unwrap();
let out_dir = PathBuf::from(out_dir); let out_dir = PathBuf::from(out_dir);
let bindings_file = out_dir.join("bindings.rs"); let bindings_file = out_dir.join("bindings.rs");
let src_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); let src_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let src_dir = PathBuf::from(src_dir); let src_dir = PathBuf::from(src_dir);
let stub_bindings_file = src_dir.join("src/x86_64_stub_bindings.rs"); let stub_bindings_file = src_dir.join("src/x86_64_stub_bindings.rs");
@ -114,5 +132,10 @@ pub fn build() {
println!("cargo:rerun-if-changed={}", stub_bindings_file.display()); println!("cargo:rerun-if-changed={}", stub_bindings_file.display());
// If the bindings are built and differ from the current stub, replace it with the freshly generated bindings // If the bindings are built and differ from the current stub, replace it with the freshly generated bindings
maybe_generate_stub_bindings(&cpu_target, &emulation_mode, &stub_bindings_file, &bindings_file); maybe_generate_stub_bindings(
} &cpu_target,
&emulation_mode,
&stub_bindings_file,
&bindings_file,
);
}

View File

@ -1,4 +1,3 @@
#![cfg_attr(nightly, feature(used_with_arg))]
/*! /*!
`libafl_qemu_sys` is the crate exporting C symbols from QEMU. `libafl_qemu_sys` is the crate exporting C symbols from QEMU.
Have a look at `libafl_qemu` for higher-level abstractions. Have a look at `libafl_qemu` for higher-level abstractions.
@ -6,6 +5,7 @@ Have a look at `libafl_qemu` for higher-level abstractions.
__Warning__: The documentation is built by default for `x86_64` in `usermode`. To access the documentation of other architectures or systemmode, the documentation must be rebuilt with the right features. __Warning__: The documentation is built by default for `x86_64` in `usermode`. To access the documentation of other architectures or systemmode, the documentation must be rebuilt with the right features.
*/ */
#![forbid(unexpected_cfgs)]
#![allow(non_upper_case_globals)] #![allow(non_upper_case_globals)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#![allow(non_snake_case)] #![allow(non_snake_case)]
@ -13,6 +13,11 @@ __Warning__: The documentation is built by default for `x86_64` in `usermode`. T
#![allow(unused_mut)] #![allow(unused_mut)]
#![allow(clippy::all)] #![allow(clippy::all)]
#![allow(clippy::pedantic)] #![allow(clippy::pedantic)]
#![cfg_attr(nightly, feature(used_with_arg))]
use num_enum::{IntoPrimitive, TryFromPrimitive};
use paste::paste;
use strum_macros::EnumIter;
#[cfg(all(not(feature = "clippy"), target_os = "linux"))] #[cfg(all(not(feature = "clippy"), target_os = "linux"))]
mod bindings { mod bindings {
@ -32,9 +37,6 @@ pub use usermode::*;
#[cfg(emulation_mode = "systemmode")] #[cfg(emulation_mode = "systemmode")]
mod systemmode; mod systemmode;
use num_enum::{IntoPrimitive, TryFromPrimitive};
use paste::paste;
use strum_macros::EnumIter;
#[cfg(emulation_mode = "systemmode")] #[cfg(emulation_mode = "systemmode")]
pub use systemmode::*; pub use systemmode::*;

View File

@ -2340,6 +2340,7 @@ pub type DeviceReset = ::std::option::Option<unsafe extern "C" fn(dev: *mut Devi
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone)]
pub struct DeviceClass { pub struct DeviceClass {
pub parent_class: ObjectClass, pub parent_class: ObjectClass,
#[doc = " @categories: device categories device belongs to"]
pub categories: [::std::os::raw::c_ulong; 1usize], pub categories: [::std::os::raw::c_ulong; 1usize],
#[doc = " @fw_name: name used to identify device to firmware interfaces"] #[doc = " @fw_name: name used to identify device to firmware interfaces"]
pub fw_name: *const ::std::os::raw::c_char, pub fw_name: *const ::std::os::raw::c_char,

View File

@ -4,6 +4,7 @@
#![doc = include_str!("../../README.md")] #![doc = include_str!("../../README.md")]
/*! */ /*! */
#![cfg_attr(feature = "document-features", doc = document_features::document_features!())] #![cfg_attr(feature = "document-features", doc = document_features::document_features!())]
#![forbid(unexpected_cfgs)]
// libafl_qemu only supports Linux currently // libafl_qemu only supports Linux currently
#![cfg(target_os = "linux")] #![cfg(target_os = "linux")]
// This lint triggers too often on the current GuestAddr type when emulating 64-bit targets because // This lint triggers too often on the current GuestAddr type when emulating 64-bit targets because

View File

@ -1119,8 +1119,7 @@ impl SyscallHookResult {
#[cfg(feature = "python")] #[cfg(feature = "python")]
pub mod pybind { pub mod pybind {
use libafl_qemu_sys::MmapPerms; use pyo3::{exceptions::PyValueError, prelude::*};
use pyo3::{exceptions::PyValueError, prelude::*, types::PyInt};
use super::{GuestAddr, GuestUsize}; use super::{GuestAddr, GuestUsize};

View File

@ -3,6 +3,7 @@
#![deny(rustdoc::broken_intra_doc_links)] #![deny(rustdoc::broken_intra_doc_links)]
#![deny(clippy::all)] #![deny(clippy::all)]
#![deny(clippy::pedantic)] #![deny(clippy::pedantic)]
#![forbid(unexpected_cfgs)]
#![allow( #![allow(
clippy::unreadable_literal, clippy::unreadable_literal,
clippy::type_repetition_in_bounds, clippy::type_repetition_in_bounds,

View File

@ -31,6 +31,7 @@ default = [
"common", "common",
] ]
std = ["libafl/std"] std = ["libafl/std"]
introspection = ["libafl/introspection"]
libfuzzer = ["std", "common"] libfuzzer = ["std", "common"]
libfuzzer_no_link_main = ["libfuzzer"] libfuzzer_no_link_main = ["libfuzzer"]
libfuzzer_define_run_driver = ["libfuzzer"] libfuzzer_define_run_driver = ["libfuzzer"]

View File

@ -15,6 +15,7 @@ fn enable_nightly() {}
#[allow(clippy::too_many_lines)] #[allow(clippy::too_many_lines)]
fn main() { fn main() {
println!("cargo:rustc-check-cfg=cfg(nightly)");
enable_nightly(); enable_nightly();
let out_dir = env::var_os("OUT_DIR").unwrap(); let out_dir = env::var_os("OUT_DIR").unwrap();
let out_dir = out_dir.to_string_lossy().to_string(); let out_dir = out_dir.to_string_lossy().to_string();

View File

@ -1,8 +1,6 @@
use alloc::borrow::Cow; use alloc::borrow::Cow;
use core::marker::PhantomData; use core::marker::PhantomData;
#[cfg(feature = "introspection")]
use libafl::state::HasClientPerfMonitor;
use libafl::{ use libafl::{
executors::{Executor, HasObservers}, executors::{Executor, HasObservers},
inputs::{BytesInput, UsesInput}, inputs::{BytesInput, UsesInput},

View File

@ -3,6 +3,8 @@
#![deny(rustdoc::broken_intra_doc_links)] #![deny(rustdoc::broken_intra_doc_links)]
#![deny(clippy::all)] #![deny(clippy::all)]
#![deny(clippy::pedantic)] #![deny(clippy::pedantic)]
#![forbid(unexpected_cfgs)]
// For `std::simd`
#![cfg_attr(nightly, feature(portable_simd))] #![cfg_attr(nightly, feature(portable_simd))]
#![allow( #![allow(
clippy::unreadable_literal, clippy::unreadable_literal,

View File

@ -7,6 +7,7 @@ The tinyinst module for `LibAFL`.
#![deny(rustdoc::broken_intra_doc_links)] #![deny(rustdoc::broken_intra_doc_links)]
#![deny(clippy::all)] #![deny(clippy::all)]
#![deny(clippy::pedantic)] #![deny(clippy::pedantic)]
#![forbid(unexpected_cfgs)]
#![allow( #![allow(
clippy::unreadable_literal, clippy::unreadable_literal,
clippy::type_repetition_in_bounds, clippy::type_repetition_in_bounds,