diff --git a/libafl/Cargo.toml b/libafl/Cargo.toml index e130ec56a0..bf73361a42 100644 --- a/libafl/Cargo.toml +++ b/libafl/Cargo.toml @@ -144,7 +144,7 @@ postcard = { version = "1.0", features = ["alloc"], default-features = false } # bincode = {version = "1.3", optional = true } c2rust-bitfields = { version = "0.17", features = ["no_std"] } ahash = { version = "0.8", default-features=false } # The hash function already used in hashbrown -intervaltree = { version = "0.2.7", default-features = false, features = ["serde"] } +meminterval = { version = "0.4", features = ["serde"] } backtrace = {version = "0.3", optional = true} # Used to get the stacktrace in StacktraceObserver typed-builder = { version = "0.15.2", optional = true } # Implement the builder pattern at compiletime diff --git a/libafl/src/observers/map.rs b/libafl/src/observers/map.rs index 0abb7bcfb1..488ee58a32 100644 --- a/libafl/src/observers/map.rs +++ b/libafl/src/observers/map.rs @@ -13,11 +13,11 @@ use core::{ }; use ahash::RandomState; -use intervaltree::IntervalTree; use libafl_bolts::{ ownedref::{OwnedMutPtr, OwnedMutSlice}, AsIter, AsIterMut, AsMutSlice, AsSlice, HasLen, Named, Truncate, }; +use meminterval::IntervalTree; use num_traits::Bounded; use serde::{Deserialize, Serialize}; @@ -1739,17 +1739,17 @@ where #[inline] fn get(&self, idx: usize) -> &T { - let elem = self.intervals.query_point(idx).next().unwrap(); - let i = elem.value; - let j = idx - elem.range.start; + let elem = self.intervals.query(idx..=idx).next().unwrap(); + let i = *elem.value; + let j = idx - elem.interval.start; &self.maps[i].as_slice()[j] } #[inline] fn get_mut(&mut self, idx: usize) -> &mut T { - let elem = self.intervals.query_point(idx).next().unwrap(); - let i = elem.value; - let j = idx - elem.range.start; + let elem = self.intervals.query(idx..=idx).next().unwrap(); + let i = *elem.value; + let j = idx - elem.interval.start; &mut self.maps[i].as_mut_slice()[j] } @@ -1829,16 +1829,15 @@ where #[must_use] fn maybe_differential(name: &'static str, maps: Vec>) -> Self { let mut idx = 0; - let mut builder = vec![]; + let mut intervals = IntervalTree::new(); for (v, x) in maps.iter().enumerate() { let l = x.as_slice().len(); - let r = (idx..(idx + l), v); + intervals.insert(idx..(idx + l), v); idx += l; - builder.push(r); } Self { maps, - intervals: builder.into_iter().collect::>(), + intervals, len: idx, name: name.to_string(), initial: T::default(), @@ -1873,21 +1872,20 @@ where pub fn owned(name: &'static str, maps: Vec>) -> Self { let mut idx = 0; let mut v = 0; - let mut builder = vec![]; + let mut intervals = IntervalTree::new(); let maps: Vec<_> = maps .into_iter() .map(|x| { let l = x.len(); - let r = (idx..(idx + l), v); + intervals.insert(idx..(idx + l), v); idx += l; - builder.push(r); v += 1; OwnedMutSlice::from(x) }) .collect(); Self { maps, - intervals: builder.into_iter().collect::>(), + intervals, len: idx, name: name.to_string(), initial: T::default(), diff --git a/libafl_qemu/Cargo.toml b/libafl_qemu/Cargo.toml index a9c945a5f6..f29caa11e7 100644 --- a/libafl_qemu/Cargo.toml +++ b/libafl_qemu/Cargo.toml @@ -56,7 +56,7 @@ libc = "0.2" strum = "0.25" strum_macros = "0.25" syscall-numbers = "3.0" -meminterval = "0.3" +meminterval = "0.4" thread_local = "1.1.4" capstone = "0.11.0" pyo3 = { version = "0.18.3", optional = true } diff --git a/libafl_targets/Cargo.toml b/libafl_targets/Cargo.toml index 9ac61ec5e7..7dc4298169 100644 --- a/libafl_targets/Cargo.toml +++ b/libafl_targets/Cargo.toml @@ -32,7 +32,7 @@ sancov_cmplog = [] sancov_pcguard = ["sancov_pcguard_hitcounts"] sanitizer_interfaces = [] clippy = [] # Ignore compiler warnings during clippy -observers = ["intervaltree", "ahash"] +observers = ["meminterval", "ahash"] [build-dependencies] bindgen = "0.64.0" @@ -46,6 +46,6 @@ log = "0.4.20" rangemap = "1.3" serde = { version = "1.0", default-features = false, features = ["alloc"] } # serialization lib -intervaltree = { version = "0.2.7", default-features = false, features = ["serde"], optional = true } +meminterval = {version = "0.4", features = ["serde"], optional = true } ahash = { version = "0.8.3", default-features = false, optional = true } # serde-big-array = "0.3.2" diff --git a/libafl_targets/src/sancov_8bit.rs b/libafl_targets/src/sancov_8bit.rs index 74922ec2de..243d40442d 100644 --- a/libafl_targets/src/sancov_8bit.rs +++ b/libafl_targets/src/sancov_8bit.rs @@ -70,7 +70,6 @@ mod observers { }; use ahash::RandomState; - use intervaltree::IntervalTree; use libafl::{ inputs::UsesInput, observers::{DifferentialObserver, MapObserver, Observer, ObserversTuple}, @@ -79,6 +78,7 @@ mod observers { use libafl_bolts::{ ownedref::OwnedMutSlice, AsIter, AsIterMut, AsMutSlice, AsSlice, HasLen, Named, }; + use meminterval::IntervalTree; use serde::{Deserialize, Serialize}; use super::COUNTERS_MAPS; @@ -162,18 +162,18 @@ mod observers { #[inline] fn get(&self, idx: usize) -> &u8 { - let elem = self.intervals.query_point(idx).next().unwrap(); + let elem = self.intervals.query(idx..=idx).next().unwrap(); let i = elem.value; - let j = idx - elem.range.start; - unsafe { &COUNTERS_MAPS[i].as_slice()[j] } + let j = idx - elem.interval.start; + unsafe { &COUNTERS_MAPS[*i].as_slice()[j] } } #[inline] fn get_mut(&mut self, idx: usize) -> &mut u8 { - let elem = self.intervals.query_point(idx).next().unwrap(); + let elem = self.intervals.query_mut(idx..=idx).next().unwrap(); let i = elem.value; - let j = idx - elem.range.start; - unsafe { &mut COUNTERS_MAPS[i].as_mut_slice()[j] } + let j = idx - elem.interval.start; + unsafe { &mut COUNTERS_MAPS[*i].as_mut_slice()[j] } } #[inline] @@ -249,15 +249,14 @@ mod observers { #[must_use] fn maybe_differential(name: &'static str) -> Self { let mut idx = 0; - let mut builder = vec![]; + let mut intervals = IntervalTree::new(); for (v, x) in unsafe { &COUNTERS_MAPS }.iter().enumerate() { let l = x.as_slice().len(); - let r = (idx..(idx + l), v); + intervals.insert(idx..(idx + l), v); idx += l; - builder.push(r); } Self { - intervals: builder.into_iter().collect::>(), + intervals, len: idx, name: name.to_string(), initial: u8::default(), @@ -286,16 +285,15 @@ mod observers { pub fn owned(name: &'static str) -> Self { let mut idx = 0; let mut v = 0; - let mut builder = vec![]; + let mut intervals = IntervalTree::new(); unsafe { &mut COUNTERS_MAPS }.iter_mut().for_each(|m| { let l = m.as_mut_slice().len(); - let r = (idx..(idx + l), v); + intervals.insert(idx..(idx + l), v); idx += l; - builder.push(r); v += 1; }); Self { - intervals: builder.into_iter().collect::>(), + intervals, len: idx, name: name.to_string(), initial: u8::default(),