Revert splitting libafl_edges_map_max and libafl_edges_map_in_use (#2079)

* fix

* aa

* push

* fix

* fmt
This commit is contained in:
Dongjia "toka" Zhang 2024-04-19 13:24:25 +02:00 committed by GitHub
parent d7ac802fb2
commit c68b3816fb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 37 additions and 50 deletions

View File

@ -25,7 +25,7 @@ use libafl_bolts::{
tuples::{tuple_list, MatchName, Merge}, tuples::{tuple_list, MatchName, Merge},
AsMutSlice, Truncate, AsMutSlice, Truncate,
}; };
use libafl_targets::{EDGES_MAP_PTR, EDGES_MAP_SIZE_IN_USE}; use libafl_targets::{EDGES_MAP_PTR, EDGES_MAP_SIZE};
use nix::sys::signal::Signal; use nix::sys::signal::Signal;
/// The commandline args this fuzzer accepts /// The commandline args this fuzzer accepts
@ -86,7 +86,7 @@ struct Opt {
#[allow(clippy::similar_names)] #[allow(clippy::similar_names)]
pub fn main() { pub fn main() {
const MAP_SIZE: usize = EDGES_MAP_SIZE_IN_USE; //65536; const MAP_SIZE: usize = EDGES_MAP_SIZE; //65536;
let opt = Opt::parse(); let opt = Opt::parse();
let corpus_dirs: Vec<PathBuf> = [opt.in_dir].to_vec(); let corpus_dirs: Vec<PathBuf> = [opt.in_dir].to_vec();

View File

@ -55,7 +55,7 @@ use libafl_bolts::{
use libafl_targets::autotokens; use libafl_targets::autotokens;
use libafl_targets::{ use libafl_targets::{
edges_map_mut_ptr, libfuzzer_initialize, libfuzzer_test_one_input, CmpLogObserver, CtxHook, edges_map_mut_ptr, libfuzzer_initialize, libfuzzer_test_one_input, CmpLogObserver, CtxHook,
EDGES_MAP_SIZE_IN_USE, EDGES_MAP_SIZE,
}; };
#[cfg(unix)] #[cfg(unix)]
use nix::unistd::dup; use nix::unistd::dup;
@ -250,7 +250,7 @@ fn fuzz(
let edges_observer = HitcountsMapObserver::new(unsafe { let edges_observer = HitcountsMapObserver::new(unsafe {
StdMapObserver::from_mut_slice( StdMapObserver::from_mut_slice(
"edges", "edges",
OwnedMutSlice::from_raw_parts_mut(edges_map_mut_ptr(), EDGES_MAP_SIZE_IN_USE), OwnedMutSlice::from_raw_parts_mut(edges_map_mut_ptr(), EDGES_MAP_SIZE),
) )
}) })
.track_indices(); .track_indices();

View File

@ -47,7 +47,7 @@ use libafl_bolts::{
}; };
use libafl_qemu::{ use libafl_qemu::{
cmplog::{CmpLogMap, CmpLogObserver, QemuCmpLogChildHelper}, cmplog::{CmpLogMap, CmpLogObserver, QemuCmpLogChildHelper},
edges::{QemuEdgeCoverageChildHelper, EDGES_MAP_PTR, EDGES_MAP_SIZE_IN_USE}, edges::{QemuEdgeCoverageChildHelper, EDGES_MAP_PTR, EDGES_MAP_SIZE},
elf::EasyElf, elf::EasyElf,
filter_qemu_args, filter_qemu_args,
hooks::QemuHooks, hooks::QemuHooks,
@ -208,7 +208,7 @@ fn fuzz(
let mut shmem_provider = StdShMemProvider::new()?; let mut shmem_provider = StdShMemProvider::new()?;
let mut edges_shmem = shmem_provider.new_shmem(EDGES_MAP_SIZE_IN_USE).unwrap(); let mut edges_shmem = shmem_provider.new_shmem(EDGES_MAP_SIZE).unwrap();
let edges = edges_shmem.as_mut_slice(); let edges = edges_shmem.as_mut_slice();
unsafe { EDGES_MAP_PTR = edges.as_mut_ptr() }; unsafe { EDGES_MAP_PTR = edges.as_mut_ptr() };
@ -235,7 +235,7 @@ fn fuzz(
// Create an observation channel using the coverage map // Create an observation channel using the coverage map
let edges_observer = unsafe { let edges_observer = unsafe {
HitcountsMapObserver::new(ConstMapObserver::<_, EDGES_MAP_SIZE_IN_USE>::from_mut_ptr( HitcountsMapObserver::new(ConstMapObserver::<_, EDGES_MAP_SIZE>::from_mut_ptr(
"edges", "edges",
edges.as_mut_ptr(), edges.as_mut_ptr(),
)) ))

View File

@ -28,7 +28,7 @@ use libafl_bolts::{
AsMutSlice, AsSlice, AsMutSlice, AsSlice,
}; };
use libafl_qemu::{ use libafl_qemu::{
edges::{QemuEdgeCoverageChildHelper, EDGES_MAP_PTR, EDGES_MAP_SIZE_IN_USE}, edges::{QemuEdgeCoverageChildHelper, EDGES_MAP_PTR, EDGES_MAP_SIZE},
elf::EasyElf, elf::EasyElf,
emu::Emulator, emu::Emulator,
ArchExtras, CallingConvention, GuestAddr, GuestReg, MmapPerms, Qemu, QemuExitReason, ArchExtras, CallingConvention, GuestAddr, GuestReg, MmapPerms, Qemu, QemuExitReason,
@ -158,12 +158,12 @@ pub fn fuzz() -> Result<(), Error> {
}, },
}; };
let mut edges_shmem = shmem_provider.new_shmem(EDGES_MAP_SIZE_IN_USE).unwrap(); let mut edges_shmem = shmem_provider.new_shmem(EDGES_MAP_SIZE).unwrap();
let edges = edges_shmem.as_mut_slice(); let edges = edges_shmem.as_mut_slice();
unsafe { EDGES_MAP_PTR = edges.as_mut_ptr() }; unsafe { EDGES_MAP_PTR = edges.as_mut_ptr() };
let edges_observer = unsafe { let edges_observer = unsafe {
HitcountsMapObserver::new(ConstMapObserver::<_, EDGES_MAP_SIZE_IN_USE>::from_mut_ptr( HitcountsMapObserver::new(ConstMapObserver::<_, EDGES_MAP_SIZE>::from_mut_ptr(
"edges", "edges",
edges.as_mut_ptr(), edges.as_mut_ptr(),
)) ))

View File

@ -238,7 +238,7 @@ fn main() {
println!("cargo:rerun-if-env-changed=LLVM_CXXFLAGS"); println!("cargo:rerun-if-env-changed=LLVM_CXXFLAGS");
println!("cargo:rerun-if-env-changed=LLVM_LDFLAGS"); println!("cargo:rerun-if-env-changed=LLVM_LDFLAGS");
println!("cargo:rerun-if-env-changed=LLVM_VERSION"); println!("cargo:rerun-if-env-changed=LLVM_VERSION");
println!("cargo:rerun-if-env-changed=LIBAFL_EDGES_MAP_SIZE_IN_USE"); println!("cargo:rerun-if-env-changed=LIBAFL_EDGES_MAP_SIZE");
println!("cargo:rerun-if-env-changed=LIBAFL_ACCOUNTING_MAP_SIZE"); println!("cargo:rerun-if-env-changed=LIBAFL_ACCOUNTING_MAP_SIZE");
println!("cargo:rerun-if-env-changed=LIBAFL_DDG_MAP_SIZE"); println!("cargo:rerun-if-env-changed=LIBAFL_DDG_MAP_SIZE");
println!("cargo:rerun-if-changed=src/common-llvm.h"); println!("cargo:rerun-if-changed=src/common-llvm.h");
@ -311,13 +311,10 @@ pub const LIBAFL_CC_LLVM_VERSION: Option<usize> = None;
}; };
let mut cxxflags: Vec<String> = cxxflags.split_whitespace().map(String::from).collect(); let mut cxxflags: Vec<String> = cxxflags.split_whitespace().map(String::from).collect();
let edges_map_size_in_use: usize = option_env!("LIBAFL_EDGES_MAP_SIZE_IN_USE") let edges_map_size: usize = option_env!("LIBAFL_EDGES_MAP_SIZE")
.map_or(Ok(65_536), str::parse) .map_or(Ok(65_536), str::parse)
.expect("Could not parse LIBAFL_EDGES_MAP_SIZE_IN_USE"); .expect("Could not parse LIBAFL_EDGES_MAP_SIZE");
let edges_map_size_max: usize = option_env!("LIBAFL_EDGES_MAP_SIZE_MAX") cxxflags.push(format!("-DEDGES_MAP_SIZE={edges_map_size}"));
.map_or(Ok(2_621_440), str::parse)
.expect("Could not parse LIBAFL_EDGES_MAP_SIZE_IN_USE");
cxxflags.push(format!("-DEDGES_MAP_SIZE_IN_USE={edges_map_size_in_use}"));
let acc_map_size: usize = option_env!("LIBAFL_ACCOUNTING_MAP_SIZE") let acc_map_size: usize = option_env!("LIBAFL_ACCOUNTING_MAP_SIZE")
.map_or(Ok(65_536), str::parse) .map_or(Ok(65_536), str::parse)
@ -347,9 +344,7 @@ pub const LIBAFL_CC_LLVM_VERSION: Option<usize> = None;
pub const CLANGXX_PATH: &str = {clangcpp:?}; pub const CLANGXX_PATH: &str = {clangcpp:?};
/// The default size of the edges map the fuzzer uses /// The default size of the edges map the fuzzer uses
pub const EDGES_MAP_SIZE_IN_USE: usize = {edges_map_size_in_use}; pub const EDGES_MAP_SIZE: usize = {edges_map_size};
/// The real allocated size of the edges map
pub const EDGES_MAP_SIZE_MAX: usize = {edges_map_size_max};
/// The size of the accounting maps /// The size of the accounting maps
pub const ACCOUNTING_MAP_SIZE: usize = {acc_map_size}; pub const ACCOUNTING_MAP_SIZE: usize = {acc_map_size};

View File

@ -95,9 +95,9 @@ where
/// Inserts an edge into CFG. /// Inserts an edge into CFG.
#[must_use] #[must_use]
pub fn new() -> Self { pub fn new() -> Self {
let map_size = option_env!("LIBAFL_EDGES_MAP_SIZE_IN_USE") let map_size = option_env!("LIBAFL_EDGES_MAP_SIZE")
.map_or(Ok(65536), str::parse) .map_or(Ok(65536), str::parse)
.expect("Could not parse LIBAFL_EDGES_MAP_SIZE_IN_USE"); .expect("Could not parse LIBAFL_EDGES_MAP_SIZE");
Self { Self {
edges: (0..map_size).map(|_| None).collect(), edges: (0..map_size).map(|_| None).collect(),
func_to_entry_bb: HashMap::default(), func_to_entry_bb: HashMap::default(),

View File

@ -64,7 +64,7 @@
using namespace llvm; using namespace llvm;
#define MAP_SIZE EDGES_MAP_SIZE_IN_USE #define MAP_SIZE EDGES_MAP_SIZE
namespace { namespace {

View File

@ -7,7 +7,7 @@ use libafl_qemu_sys::GuestAddr;
use libafl_qemu_sys::GuestPhysAddr; use libafl_qemu_sys::GuestPhysAddr;
pub use libafl_targets::{ pub use libafl_targets::{
edges_map_mut_ptr, edges_map_mut_slice, edges_max_num, std_edges_map_observer, EDGES_MAP, edges_map_mut_ptr, edges_map_mut_slice, edges_max_num, std_edges_map_observer, EDGES_MAP,
EDGES_MAP_PTR, EDGES_MAP_PTR_NUM, EDGES_MAP_SIZE_IN_USE, MAX_EDGES_NUM, EDGES_MAP_PTR, EDGES_MAP_PTR_NUM, EDGES_MAP_SIZE, MAX_EDGES_NUM,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -553,7 +553,7 @@ where
match meta.map.entry((src, dest)) { match meta.map.entry((src, dest)) {
Entry::Occupied(e) => { Entry::Occupied(e) => {
let id = *e.get(); let id = *e.get();
let nxt = (id as usize + 1) & (EDGES_MAP_SIZE_IN_USE - 1); let nxt = (id as usize + 1) & (EDGES_MAP_SIZE - 1);
unsafe { unsafe {
MAX_EDGES_NUM = max(MAX_EDGES_NUM, nxt); MAX_EDGES_NUM = max(MAX_EDGES_NUM, nxt);
} }
@ -562,7 +562,7 @@ where
Entry::Vacant(e) => { Entry::Vacant(e) => {
let id = meta.current_id; let id = meta.current_id;
e.insert(id); e.insert(id);
meta.current_id = (id + 1) & (EDGES_MAP_SIZE_IN_USE as u64 - 1); meta.current_id = (id + 1) & (EDGES_MAP_SIZE as u64 - 1);
unsafe { unsafe {
MAX_EDGES_NUM = meta.current_id as usize; MAX_EDGES_NUM = meta.current_id as usize;
} }

View File

@ -2,7 +2,6 @@
use std::{env, fs::File, io::Write, path::Path}; use std::{env, fs::File, io::Write, path::Path};
const TWO_MB: usize = 2_621_440;
const SIXTY_FIVE_KB: usize = 65_536; const SIXTY_FIVE_KB: usize = 65_536;
#[rustversion::nightly] #[rustversion::nightly]
@ -25,12 +24,9 @@ fn main() {
let dest_path = Path::new(&out_dir).join("constants.rs"); let dest_path = Path::new(&out_dir).join("constants.rs");
let mut constants_file = File::create(dest_path).expect("Could not create file"); let mut constants_file = File::create(dest_path).expect("Could not create file");
let edges_map_size_max: usize = option_env!("LIBAFL_EDGES_MAP_SIZE_MAX") let edges_map_size: usize = option_env!("LIBAFL_EDGES_MAP_SIZE")
.map_or(Ok(TWO_MB), str::parse) .map_or(Ok(SIXTY_FIVE_KB), str::parse)
.expect("Could not parse LIBAFL_EDGES_MAP_SIZE_MAX"); .expect("Could not parse LIBAFL_EDGES_MAP_SIZE");
let edges_map_size_in_use: usize = option_env!("LIBAFL_EDGES_MAP_SIZE_IN_USE")
.map_or(Ok(TWO_MB), str::parse)
.expect("Could not parse LIBAFL_EDGES_MAP_SIZE_IN_USE");
let cmp_map_size: usize = option_env!("LIBAFL_CMP_MAP_SIZE") let cmp_map_size: usize = option_env!("LIBAFL_CMP_MAP_SIZE")
.map_or(Ok(SIXTY_FIVE_KB), str::parse) .map_or(Ok(SIXTY_FIVE_KB), str::parse)
.expect("Could not parse LIBAFL_CMP_MAP_SIZE"); .expect("Could not parse LIBAFL_CMP_MAP_SIZE");
@ -52,9 +48,7 @@ fn main() {
"// These constants are autogenerated by build.rs "// These constants are autogenerated by build.rs
/// The default size of the edges map the fuzzer uses /// The default size of the edges map the fuzzer uses
pub const EDGES_MAP_SIZE_IN_USE: usize = {edges_map_size_in_use}; pub const EDGES_MAP_SIZE: usize = {edges_map_size};
/// The real allocated size of the edges map
pub const EDGES_MAP_SIZE_MAX: usize = {edges_map_size_max};
/// The size of the cmps map /// The size of the cmps map
pub const CMP_MAP_SIZE: usize = {cmp_map_size}; pub const CMP_MAP_SIZE: usize = {cmp_map_size};
/// The width of the `CmpLog` map /// The width of the `CmpLog` map
@ -69,7 +63,7 @@ fn main() {
) )
.expect("Could not write file"); .expect("Could not write file");
println!("cargo:rerun-if-env-changed=LIBAFL_EDGES_MAP_SIZE_IN_USE"); println!("cargo:rerun-if-env-changed=LIBAFL_EDGES_MAP_SIZE");
println!("cargo:rerun-if-env-changed=LIBAFL_CMP_MAP_SIZE"); println!("cargo:rerun-if-env-changed=LIBAFL_CMP_MAP_SIZE");
println!("cargo:rerun-if-env-changed=LIBAFL_CMPLOG_MAP_W"); println!("cargo:rerun-if-env-changed=LIBAFL_CMPLOG_MAP_W");
println!("cargo:rerun-if-env-changed=LIBAFL_CMPLOG_MAP_H"); println!("cargo:rerun-if-env-changed=LIBAFL_CMPLOG_MAP_H");
@ -158,10 +152,7 @@ fn main() {
cc::Build::new() cc::Build::new()
.file(src_dir.join("coverage.c")) .file(src_dir.join("coverage.c"))
.define( .define("EDGES_MAP_SIZE", Some(&*format!("{edges_map_size}")))
"EDGES_MAP_SIZE_MAX",
Some(&*format!("{edges_map_size_max}")),
)
.define("ACCOUNTING_MAP_SIZE", Some(&*format!("{acc_map_size}"))) .define("ACCOUNTING_MAP_SIZE", Some(&*format!("{acc_map_size}")))
.define("DDG_MAP_SIZE", Some(&*format!("{ddg_map_size}"))) .define("DDG_MAP_SIZE", Some(&*format!("{ddg_map_size}")))
.compile("coverage"); .compile("coverage");

View File

@ -8,7 +8,7 @@ typedef uint32_t prev_loc_t;
/* Maximum K for top-K context sensitivity */ /* Maximum K for top-K context sensitivity */
#define CTX_MAX_K 32U #define CTX_MAX_K 32U
extern uint8_t __afl_area_ptr_local[EDGES_MAP_SIZE_MAX]; extern uint8_t __afl_area_ptr_local[EDGES_MAP_SIZE];
uint8_t *__afl_area_ptr = __afl_area_ptr_local; uint8_t *__afl_area_ptr = __afl_area_ptr_local;
extern uint8_t __ddg_area_ptr_local[DDG_MAP_SIZE]; extern uint8_t __ddg_area_ptr_local[DDG_MAP_SIZE];

View File

@ -5,11 +5,11 @@ use alloc::string::String;
#[cfg(any(target_os = "linux", target_vendor = "apple"))] #[cfg(any(target_os = "linux", target_vendor = "apple"))]
use libafl::{mutators::Tokens, Error}; use libafl::{mutators::Tokens, Error};
use crate::{ACCOUNTING_MAP_SIZE, DDG_MAP_SIZE, EDGES_MAP_SIZE_IN_USE, EDGES_MAP_SIZE_MAX}; use crate::{ACCOUNTING_MAP_SIZE, DDG_MAP_SIZE, EDGES_MAP_SIZE};
/// The map for edges. /// The map for edges.
#[no_mangle] #[no_mangle]
pub static mut __afl_area_ptr_local: [u8; EDGES_MAP_SIZE_MAX] = [0; EDGES_MAP_SIZE_MAX]; pub static mut __afl_area_ptr_local: [u8; EDGES_MAP_SIZE] = [0; EDGES_MAP_SIZE];
pub use __afl_area_ptr_local as EDGES_MAP; pub use __afl_area_ptr_local as EDGES_MAP;
/// The map for data dependency /// The map for data dependency
@ -62,7 +62,7 @@ pub fn autotokens() -> Result<Tokens, Error> {
/// The size of the map for edges. /// The size of the map for edges.
#[no_mangle] #[no_mangle]
pub static mut __afl_map_size: usize = EDGES_MAP_SIZE_IN_USE; pub static mut __afl_map_size: usize = EDGES_MAP_SIZE;
pub use __afl_map_size as EDGES_MAP_PTR_NUM; pub use __afl_map_size as EDGES_MAP_PTR_NUM;
use libafl::observers::StdMapObserver; use libafl::observers::StdMapObserver;
use libafl_bolts::ownedref::OwnedMutSlice; use libafl_bolts::ownedref::OwnedMutSlice;

View File

@ -14,13 +14,14 @@ use libafl::executors::{hooks::ExecutorHook, HasObservers};
feature = "sancov_pcguard_hitcounts", feature = "sancov_pcguard_hitcounts",
feature = "sancov_ctx", feature = "sancov_ctx",
feature = "sancov_ngram4", feature = "sancov_ngram4",
feature = "sancov_ngram8",
))] ))]
use crate::coverage::EDGES_MAP; use crate::coverage::EDGES_MAP;
use crate::coverage::MAX_EDGES_NUM; use crate::coverage::MAX_EDGES_NUM;
#[cfg(feature = "pointer_maps")] #[cfg(feature = "pointer_maps")]
use crate::coverage::{EDGES_MAP_PTR, EDGES_MAP_PTR_NUM}; use crate::coverage::{EDGES_MAP_PTR, EDGES_MAP_PTR_NUM};
#[cfg(feature = "sancov_ngram4")] #[cfg(feature = "sancov_ngram4")]
use crate::EDGES_MAP_SIZE_IN_USE; use crate::EDGES_MAP_SIZE;
#[cfg(all(feature = "sancov_pcguard_edges", feature = "sancov_pcguard_hitcounts"))] #[cfg(all(feature = "sancov_pcguard_edges", feature = "sancov_pcguard_hitcounts"))]
#[cfg(not(any(doc, feature = "clippy")))] #[cfg(not(any(doc, feature = "clippy")))]
@ -189,7 +190,7 @@ unsafe fn update_ngram(pos: usize) -> usize {
PREV_ARRAY_8.as_mut_array()[0] = pos as u32; PREV_ARRAY_8.as_mut_array()[0] = pos as u32;
reduced = PREV_ARRAY_8.reduce_xor() as usize; reduced = PREV_ARRAY_8.reduce_xor() as usize;
} }
reduced %= EDGES_MAP_SIZE_IN_USE; reduced %= EDGES_MAP_SIZE;
reduced reduced
} }
@ -218,13 +219,13 @@ pub unsafe extern "C" fn __sanitizer_cov_trace_pc_guard(guard: *mut u32) {
#[cfg(any(feature = "sancov_ngram4", feature = "sancov_ngram8"))] #[cfg(any(feature = "sancov_ngram4", feature = "sancov_ngram8"))]
{ {
pos = update_ngram(pos); pos = update_ngram(pos);
// println!("Wrinting to {} {}", pos, EDGES_MAP_SIZE_IN_USE); // println!("Wrinting to {} {}", pos, EDGES_MAP_SIZE);
} }
#[cfg(feature = "sancov_ctx")] #[cfg(feature = "sancov_ctx")]
{ {
pos ^= __afl_prev_ctx as usize; pos ^= __afl_prev_ctx as usize;
// println!("Wrinting to {} {}", pos, EDGES_MAP_SIZE_IN_USE); // println!("Wrinting to {} {}", pos, EDGES_MAP_SIZE);
} }
#[cfg(feature = "pointer_maps")] #[cfg(feature = "pointer_maps")]
@ -281,7 +282,7 @@ pub unsafe extern "C" fn __sanitizer_cov_trace_pc_guard_init(mut start: *mut u32
#[cfg(not(feature = "pointer_maps"))] #[cfg(not(feature = "pointer_maps"))]
{ {
MAX_EDGES_NUM = MAX_EDGES_NUM.wrapping_add(1); MAX_EDGES_NUM = MAX_EDGES_NUM.wrapping_add(1);
assert!((MAX_EDGES_NUM <= EDGES_MAP.len()), "The number of edges reported by SanitizerCoverage exceed the size of the edges map ({}). Use the LIBAFL_EDGES_MAP_SIZE_IN_USE env to increase it at compile time.", EDGES_MAP.len()); assert!((MAX_EDGES_NUM <= EDGES_MAP.len()), "The number of edges reported by SanitizerCoverage exceed the size of the edges map ({}). Use the LIBAFL_EDGES_MAP_SIZE env to increase it at compile time.", EDGES_MAP.len());
} }
} }
} }