Shorthand functions to get typed metadata, renamed metatdata -> metadata_map (#1123)
* Created macro to get the metadata form State and Testcase * Expanded the macros for mutable, or not, State and Testcase metadata * Created functions on traits HasMetadata and HasNamedMetadatato get, mutable or not, metadata * Created the functions to get metadata * Added #[inline] attribute and renamed the functions * Renamed the functions and added #[inline] attribute * Temporarily added testcase() function * Added testcase() function * Changed Ref import to core::cell:Ref * Added testcase_mut() and renamed occurences of metadata() and metadata_mut() * Renamed more occurences * Renamed the metadata() on impl HasMetadata for NopState --------- Co-authored-by: Andrea Fioraldi <andreafioraldi@gmail.com>
This commit is contained in:
parent
8dfdee6fce
commit
c38405ef83
@ -107,7 +107,7 @@ pub fn main() {
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from([b"FOO".to_vec(), b"BAR".to_vec()]));
|
||||
}
|
||||
|
||||
|
@ -74,7 +74,7 @@ pub fn main() {
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
if state.metadata().get::<NautilusChunksMetadata>().is_none() {
|
||||
if state.metadata_map().get::<NautilusChunksMetadata>().is_none() {
|
||||
state.add_metadata(NautilusChunksMetadata::new("/tmp/".into()));
|
||||
}
|
||||
|
||||
|
@ -156,7 +156,7 @@ unsafe fn fuzz(options: &FuzzerOptions) -> Result<(), Error> {
|
||||
println!("We're a client, let's fuzz :)");
|
||||
|
||||
// Create a PNG dictionary if not existing
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from([
|
||||
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
|
||||
b"IHDR".to_vec(),
|
||||
@ -271,7 +271,7 @@ unsafe fn fuzz(options: &FuzzerOptions) -> Result<(), Error> {
|
||||
println!("We're a client, let's fuzz :)");
|
||||
|
||||
// Create a PNG dictionary if not existing
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from([
|
||||
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
|
||||
b"IHDR".to_vec(),
|
||||
@ -401,7 +401,7 @@ unsafe fn fuzz(options: &FuzzerOptions) -> Result<(), Error> {
|
||||
println!("We're a client, let's fuzz :)");
|
||||
|
||||
// Create a PNG dictionary if not existing
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from([
|
||||
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
|
||||
b"IHDR".to_vec(),
|
||||
|
@ -154,7 +154,7 @@ unsafe fn fuzz(options: &FuzzerOptions) -> Result<(), Error> {
|
||||
println!("We're a client, let's fuzz :)");
|
||||
|
||||
// Create a PNG dictionary if not existing
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from([
|
||||
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
|
||||
b"IHDR".to_vec(),
|
||||
@ -269,7 +269,7 @@ unsafe fn fuzz(options: &FuzzerOptions) -> Result<(), Error> {
|
||||
println!("We're a client, let's fuzz :)");
|
||||
|
||||
// Create a PNG dictionary if not existing
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from([
|
||||
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
|
||||
b"IHDR".to_vec(),
|
||||
@ -399,7 +399,7 @@ unsafe fn fuzz(options: &FuzzerOptions) -> Result<(), Error> {
|
||||
println!("We're a client, let's fuzz :)");
|
||||
|
||||
// Create a PNG dictionary if not existing
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from([
|
||||
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
|
||||
b"IHDR".to_vec(),
|
||||
|
@ -355,7 +355,7 @@ fn fuzz(
|
||||
let mut stages = tuple_list!(calibration, tracing, i2s, power);
|
||||
|
||||
// Read tokens
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
let mut toks = Tokens::default();
|
||||
if let Some(tokenfile) = tokenfile {
|
||||
toks.add_from_file(tokenfile)?;
|
||||
|
@ -351,7 +351,7 @@ fn fuzz(
|
||||
|
||||
// Read tokens
|
||||
if let Some(tokenfile) = tokenfile {
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from_file(tokenfile)?);
|
||||
}
|
||||
}
|
||||
|
@ -366,7 +366,7 @@ fn fuzz(
|
||||
|
||||
// Read tokens
|
||||
if let Some(tokenfile) = tokenfile {
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from_file(tokenfile)?);
|
||||
}
|
||||
}
|
||||
|
@ -416,7 +416,7 @@ fn fuzz_binary(
|
||||
let mut stages = tuple_list!(calibration, tracing, i2s, power);
|
||||
|
||||
// Read tokens
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
let mut toks = Tokens::default();
|
||||
if let Some(tokenfile) = tokenfile {
|
||||
toks.add_from_file(tokenfile)?;
|
||||
@ -635,7 +635,7 @@ fn fuzz_text(
|
||||
let mut stages = tuple_list!(generalization, calibration, tracing, i2s, power, grimoire);
|
||||
|
||||
// Read tokens
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
let mut toks = Tokens::default();
|
||||
if let Some(tokenfile) = tokenfile {
|
||||
toks.add_from_file(tokenfile)?;
|
||||
|
@ -236,7 +236,7 @@ pub fn LLVMFuzzerRunDriver(
|
||||
});
|
||||
|
||||
// Create a dictionary if not existing
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
for tokens_file in &token_files {
|
||||
state.add_metadata(Tokens::from_file(tokens_file)?);
|
||||
}
|
||||
|
@ -118,7 +118,7 @@ fn fuzz(corpus_dirs: &[PathBuf], objective_dir: PathBuf, broker_port: u16) -> Re
|
||||
println!("We're a client, let's fuzz :)");
|
||||
|
||||
// Add the JPEG tokens if not existing
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from_file("./jpeg.dict")?);
|
||||
}
|
||||
|
||||
|
@ -128,7 +128,7 @@ fn fuzz(corpus_dirs: &[PathBuf], objective_dir: PathBuf, broker_port: u16) -> Re
|
||||
println!("We're a client, let's fuzz :)");
|
||||
|
||||
// Create a PNG dictionary if not existing
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from([
|
||||
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
|
||||
"IHDR".as_bytes().to_vec(),
|
||||
|
@ -174,7 +174,7 @@ pub fn libafl_main() {
|
||||
println!("We're a client, let's fuzz :)");
|
||||
|
||||
// Create a PNG dictionary if not existing
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from(vec![
|
||||
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
|
||||
"IHDR".as_bytes().to_vec(),
|
||||
|
@ -127,7 +127,7 @@ fn fuzz(corpus_dirs: &[PathBuf], objective_dir: PathBuf, broker_port: u16) -> Re
|
||||
println!("We're a client, let's fuzz :)");
|
||||
|
||||
// Create a PNG dictionary if not existing
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from([
|
||||
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
|
||||
"IHDR".as_bytes().to_vec(),
|
||||
|
@ -168,7 +168,7 @@ pub fn libafl_main() {
|
||||
println!("We're a client, let's fuzz :)");
|
||||
|
||||
// Create a PNG dictionary if not existing
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from([
|
||||
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
|
||||
"IHDR".as_bytes().to_vec(),
|
||||
|
@ -173,7 +173,7 @@ pub fn libafl_main() {
|
||||
println!("We're a client, let's fuzz :)");
|
||||
|
||||
// Create a PNG dictionary if not existing
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from([
|
||||
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
|
||||
"IHDR".as_bytes().to_vec(),
|
||||
|
@ -172,7 +172,7 @@ pub fn libafl_main() {
|
||||
.unwrap()
|
||||
});
|
||||
|
||||
if state.metadata().get::<NautilusChunksMetadata>().is_none() {
|
||||
if state.metadata_map().get::<NautilusChunksMetadata>().is_none() {
|
||||
state.add_metadata(NautilusChunksMetadata::new("/tmp/".into()));
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,7 @@ where
|
||||
{
|
||||
fn compute(entry: &mut Testcase<PacketData>, _state: &S) -> Result<f64, Error> {
|
||||
Ok(entry
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<PacketLenMetadata>()
|
||||
.map_or(1, |m| m.length) as f64)
|
||||
}
|
||||
@ -69,7 +69,7 @@ where
|
||||
testcase: &mut Testcase<PacketData>,
|
||||
) -> Result<(), Error> {
|
||||
testcase
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.insert(PacketLenMetadata { length: self.len });
|
||||
Ok(())
|
||||
}
|
||||
|
@ -230,7 +230,7 @@ where
|
||||
));
|
||||
|
||||
let ondisk_meta = OnDiskMetadata {
|
||||
metadata: testcase.metadata(),
|
||||
metadata: testcase.metadata_map(),
|
||||
exec_time: testcase.exec_time(),
|
||||
executions: testcase.executions(),
|
||||
};
|
||||
|
@ -45,13 +45,13 @@ where
|
||||
{
|
||||
/// Get all the metadata into an [`hashbrown::HashMap`]
|
||||
#[inline]
|
||||
fn metadata(&self) -> &SerdeAnyMap {
|
||||
fn metadata_map(&self) -> &SerdeAnyMap {
|
||||
&self.metadata
|
||||
}
|
||||
|
||||
/// Get all the metadata into an [`hashbrown::HashMap`] (mutable)
|
||||
#[inline]
|
||||
fn metadata_mut(&mut self) -> &mut SerdeAnyMap {
|
||||
fn metadata_map_mut(&mut self) -> &mut SerdeAnyMap {
|
||||
&mut self.metadata
|
||||
}
|
||||
}
|
||||
@ -476,7 +476,7 @@ pub mod pybind {
|
||||
}
|
||||
|
||||
fn metadata(&mut self) -> PyObject {
|
||||
let meta = self.inner.as_mut().metadata_mut();
|
||||
let meta = self.inner.as_mut().metadata_map_mut();
|
||||
if !meta.contains::<PythonMetadata>() {
|
||||
Python::with_gil(|py| {
|
||||
let dict: Py<PyDict> = PyDict::new(py).into();
|
||||
|
@ -79,7 +79,7 @@ where
|
||||
.match_name::<ConcolicObserver>(&self.name)
|
||||
.map(ConcolicObserver::create_metadata_from_current_map)
|
||||
{
|
||||
testcase.metadata_mut().insert(metadata);
|
||||
testcase.metadata_map_mut().insert(metadata);
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
@ -441,7 +441,7 @@ where
|
||||
let observer = observers.match_name::<O>(&self.observer_name).unwrap();
|
||||
let initial = observer.initial();
|
||||
let map_state = state
|
||||
.named_metadata_mut()
|
||||
.named_metadata_map_mut()
|
||||
.get_mut::<MapFeedbackMetadata<T>>(&self.name)
|
||||
.unwrap();
|
||||
|
||||
@ -504,7 +504,7 @@ where
|
||||
let observer = observers.match_name::<O>(&self.observer_name).unwrap();
|
||||
|
||||
let map_state = state
|
||||
.named_metadata_mut()
|
||||
.named_metadata_map_mut()
|
||||
.get_mut::<MapFeedbackMetadata<u8>>(&self.name)
|
||||
.unwrap();
|
||||
let size = observer.usable_count();
|
||||
@ -754,7 +754,7 @@ where
|
||||
let observer = observers.match_name::<O>(&self.observer_name).unwrap();
|
||||
|
||||
let map_state = state
|
||||
.named_metadata_mut()
|
||||
.named_metadata_map_mut()
|
||||
.get_mut::<MapFeedbackMetadata<T>>(&self.name)
|
||||
.unwrap();
|
||||
let len = observer.len();
|
||||
|
@ -111,7 +111,7 @@ where
|
||||
{
|
||||
let input = testcase.load_input()?.clone();
|
||||
let meta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<NautilusChunksMetadata>()
|
||||
.expect("NautilusChunksMetadata not in the state");
|
||||
meta.cks.add_tree(input.tree, self.ctx);
|
||||
|
@ -115,7 +115,7 @@ where
|
||||
.expect("A NewHashFeedback needs a BacktraceObserver");
|
||||
|
||||
let backtrace_state = state
|
||||
.named_metadata_mut()
|
||||
.named_metadata_map_mut()
|
||||
.get_mut::<NewHashFeedbackMetadata>(&self.name)
|
||||
.unwrap();
|
||||
|
||||
|
@ -113,7 +113,7 @@ where
|
||||
corpus_idx: CorpusId,
|
||||
) -> Result<Self, Error> {
|
||||
let meta = base
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<GeneralizedInputMetadata>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found(format!(
|
||||
@ -121,6 +121,7 @@ where
|
||||
))
|
||||
})
|
||||
.cloned()?;
|
||||
|
||||
Ok(meta)
|
||||
}
|
||||
|
||||
|
@ -125,7 +125,7 @@ where
|
||||
other_testcase.add_metadata(meta);
|
||||
}
|
||||
let meta = other_testcase
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<GramatronIdxMapMetadata>()
|
||||
.unwrap();
|
||||
let other = other_testcase.input().as_ref().unwrap();
|
||||
|
@ -34,7 +34,10 @@ where
|
||||
let rand2 = state.rand_mut().next() as usize;
|
||||
|
||||
let other_testcase = state.corpus().get(idx)?.borrow();
|
||||
if let Some(other) = other_testcase.metadata().get::<GeneralizedInputMetadata>() {
|
||||
if let Some(other) = other_testcase
|
||||
.metadata_map()
|
||||
.get::<GeneralizedInputMetadata>()
|
||||
{
|
||||
let gen = other.generalized();
|
||||
|
||||
for (i, _) in gen
|
||||
@ -64,7 +67,7 @@ where
|
||||
|
||||
let rand1 = state.rand_mut().next() as usize;
|
||||
|
||||
if let Some(meta) = state.metadata().get::<Tokens>() {
|
||||
if let Some(meta) = state.metadata_map().get::<Tokens>() {
|
||||
if !meta.tokens().is_empty() {
|
||||
let tok = &meta.tokens()[rand1 % meta.tokens().len()];
|
||||
if items.last() != Some(&GeneralizedItem::Gap) {
|
||||
@ -82,7 +85,10 @@ where
|
||||
}
|
||||
|
||||
let other_testcase = state.corpus().get(idx)?.borrow();
|
||||
if let Some(other) = other_testcase.metadata().get::<GeneralizedInputMetadata>() {
|
||||
if let Some(other) = other_testcase
|
||||
.metadata_map()
|
||||
.get::<GeneralizedInputMetadata>()
|
||||
{
|
||||
let gen = other.generalized();
|
||||
|
||||
if items.last() == Some(&GeneralizedItem::Gap) && gen.first() == Some(&GeneralizedItem::Gap)
|
||||
@ -232,7 +238,7 @@ where
|
||||
_stage_idx: i32,
|
||||
) -> Result<MutationResult, Error> {
|
||||
let tokens_len = {
|
||||
let meta = state.metadata().get::<Tokens>();
|
||||
let meta = state.metadata_map().get::<Tokens>();
|
||||
if let Some(tokens) = meta {
|
||||
if tokens.is_empty() {
|
||||
return Ok(MutationResult::Skipped);
|
||||
@ -252,7 +258,7 @@ where
|
||||
let stop_at_first = state.rand_mut().below(100) > 50;
|
||||
let mut rand_idx = state.rand_mut().next() as usize;
|
||||
|
||||
let meta = state.metadata().get::<Tokens>().unwrap();
|
||||
let meta = state.metadata_map().get::<Tokens>().unwrap();
|
||||
let token_1 = &meta.tokens()[token_find];
|
||||
let token_2 = &meta.tokens()[token_replace];
|
||||
|
||||
|
@ -413,7 +413,7 @@ where
|
||||
let before = self.finds_before;
|
||||
let after = state.corpus().count() + state.solutions().count();
|
||||
|
||||
let mopt = state.metadata_mut().get_mut::<MOpt>().unwrap();
|
||||
let mopt = state.metadata_map_mut().get_mut::<MOpt>().unwrap();
|
||||
let key_module = self.mode;
|
||||
match key_module {
|
||||
MOptMode::Corefuzzing => {
|
||||
@ -553,7 +553,7 @@ where
|
||||
stage_idx: i32,
|
||||
) -> Result<MutationResult, Error> {
|
||||
let mut r = MutationResult::Skipped;
|
||||
let mopt = state.metadata_mut().get_mut::<MOpt>().unwrap();
|
||||
let mopt = state.metadata_map_mut().get_mut::<MOpt>().unwrap();
|
||||
for i in 0..mopt.operator_num {
|
||||
mopt.core_operator_cycles_v3[i] = mopt.core_operator_cycles_v2[i];
|
||||
}
|
||||
@ -568,7 +568,7 @@ where
|
||||
}
|
||||
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<MOpt>()
|
||||
.unwrap()
|
||||
.core_operator_cycles_v2[idx.0] += 1;
|
||||
@ -585,7 +585,7 @@ where
|
||||
let mut r = MutationResult::Skipped;
|
||||
let swarm_now;
|
||||
{
|
||||
let mopt = state.metadata_mut().get_mut::<MOpt>().unwrap();
|
||||
let mopt = state.metadata_map_mut().get_mut::<MOpt>().unwrap();
|
||||
swarm_now = mopt.swarm_now;
|
||||
|
||||
for i in 0..mopt.operator_num {
|
||||
@ -604,7 +604,7 @@ where
|
||||
}
|
||||
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<MOpt>()
|
||||
.unwrap()
|
||||
.pilot_operator_cycles_v2[swarm_now][idx.0] += 1;
|
||||
@ -646,7 +646,7 @@ where
|
||||
#[inline]
|
||||
fn schedule(&self, state: &mut S, _: &I) -> MutationId {
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<MOpt>()
|
||||
.unwrap()
|
||||
.select_algorithm()
|
||||
|
@ -165,7 +165,7 @@ where
|
||||
_stage_idx: i32,
|
||||
) -> Result<MutationResult, Error> {
|
||||
let meta = state
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<NautilusChunksMetadata>()
|
||||
.expect("NautilusChunksMetadata not in the state");
|
||||
// TODO get rid of tmp
|
||||
|
@ -304,7 +304,7 @@ where
|
||||
) -> Result<MutationResult, Error> {
|
||||
let max_size = state.max_size();
|
||||
let tokens_len = {
|
||||
let meta = state.metadata().get::<Tokens>();
|
||||
let meta = state.metadata_map().get::<Tokens>();
|
||||
if meta.is_none() {
|
||||
return Ok(MutationResult::Skipped);
|
||||
}
|
||||
@ -318,7 +318,7 @@ where
|
||||
let size = input.bytes().len();
|
||||
let off = state.rand_mut().below((size + 1) as u64) as usize;
|
||||
|
||||
let meta = state.metadata().get::<Tokens>().unwrap();
|
||||
let meta = state.metadata_map().get::<Tokens>().unwrap();
|
||||
let token = &meta.tokens()[token_idx];
|
||||
let mut len = token.len();
|
||||
|
||||
@ -374,7 +374,7 @@ where
|
||||
}
|
||||
|
||||
let tokens_len = {
|
||||
let meta = state.metadata().get::<Tokens>();
|
||||
let meta = state.metadata_map().get::<Tokens>();
|
||||
if meta.is_none() {
|
||||
return Ok(MutationResult::Skipped);
|
||||
}
|
||||
@ -387,7 +387,7 @@ where
|
||||
|
||||
let off = state.rand_mut().below(size as u64) as usize;
|
||||
|
||||
let meta = state.metadata().get::<Tokens>().unwrap();
|
||||
let meta = state.metadata_map().get::<Tokens>().unwrap();
|
||||
let token = &meta.tokens()[token_idx];
|
||||
let mut len = token.len();
|
||||
if off + len > size {
|
||||
@ -437,7 +437,7 @@ where
|
||||
}
|
||||
|
||||
let cmps_len = {
|
||||
let meta = state.metadata().get::<CmpValuesMetadata>();
|
||||
let meta = state.metadata_map().get::<CmpValuesMetadata>();
|
||||
if meta.is_none() {
|
||||
return Ok(MutationResult::Skipped);
|
||||
}
|
||||
@ -452,7 +452,7 @@ where
|
||||
let len = input.bytes().len();
|
||||
let bytes = input.bytes_mut();
|
||||
|
||||
let meta = state.metadata().get::<CmpValuesMetadata>().unwrap();
|
||||
let meta = state.metadata_map().get::<CmpValuesMetadata>().unwrap();
|
||||
let cmp_values = &meta.list[idx];
|
||||
|
||||
let mut result = MutationResult::Skipped;
|
||||
@ -1077,8 +1077,8 @@ where
|
||||
}
|
||||
|
||||
let (cmp_len, cmp_meta, taint_meta) = {
|
||||
let cmp_meta = state.metadata().get::<AFLppCmpValuesMetadata>();
|
||||
let taint_meta = state.metadata().get::<TaintMetadata>();
|
||||
let cmp_meta = state.metadata_map().get::<AFLppCmpValuesMetadata>();
|
||||
let taint_meta = state.metadata_map().get::<TaintMetadata>();
|
||||
if cmp_meta.is_none() || taint_meta.is_none() {
|
||||
return Ok(MutationResult::Skipped);
|
||||
}
|
||||
|
@ -57,7 +57,7 @@ impl TuneableScheduledMutatorMetadata {
|
||||
/// Gets the stored metadata, used to alter the [`TuneableScheduledMutator`] behavior
|
||||
pub fn get<S: HasMetadata>(state: &S) -> Result<&Self, Error> {
|
||||
state
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<Self>()
|
||||
.ok_or_else(|| Error::illegal_state("TuneableScheduledMutator not in use"))
|
||||
}
|
||||
@ -65,7 +65,7 @@ impl TuneableScheduledMutatorMetadata {
|
||||
/// Gets the stored metadata, used to alter the [`TuneableScheduledMutator`] behavior, mut
|
||||
pub fn get_mut<S: HasMetadata>(state: &mut S) -> Result<&mut Self, Error> {
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<Self>()
|
||||
.ok_or_else(|| Error::illegal_state("TuneableScheduledMutator not in use"))
|
||||
}
|
||||
@ -228,14 +228,14 @@ where
|
||||
{
|
||||
fn metadata_mut(state: &mut S) -> &mut TuneableScheduledMutatorMetadata {
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<TuneableScheduledMutatorMetadata>()
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
fn metadata(state: &S) -> &TuneableScheduledMutatorMetadata {
|
||||
state
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<TuneableScheduledMutatorMetadata>()
|
||||
.unwrap()
|
||||
}
|
||||
|
@ -138,11 +138,14 @@ where
|
||||
S: HasMetadata,
|
||||
{
|
||||
#[allow(clippy::option_if_let_else)] // we can't mutate state in a closure
|
||||
let meta = if let Some(meta) = state.metadata_mut().get_mut::<CmpValuesMetadata>() {
|
||||
let meta = if let Some(meta) = state.metadata_map_mut().get_mut::<CmpValuesMetadata>() {
|
||||
meta
|
||||
} else {
|
||||
state.add_metadata(CmpValuesMetadata::new());
|
||||
state.metadata_mut().get_mut::<CmpValuesMetadata>().unwrap()
|
||||
state
|
||||
.metadata_map_mut()
|
||||
.get_mut::<CmpValuesMetadata>()
|
||||
.unwrap()
|
||||
};
|
||||
meta.list.clear();
|
||||
let count = self.usable_count();
|
||||
@ -390,12 +393,13 @@ where
|
||||
S: HasMetadata,
|
||||
{
|
||||
#[allow(clippy::option_if_let_else)] // we can't mutate state in a closure
|
||||
let meta = if let Some(meta) = state.metadata_mut().get_mut::<AFLppCmpValuesMetadata>() {
|
||||
let meta = if let Some(meta) = state.metadata_map_mut().get_mut::<AFLppCmpValuesMetadata>()
|
||||
{
|
||||
meta
|
||||
} else {
|
||||
state.add_metadata(AFLppCmpValuesMetadata::new());
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<AFLppCmpValuesMetadata>()
|
||||
.unwrap()
|
||||
};
|
||||
|
@ -145,7 +145,7 @@ where
|
||||
|
||||
fn next(&mut self, state: &mut Self::State) -> Result<CorpusId, Error> {
|
||||
if state
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<TopAccountingMetadata>()
|
||||
.map_or(false, |x| x.changed)
|
||||
{
|
||||
@ -207,7 +207,7 @@ where
|
||||
|
||||
let mut equal_score = false;
|
||||
{
|
||||
let top_acc = state.metadata().get::<TopAccountingMetadata>().unwrap();
|
||||
let top_acc = state.metadata_map().get::<TopAccountingMetadata>().unwrap();
|
||||
|
||||
if let Some(old_idx) = top_acc.map.get(&idx) {
|
||||
if top_acc.max_accounting[idx] > self.accounting_map[idx] {
|
||||
@ -220,7 +220,7 @@ where
|
||||
|
||||
let mut old = state.corpus().get(*old_idx)?.borrow_mut();
|
||||
let must_remove = {
|
||||
let old_meta = old.metadata_mut().get_mut::<AccountingIndexesMetadata>().ok_or_else(|| {
|
||||
let old_meta = old.metadata_map_mut().get_mut::<AccountingIndexesMetadata>().ok_or_else(|| {
|
||||
Error::key_not_found(format!(
|
||||
"AccountingIndexesMetadata, needed by CoverageAccountingScheduler, not found in testcase #{old_idx}"
|
||||
))
|
||||
@ -230,13 +230,13 @@ where
|
||||
};
|
||||
|
||||
if must_remove {
|
||||
drop(old.metadata_mut().remove::<AccountingIndexesMetadata>());
|
||||
drop(old.metadata_map_mut().remove::<AccountingIndexesMetadata>());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let top_acc = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<TopAccountingMetadata>()
|
||||
.unwrap();
|
||||
|
||||
@ -255,12 +255,18 @@ where
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
state.corpus().get(idx)?.borrow_mut().metadata_mut().insert(
|
||||
AccountingIndexesMetadata::with_tcref(indexes, new_favoreds.len() as isize),
|
||||
);
|
||||
state
|
||||
.corpus()
|
||||
.get(idx)?
|
||||
.borrow_mut()
|
||||
.metadata_map_mut()
|
||||
.insert(AccountingIndexesMetadata::with_tcref(
|
||||
indexes,
|
||||
new_favoreds.len() as isize,
|
||||
));
|
||||
|
||||
let top_acc = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<TopAccountingMetadata>()
|
||||
.unwrap();
|
||||
top_acc.changed = true;
|
||||
@ -275,7 +281,7 @@ where
|
||||
/// Cull the `Corpus`
|
||||
#[allow(clippy::unused_self)]
|
||||
pub fn accounting_cull(&self, state: &mut CS::State) -> Result<(), Error> {
|
||||
let Some(top_rated) = state.metadata().get::<TopAccountingMetadata>() else { return Ok(()) };
|
||||
let Some(top_rated) = state.metadata_map().get::<TopAccountingMetadata>() else { return Ok(()) };
|
||||
|
||||
for (_key, idx) in &top_rated.map {
|
||||
let mut entry = state.corpus().get(*idx)?.borrow_mut();
|
||||
@ -292,7 +298,7 @@ where
|
||||
/// Creates a new [`CoverageAccountingScheduler`] that wraps a `base` [`Scheduler`]
|
||||
/// and has a default probability to skip non-faved Testcases of [`DEFAULT_SKIP_NON_FAVORED_PROB`].
|
||||
pub fn new(state: &mut CS::State, base: CS, accounting_map: &'a [u32]) -> Self {
|
||||
match state.metadata().get::<TopAccountingMetadata>() {
|
||||
match state.metadata_map().get::<TopAccountingMetadata>() {
|
||||
Some(meta) => {
|
||||
if meta.max_accounting.len() != accounting_map.len() {
|
||||
state.add_metadata(TopAccountingMetadata::new(accounting_map.len()));
|
||||
@ -317,7 +323,7 @@ where
|
||||
skip_non_favored_prob: u64,
|
||||
accounting_map: &'a [u32],
|
||||
) -> Self {
|
||||
match state.metadata().get::<TopAccountingMetadata>() {
|
||||
match state.metadata_map().get::<TopAccountingMetadata>() {
|
||||
Some(meta) => {
|
||||
if meta.max_accounting.len() != accounting_map.len() {
|
||||
state.add_metadata(TopAccountingMetadata::new(accounting_map.len()));
|
||||
|
@ -102,7 +102,7 @@ where
|
||||
|
||||
let (last_mutation_num, last_corpus_count) = {
|
||||
let meta = state
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<EcoMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?;
|
||||
(meta.last_mutation_num, meta.last_corpus_count)
|
||||
@ -112,7 +112,7 @@ where
|
||||
let mut testcase = state.corpus().get(id)?.borrow_mut();
|
||||
|
||||
let meta = testcase
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<EcoTestcaseMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?;
|
||||
// Set was_fuzzed for the old current
|
||||
@ -122,7 +122,7 @@ where
|
||||
};
|
||||
|
||||
let meta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<EcoMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?;
|
||||
|
||||
@ -151,7 +151,7 @@ where
|
||||
fn first_iteration(state: &mut S) -> Result<(), Error> {
|
||||
let count = state.corpus().count();
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<EcoMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?
|
||||
.initial_corpus_count
|
||||
@ -174,7 +174,7 @@ where
|
||||
let was_fuzzed = state.corpus().get(id)?.borrow().scheduled_count() > 0;
|
||||
if was_fuzzed {
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<EcoMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?
|
||||
.state = EcoState::Exploration;
|
||||
@ -183,7 +183,7 @@ where
|
||||
}
|
||||
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<EcoMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?
|
||||
.state = EcoState::Exploitation;
|
||||
@ -194,7 +194,7 @@ where
|
||||
.corpus()
|
||||
.get(id)?
|
||||
.borrow()
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<EcoTestcaseMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?
|
||||
.state;
|
||||
@ -210,7 +210,7 @@ where
|
||||
.corpus()
|
||||
.get(id)?
|
||||
.borrow_mut()
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<EcoTestcaseMetadata>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("EcoTestcaseMetadata not found".to_string())
|
||||
@ -226,7 +226,7 @@ where
|
||||
.corpus()
|
||||
.get(selection)?
|
||||
.borrow()
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<EcoTestcaseMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?
|
||||
.clone();
|
||||
@ -234,7 +234,7 @@ where
|
||||
for id in state.corpus().ids() {
|
||||
let testcase = state.corpus().get(id)?.borrow();
|
||||
let meta = testcase
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<EcoTestcaseMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?;
|
||||
|
||||
@ -274,7 +274,7 @@ where
|
||||
.corpus()
|
||||
.get(parent_idx)?
|
||||
.borrow_mut()
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SchedulerTestcaseMetaData>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
|
||||
@ -302,7 +302,7 @@ where
|
||||
|
||||
let executions = *state.executions();
|
||||
let meta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<EcoMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?;
|
||||
|
||||
@ -328,7 +328,7 @@ where
|
||||
let mut hash = observer.hash() as usize;
|
||||
|
||||
let psmeta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SchedulerMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
|
||||
|
||||
@ -341,7 +341,7 @@ where
|
||||
.corpus()
|
||||
.get(id)?
|
||||
.borrow_mut()
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<EcoTestcaseMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?
|
||||
.mutation_num += 1;
|
||||
@ -350,7 +350,7 @@ where
|
||||
.corpus()
|
||||
.get(id)?
|
||||
.borrow()
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<SchedulerTestcaseMetaData>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
|
||||
@ -361,7 +361,7 @@ where
|
||||
.corpus()
|
||||
.get(id)?
|
||||
.borrow_mut()
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<EcoTestcaseMetadata>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("EcoTestcaseMetadata not found".to_string())
|
||||
@ -389,7 +389,7 @@ where
|
||||
.corpus()
|
||||
.get(id)?
|
||||
.borrow_mut()
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<EcoTestcaseMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?
|
||||
.mutation_num;
|
||||
@ -397,7 +397,7 @@ where
|
||||
let executions = *state.executions();
|
||||
|
||||
let meta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<EcoMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?;
|
||||
meta.last_mutation_num = mutation_num;
|
||||
@ -453,14 +453,14 @@ where
|
||||
|
||||
let (cur_state, rate) = {
|
||||
let meta = state
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<EcoMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?;
|
||||
(meta.state, meta.rate)
|
||||
};
|
||||
|
||||
let meta = entry
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<EcoTestcaseMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?;
|
||||
|
||||
|
@ -101,7 +101,8 @@ where
|
||||
testcase: &Option<Testcase<<CS::State as UsesInput>::Input>>,
|
||||
) -> Result<(), Error> {
|
||||
self.base.on_remove(state, idx, testcase)?;
|
||||
let mut entries = if let Some(meta) = state.metadata_mut().get_mut::<TopRatedsMetadata>() {
|
||||
let mut entries =
|
||||
if let Some(meta) = state.metadata_map_mut().get_mut::<TopRatedsMetadata>() {
|
||||
let entries = meta
|
||||
.map
|
||||
.drain_filter(|_, other_idx| *other_idx == idx)
|
||||
@ -116,7 +117,7 @@ where
|
||||
for i in state.corpus().ids() {
|
||||
let mut old = state.corpus().get(i)?.borrow_mut();
|
||||
let factor = F::compute(&mut *old, state)?;
|
||||
if let Some(old_map) = old.metadata_mut().get_mut::<M>() {
|
||||
if let Some(old_map) = old.metadata_map_mut().get_mut::<M>() {
|
||||
let mut e_iter = entries.iter();
|
||||
let mut map_iter = old_map.as_slice().iter(); // ASSERTION: guaranteed to be in order?
|
||||
|
||||
@ -150,7 +151,7 @@ where
|
||||
}
|
||||
}
|
||||
}
|
||||
if let Some(meta) = state.metadata_mut().get_mut::<TopRatedsMetadata>() {
|
||||
if let Some(meta) = state.metadata_map_mut().get_mut::<TopRatedsMetadata>() {
|
||||
meta.map
|
||||
.extend(map.into_iter().map(|(entry, (_, idx))| (entry, idx)));
|
||||
}
|
||||
@ -225,7 +226,7 @@ where
|
||||
#[allow(clippy::cast_possible_wrap)]
|
||||
pub fn update_score(&self, state: &mut CS::State, idx: CorpusId) -> Result<(), Error> {
|
||||
// Create a new top rated meta if not existing
|
||||
if state.metadata().get::<TopRatedsMetadata>().is_none() {
|
||||
if state.metadata_map().get::<TopRatedsMetadata>().is_none() {
|
||||
state.add_metadata(TopRatedsMetadata::new());
|
||||
}
|
||||
|
||||
@ -233,12 +234,12 @@ where
|
||||
{
|
||||
let mut entry = state.corpus().get(idx)?.borrow_mut();
|
||||
let factor = F::compute(&mut *entry, state)?;
|
||||
let meta = entry.metadata_mut().get_mut::<M>().ok_or_else(|| {
|
||||
let meta = entry.metadata_map_mut().get_mut::<M>().ok_or_else(|| {
|
||||
Error::key_not_found(format!(
|
||||
"Metadata needed for MinimizerScheduler not found in testcase #{idx}"
|
||||
))
|
||||
})?;
|
||||
let top_rateds = state.metadata().get::<TopRatedsMetadata>().unwrap();
|
||||
let top_rateds = state.metadata_map().get::<TopRatedsMetadata>().unwrap();
|
||||
for elem in meta.as_slice() {
|
||||
if let Some(old_idx) = top_rateds.map.get(elem) {
|
||||
if *old_idx == idx {
|
||||
@ -251,7 +252,7 @@ where
|
||||
}
|
||||
|
||||
let must_remove = {
|
||||
let old_meta = old.metadata_mut().get_mut::<M>().ok_or_else(|| {
|
||||
let old_meta = old.metadata_map_mut().get_mut::<M>().ok_or_else(|| {
|
||||
Error::key_not_found(format!(
|
||||
"{} needed for MinimizerScheduler not found in testcase #{old_idx}",
|
||||
type_name::<M>()
|
||||
@ -262,7 +263,7 @@ where
|
||||
};
|
||||
|
||||
if must_remove {
|
||||
drop(old.metadata_mut().remove::<M>());
|
||||
drop(old.metadata_map_mut().remove::<M>());
|
||||
}
|
||||
}
|
||||
|
||||
@ -278,7 +279,7 @@ where
|
||||
.corpus()
|
||||
.get(idx)?
|
||||
.borrow_mut()
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.remove::<M>(),
|
||||
);
|
||||
return Ok(());
|
||||
@ -286,7 +287,7 @@ where
|
||||
|
||||
for elem in new_favoreds {
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<TopRatedsMetadata>()
|
||||
.unwrap()
|
||||
.map
|
||||
@ -298,14 +299,14 @@ where
|
||||
/// Cull the `Corpus` using the `MinimizerScheduler`
|
||||
#[allow(clippy::unused_self)]
|
||||
pub fn cull(&self, state: &mut CS::State) -> Result<(), Error> {
|
||||
let Some(top_rated) = state.metadata().get::<TopRatedsMetadata>() else { return Ok(()) };
|
||||
let Some(top_rated) = state.metadata_map().get::<TopRatedsMetadata>() else { return Ok(()) };
|
||||
|
||||
let mut acc = HashSet::new();
|
||||
|
||||
for (key, idx) in &top_rated.map {
|
||||
if !acc.contains(key) {
|
||||
let mut entry = state.corpus().get(*idx)?.borrow_mut();
|
||||
let meta = entry.metadata().get::<M>().ok_or_else(|| {
|
||||
let meta = entry.metadata_map().get::<M>().ok_or_else(|| {
|
||||
Error::key_not_found(format!(
|
||||
"{} needed for MinimizerScheduler not found in testcase #{idx}",
|
||||
type_name::<M>()
|
||||
|
@ -191,7 +191,7 @@ where
|
||||
prev: &Testcase<<Self::State as UsesInput>::Input>,
|
||||
) -> Result<(), Error> {
|
||||
let prev_meta = prev
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<SchedulerTestcaseMetaData>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
|
||||
@ -206,7 +206,7 @@ where
|
||||
let prev_bitmap_size_log = libm::log2(prev_bitmap_size as f64);
|
||||
|
||||
let psmeta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SchedulerMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
|
||||
|
||||
@ -239,7 +239,7 @@ where
|
||||
})?;
|
||||
|
||||
let prev_meta = prev
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<SchedulerTestcaseMetaData>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
|
||||
@ -251,7 +251,7 @@ where
|
||||
let prev_bitmap_size_log = libm::log2(prev_bitmap_size as f64);
|
||||
|
||||
let psmeta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SchedulerMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
|
||||
|
||||
@ -279,7 +279,7 @@ where
|
||||
.corpus()
|
||||
.get(parent_idx)?
|
||||
.borrow()
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<SchedulerTestcaseMetaData>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
|
||||
@ -318,7 +318,7 @@ where
|
||||
let mut hash = observer.hash() as usize;
|
||||
|
||||
let psmeta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SchedulerMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
|
||||
|
||||
@ -341,7 +341,7 @@ where
|
||||
next
|
||||
} else {
|
||||
let psmeta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SchedulerMetadata>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("SchedulerMetadata not found".to_string())
|
||||
@ -374,7 +374,7 @@ where
|
||||
testcase.set_scheduled_count(scheduled_count + 1);
|
||||
|
||||
let tcmeta = testcase
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SchedulerTestcaseMetaData>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
|
||||
|
@ -77,7 +77,7 @@ where
|
||||
));
|
||||
}
|
||||
let meta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<ProbabilityMetadata>()
|
||||
.unwrap();
|
||||
let prob = 1.0 / factor;
|
||||
@ -107,7 +107,7 @@ where
|
||||
.borrow_mut()
|
||||
.set_parent_id_optional(current_idx);
|
||||
|
||||
if state.metadata().get::<ProbabilityMetadata>().is_none() {
|
||||
if state.metadata_map().get::<ProbabilityMetadata>().is_none() {
|
||||
state.add_metadata(ProbabilityMetadata::new());
|
||||
}
|
||||
self.store_probability(state, idx)
|
||||
@ -120,7 +120,7 @@ where
|
||||
Err(Error::empty(String::from("No entries in corpus")))
|
||||
} else {
|
||||
let rand_prob: f64 = (state.rand_mut().below(100) as f64) / 100.0;
|
||||
let meta = state.metadata().get::<ProbabilityMetadata>().unwrap();
|
||||
let meta = state.metadata_map().get::<ProbabilityMetadata>().unwrap();
|
||||
let threshold = meta.total_probability * rand_prob;
|
||||
let mut k: f64 = 0.0;
|
||||
let mut ret = *meta.map.keys().last().unwrap();
|
||||
|
@ -67,7 +67,7 @@ where
|
||||
)]
|
||||
fn compute(entry: &mut Testcase<S::Input>, state: &S) -> Result<f64, Error> {
|
||||
let psmeta = state
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<SchedulerMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
|
||||
|
||||
@ -80,7 +80,7 @@ where
|
||||
for idx in corpus.ids() {
|
||||
let n_fuzz_entry = if cur_index == idx {
|
||||
entry
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<SchedulerTestcaseMetaData>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found(
|
||||
@ -92,7 +92,7 @@ where
|
||||
corpus
|
||||
.get(idx)?
|
||||
.borrow()
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<SchedulerTestcaseMetaData>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found(
|
||||
@ -129,7 +129,7 @@ where
|
||||
|
||||
let favored = entry.has_metadata::<IsFavoredMetadata>();
|
||||
let tcmeta = entry
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<SchedulerTestcaseMetaData>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
|
||||
@ -296,12 +296,12 @@ where
|
||||
fn compute(entry: &mut Testcase<S::Input>, state: &S) -> Result<f64, Error> {
|
||||
let mut weight = 1.0;
|
||||
let psmeta = state
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<SchedulerMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
|
||||
|
||||
let tcmeta = entry
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<SchedulerTestcaseMetaData>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
|
||||
@ -344,13 +344,13 @@ where
|
||||
weight *= avg_exec_us / q_exec_us;
|
||||
weight *= libm::log2(q_bitmap_size).max(1.0) / avg_bitmap_size;
|
||||
|
||||
let tc_ref = match entry.metadata().get::<MapIndexesMetadata>() {
|
||||
let tc_ref = match entry.metadata_map().get::<MapIndexesMetadata>() {
|
||||
Some(meta) => meta.refcnt() as f64,
|
||||
None => 0.0,
|
||||
};
|
||||
|
||||
let avg_top_size = state
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<TopRatedsMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("TopRatedsMetadata not found".to_string()))?
|
||||
.map()
|
||||
|
@ -48,13 +48,16 @@ where
|
||||
|
||||
fn metadata_mut(state: &mut S) -> &mut TuneableSchedulerMetadata {
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<TuneableSchedulerMetadata>()
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
fn metadata(state: &S) -> &TuneableSchedulerMetadata {
|
||||
state.metadata().get::<TuneableSchedulerMetadata>().unwrap()
|
||||
state
|
||||
.metadata_map()
|
||||
.get::<TuneableSchedulerMetadata>()
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
/// Sets the next corpus id to be used
|
||||
|
@ -209,7 +209,7 @@ where
|
||||
}
|
||||
|
||||
let wsmeta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<WeightedScheduleMetadata>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("WeigthedScheduleMetadata not found".to_string())
|
||||
@ -249,7 +249,7 @@ where
|
||||
})?;
|
||||
|
||||
let prev_meta = prev
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<SchedulerTestcaseMetaData>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
|
||||
@ -261,7 +261,7 @@ where
|
||||
let prev_bitmap_size_log = libm::log2(prev_bitmap_size as f64);
|
||||
|
||||
let psmeta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SchedulerMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
|
||||
|
||||
@ -282,7 +282,7 @@ where
|
||||
prev: &crate::corpus::Testcase<<Self::State as UsesInput>::Input>,
|
||||
) -> Result<(), Error> {
|
||||
let prev_meta = prev
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<SchedulerTestcaseMetaData>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
|
||||
@ -297,7 +297,7 @@ where
|
||||
let prev_bitmap_size_log = libm::log2(prev_bitmap_size as f64);
|
||||
|
||||
let psmeta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SchedulerMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
|
||||
|
||||
@ -332,7 +332,7 @@ where
|
||||
.corpus()
|
||||
.get(parent_idx)?
|
||||
.borrow_mut()
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SchedulerTestcaseMetaData>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
|
||||
@ -376,7 +376,7 @@ where
|
||||
let mut hash = observer.hash() as usize;
|
||||
|
||||
let psmeta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SchedulerMetadata>()
|
||||
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
|
||||
|
||||
@ -401,7 +401,7 @@ where
|
||||
let probability = state.rand_mut().between(0, 1000000000) as f64 / 1000000000_f64;
|
||||
|
||||
let wsmeta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<WeightedScheduleMetadata>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("WeigthedScheduleMetadata not found".to_string())
|
||||
@ -425,7 +425,7 @@ where
|
||||
// Update depth
|
||||
if current_cycles > corpus_counts {
|
||||
let psmeta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SchedulerMetadata>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("SchedulerMetadata not found".to_string())
|
||||
@ -454,7 +454,7 @@ where
|
||||
testcase.set_scheduled_count(scheduled_count + 1);
|
||||
|
||||
let tcmeta = testcase
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SchedulerTestcaseMetaData>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
|
||||
|
@ -199,7 +199,7 @@ where
|
||||
.to_vec();
|
||||
|
||||
let history_map = &mut state
|
||||
.named_metadata_mut()
|
||||
.named_metadata_map_mut()
|
||||
.get_mut::<MapFeedbackMetadata<O::Entry>>(&self.map_name)
|
||||
.unwrap()
|
||||
.history_map;
|
||||
@ -230,7 +230,7 @@ where
|
||||
// If we see new stable entries executing this new corpus entries, then merge with the existing one
|
||||
if state.has_metadata::<UnstableEntriesMetadata>() {
|
||||
let existing = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<UnstableEntriesMetadata>()
|
||||
.unwrap();
|
||||
for item in unstable_entries {
|
||||
@ -261,7 +261,10 @@ where
|
||||
|
||||
let bitmap_size = map.count_bytes();
|
||||
|
||||
let psmeta = state.metadata_mut().get_mut::<SchedulerMetadata>().unwrap();
|
||||
let psmeta = state
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SchedulerMetadata>()
|
||||
.unwrap();
|
||||
let handicap = psmeta.queue_cycles();
|
||||
|
||||
psmeta.set_exec_time(psmeta.exec_time() + total_time);
|
||||
@ -278,7 +281,7 @@ where
|
||||
// log::trace!("time: {:#?}", testcase.exec_time());
|
||||
|
||||
let data = testcase
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SchedulerTestcaseMetaData>()
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
|
||||
@ -290,7 +293,7 @@ where
|
||||
}
|
||||
|
||||
// Send the stability event to the broker
|
||||
if let Some(meta) = state.metadata().get::<UnstableEntriesMetadata>() {
|
||||
if let Some(meta) = state.metadata_map().get::<UnstableEntriesMetadata>() {
|
||||
let unstable_entries = meta.unstable_entries().len();
|
||||
let map_len = meta.map_len();
|
||||
mgr.fire(
|
||||
|
@ -272,7 +272,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(meta) = state.metadata_mut().get_mut::<TaintMetadata>() {
|
||||
if let Some(meta) = state.metadata_map_mut().get_mut::<TaintMetadata>() {
|
||||
meta.update(input.bytes().to_vec(), res);
|
||||
|
||||
// println!("meta: {:#?}", meta);
|
||||
|
@ -61,7 +61,7 @@ where
|
||||
.get(corpus_idx)
|
||||
.unwrap()
|
||||
.borrow_mut()
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.insert(metadata);
|
||||
}
|
||||
Ok(())
|
||||
@ -367,7 +367,8 @@ where
|
||||
let testcase = state.corpus().get(corpus_idx)?.clone();
|
||||
mark_feature_time!(state, PerfFeature::GetInputFromCorpus);
|
||||
|
||||
let mutations = if let Some(meta) = testcase.borrow().metadata().get::<ConcolicMetadata>() {
|
||||
let mutations =
|
||||
if let Some(meta) = testcase.borrow().metadata_map().get::<ConcolicMetadata>() {
|
||||
start_timer!(state);
|
||||
let mutations = generate_mutations(meta.iter_messages());
|
||||
mark_feature_time!(state, PerfFeature::Mutate);
|
||||
|
@ -57,7 +57,7 @@ where
|
||||
_corpus_idx: CorpusId,
|
||||
) -> Result<(), Error> {
|
||||
let (mut corpus_idx, mut solutions_idx) =
|
||||
if let Some(meta) = state.metadata().get::<DumpToDiskMetadata>() {
|
||||
if let Some(meta) = state.metadata_map().get::<DumpToDiskMetadata>() {
|
||||
(
|
||||
meta.last_corpus.and_then(|x| state.corpus().next(x)),
|
||||
meta.last_solution.and_then(|x| state.solutions().next(x)),
|
||||
|
@ -87,7 +87,7 @@ where
|
||||
|
||||
let payload: Vec<_> = input.bytes().iter().map(|&x| Some(x)).collect();
|
||||
let original = input.clone();
|
||||
let meta = entry.metadata().get::<MapNoveltiesMetadata>().ok_or_else(|| {
|
||||
let meta = entry.metadata_map().get::<MapNoveltiesMetadata>().ok_or_else(|| {
|
||||
Error::key_not_found(format!(
|
||||
"MapNoveltiesMetadata needed for GeneralizationStage not found in testcase #{corpus_idx} (check the arguments of MapFeedback::new(...))"
|
||||
))
|
||||
@ -292,7 +292,7 @@ where
|
||||
assert!(meta.generalized().last() == Some(&GeneralizedItem::Gap));
|
||||
|
||||
let mut entry = state.corpus().get(corpus_idx)?.borrow_mut();
|
||||
entry.metadata_mut().insert(meta);
|
||||
entry.metadata_map_mut().insert(meta);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -71,7 +71,7 @@ where
|
||||
_corpus_idx: CorpusId,
|
||||
) -> Result<(), Error> {
|
||||
let last = state
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<SyncFromDiskMetadata>()
|
||||
.map(|m| m.last_time);
|
||||
let path = self.sync_dir.clone();
|
||||
@ -80,11 +80,11 @@ where
|
||||
{
|
||||
if last.is_none() {
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.insert(SyncFromDiskMetadata::new(max_time));
|
||||
} else {
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SyncFromDiskMetadata>()
|
||||
.unwrap()
|
||||
.last_time = max_time;
|
||||
@ -254,7 +254,7 @@ where
|
||||
) -> Result<(), Error> {
|
||||
if self.client.can_convert() {
|
||||
let last_id = state
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<SyncFromBrokerMetadata>()
|
||||
.and_then(|m| m.last_id);
|
||||
|
||||
@ -283,11 +283,11 @@ where
|
||||
let last = state.corpus().last();
|
||||
if last_id.is_none() {
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.insert(SyncFromBrokerMetadata::new(last));
|
||||
} else {
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<SyncFromBrokerMetadata>()
|
||||
.unwrap()
|
||||
.last_id = last;
|
||||
|
@ -178,7 +178,7 @@ where
|
||||
.post_exec_all(state, &unmutated_input, &exit_kind)?;
|
||||
|
||||
// Second run with the mutated input
|
||||
let mutated_input = match state.metadata().get::<TaintMetadata>() {
|
||||
let mutated_input = match state.metadata_map().get::<TaintMetadata>() {
|
||||
Some(meta) => BytesInput::from(meta.input_vec().as_ref()),
|
||||
None => return Err(Error::unknown("No metadata found")),
|
||||
};
|
||||
|
@ -27,7 +27,7 @@ impl_serdeany!(TuneableMutationalStageMetadata);
|
||||
/// Set the number of iterations to be used by this mutational stage
|
||||
pub fn set_iters<S: HasMetadata>(state: &mut S, iters: u64) -> Result<(), Error> {
|
||||
let metadata = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<TuneableMutationalStageMetadata>()
|
||||
.ok_or_else(|| Error::illegal_state("TuneableMutationslStage not in use"));
|
||||
metadata.map(|metadata| {
|
||||
@ -38,7 +38,7 @@ pub fn set_iters<S: HasMetadata>(state: &mut S, iters: u64) -> Result<(), Error>
|
||||
/// Get the set iterations
|
||||
pub fn get_iters<S: HasMetadata>(state: &S) -> Result<Option<u64>, Error> {
|
||||
state
|
||||
.metadata()
|
||||
.metadata_map()
|
||||
.get::<TuneableMutationalStageMetadata>()
|
||||
.ok_or_else(|| Error::illegal_state("TuneableMutationslStage not in use"))
|
||||
.map(|metadata| metadata.iters)
|
||||
@ -47,7 +47,7 @@ pub fn get_iters<S: HasMetadata>(state: &S) -> Result<Option<u64>, Error> {
|
||||
/// Reset this to a normal, randomized, stage
|
||||
pub fn reset<S: HasMetadata>(state: &mut S) -> Result<(), Error> {
|
||||
state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<TuneableMutationalStageMetadata>()
|
||||
.ok_or_else(|| Error::illegal_state("TuneableMutationslStage not in use"))
|
||||
.map(|metadata| metadata.iters = None)
|
||||
|
@ -1,6 +1,11 @@
|
||||
//! The fuzzer, and state are the core pieces of every good fuzzer
|
||||
|
||||
use core::{fmt::Debug, marker::PhantomData, time::Duration};
|
||||
use core::{
|
||||
cell::{Ref, RefMut},
|
||||
fmt::Debug,
|
||||
marker::PhantomData,
|
||||
time::Duration,
|
||||
};
|
||||
#[cfg(feature = "std")]
|
||||
use std::{
|
||||
fs,
|
||||
@ -17,7 +22,7 @@ use crate::{
|
||||
rands::Rand,
|
||||
serdeany::{NamedSerdeAnyMap, SerdeAny, SerdeAnyMap},
|
||||
},
|
||||
corpus::{Corpus, CorpusId},
|
||||
corpus::{Corpus, CorpusId, Testcase},
|
||||
events::{Event, EventFirer, LogSeverity},
|
||||
feedbacks::Feedback,
|
||||
fuzzer::{Evaluator, ExecuteInputResult},
|
||||
@ -101,9 +106,9 @@ pub trait HasClientPerfMonitor {
|
||||
/// Trait for elements offering metadata
|
||||
pub trait HasMetadata {
|
||||
/// A map, storing all metadata
|
||||
fn metadata(&self) -> &SerdeAnyMap;
|
||||
fn metadata_map(&self) -> &SerdeAnyMap;
|
||||
/// A map, storing all metadata (mutable)
|
||||
fn metadata_mut(&mut self) -> &mut SerdeAnyMap;
|
||||
fn metadata_map_mut(&mut self) -> &mut SerdeAnyMap;
|
||||
|
||||
/// Add a metadata to the metadata map
|
||||
#[inline]
|
||||
@ -111,7 +116,7 @@ pub trait HasMetadata {
|
||||
where
|
||||
M: SerdeAny,
|
||||
{
|
||||
self.metadata_mut().insert(meta);
|
||||
self.metadata_map_mut().insert(meta);
|
||||
}
|
||||
|
||||
/// Check for a metadata
|
||||
@ -120,16 +125,38 @@ pub trait HasMetadata {
|
||||
where
|
||||
M: SerdeAny,
|
||||
{
|
||||
self.metadata().get::<M>().is_some()
|
||||
self.metadata_map().get::<M>().is_some()
|
||||
}
|
||||
|
||||
/// To get metadata
|
||||
#[inline]
|
||||
fn metadata<M>(&self) -> Result<&M, Error>
|
||||
where
|
||||
M: SerdeAny,
|
||||
{
|
||||
self.metadata_map().get::<M>().ok_or_else(|| {
|
||||
Error::key_not_found(format!("{} not found", core::any::type_name::<M>()))
|
||||
})
|
||||
}
|
||||
|
||||
/// To get mutable metadata
|
||||
#[inline]
|
||||
fn metadata_mut<M>(&mut self) -> Result<&mut M, Error>
|
||||
where
|
||||
M: SerdeAny,
|
||||
{
|
||||
self.metadata_map_mut().get_mut::<M>().ok_or_else(|| {
|
||||
Error::key_not_found(format!("{} not found", core::any::type_name::<M>()))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/// Trait for elements offering named metadata
|
||||
pub trait HasNamedMetadata {
|
||||
/// A map, storing all metadata
|
||||
fn named_metadata(&self) -> &NamedSerdeAnyMap;
|
||||
fn named_metadata_map(&self) -> &NamedSerdeAnyMap;
|
||||
/// A map, storing all metadata (mutable)
|
||||
fn named_metadata_mut(&mut self) -> &mut NamedSerdeAnyMap;
|
||||
fn named_metadata_map_mut(&mut self) -> &mut NamedSerdeAnyMap;
|
||||
|
||||
/// Add a metadata to the metadata map
|
||||
#[inline]
|
||||
@ -137,7 +164,7 @@ pub trait HasNamedMetadata {
|
||||
where
|
||||
M: SerdeAny,
|
||||
{
|
||||
self.named_metadata_mut().insert(meta, name);
|
||||
self.named_metadata_map_mut().insert(meta, name);
|
||||
}
|
||||
|
||||
/// Check for a metadata
|
||||
@ -146,7 +173,31 @@ pub trait HasNamedMetadata {
|
||||
where
|
||||
M: SerdeAny,
|
||||
{
|
||||
self.named_metadata().contains::<M>(name)
|
||||
self.named_metadata_map().contains::<M>(name)
|
||||
}
|
||||
|
||||
/// To get named metadata
|
||||
#[inline]
|
||||
fn named_metadata<M>(&self, name: &str) -> Result<&M, Error>
|
||||
where
|
||||
M: SerdeAny,
|
||||
{
|
||||
self.named_metadata_map().get::<M>(name).ok_or_else(|| {
|
||||
Error::key_not_found(format!("{} not found", core::any::type_name::<M>()))
|
||||
})
|
||||
}
|
||||
|
||||
/// To get mutable named metadata
|
||||
#[inline]
|
||||
fn named_metadata_mut<M>(&mut self, name: &str) -> Result<&mut M, Error>
|
||||
where
|
||||
M: SerdeAny,
|
||||
{
|
||||
self.named_metadata_map_mut()
|
||||
.get_mut::<M>(name)
|
||||
.ok_or_else(|| {
|
||||
Error::key_not_found(format!("{} not found", core::any::type_name::<M>()))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@ -168,6 +219,22 @@ pub trait HasStartTime {
|
||||
fn start_time_mut(&mut self) -> &mut Duration;
|
||||
}
|
||||
|
||||
/// Trait for the testcase
|
||||
pub trait HasTestcase: HasCorpus {
|
||||
/// To get the testcase
|
||||
fn testcase(&self, id: CorpusId) -> Result<Ref<Testcase<<Self as UsesInput>::Input>>, Error> {
|
||||
Ok(self.corpus().get(id)?.borrow())
|
||||
}
|
||||
|
||||
/// To get mutable testcase
|
||||
fn testcase_mut(
|
||||
&mut self,
|
||||
id: CorpusId,
|
||||
) -> Result<RefMut<Testcase<<Self as UsesInput>::Input>>, Error> {
|
||||
Ok(self.corpus().get(id)?.borrow_mut())
|
||||
}
|
||||
}
|
||||
|
||||
/// The state a fuzz run.
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
#[serde(bound = "
|
||||
@ -280,13 +347,13 @@ where
|
||||
impl<I, C, R, SC> HasMetadata for StdState<I, C, R, SC> {
|
||||
/// Get all the metadata into an [`hashbrown::HashMap`]
|
||||
#[inline]
|
||||
fn metadata(&self) -> &SerdeAnyMap {
|
||||
fn metadata_map(&self) -> &SerdeAnyMap {
|
||||
&self.metadata
|
||||
}
|
||||
|
||||
/// Get all the metadata into an [`hashbrown::HashMap`] (mutable)
|
||||
#[inline]
|
||||
fn metadata_mut(&mut self) -> &mut SerdeAnyMap {
|
||||
fn metadata_map_mut(&mut self) -> &mut SerdeAnyMap {
|
||||
&mut self.metadata
|
||||
}
|
||||
}
|
||||
@ -294,13 +361,13 @@ impl<I, C, R, SC> HasMetadata for StdState<I, C, R, SC> {
|
||||
impl<I, C, R, SC> HasNamedMetadata for StdState<I, C, R, SC> {
|
||||
/// Get all the metadata into an [`hashbrown::HashMap`]
|
||||
#[inline]
|
||||
fn named_metadata(&self) -> &NamedSerdeAnyMap {
|
||||
fn named_metadata_map(&self) -> &NamedSerdeAnyMap {
|
||||
&self.named_metadata
|
||||
}
|
||||
|
||||
/// Get all the metadata into an [`hashbrown::HashMap`] (mutable)
|
||||
#[inline]
|
||||
fn named_metadata_mut(&mut self) -> &mut NamedSerdeAnyMap {
|
||||
fn named_metadata_map_mut(&mut self) -> &mut NamedSerdeAnyMap {
|
||||
&mut self.named_metadata
|
||||
}
|
||||
}
|
||||
@ -771,11 +838,11 @@ impl<I> HasExecutions for NopState<I> {
|
||||
|
||||
#[cfg(test)]
|
||||
impl<I> HasMetadata for NopState<I> {
|
||||
fn metadata(&self) -> &SerdeAnyMap {
|
||||
fn metadata_map(&self) -> &SerdeAnyMap {
|
||||
&self.metadata
|
||||
}
|
||||
|
||||
fn metadata_mut(&mut self) -> &mut SerdeAnyMap {
|
||||
fn metadata_map_mut(&mut self) -> &mut SerdeAnyMap {
|
||||
&mut self.metadata
|
||||
}
|
||||
}
|
||||
@ -878,7 +945,7 @@ pub mod pybind {
|
||||
}
|
||||
|
||||
fn metadata(&mut self) -> PyObject {
|
||||
let meta = self.inner.as_mut().metadata_mut();
|
||||
let meta = self.inner.as_mut().metadata_map_mut();
|
||||
if !meta.contains::<PythonMetadata>() {
|
||||
Python::with_gil(|py| {
|
||||
let dict: Py<PyDict> = PyDict::new(py).into();
|
||||
|
@ -132,11 +132,11 @@ where
|
||||
}
|
||||
}
|
||||
let state = state.expect("The gen_unique_cmp_ids hook works only for in-process fuzzing");
|
||||
if state.metadata().get::<QemuCmpsMapMetadata>().is_none() {
|
||||
if state.metadata_map().get::<QemuCmpsMapMetadata>().is_none() {
|
||||
state.add_metadata(QemuCmpsMapMetadata::new());
|
||||
}
|
||||
let meta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<QemuCmpsMapMetadata>()
|
||||
.unwrap();
|
||||
let id = meta.current_id as usize;
|
||||
|
@ -214,13 +214,16 @@ where
|
||||
|
||||
let state = state.expect("The gen_unique_block_ids hook works only for in-process fuzzing");
|
||||
if state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<QemuDrCovMetadata>()
|
||||
.is_none()
|
||||
{
|
||||
state.add_metadata(QemuDrCovMetadata::new());
|
||||
}
|
||||
let meta = state.metadata_mut().get_mut::<QemuDrCovMetadata>().unwrap();
|
||||
let meta = state
|
||||
.metadata_map_mut()
|
||||
.get_mut::<QemuDrCovMetadata>()
|
||||
.unwrap();
|
||||
|
||||
match DRCOV_MAP.lock().unwrap().as_mut().unwrap().entry(pc) {
|
||||
Entry::Occupied(e) => {
|
||||
|
@ -167,11 +167,11 @@ where
|
||||
}
|
||||
}
|
||||
let state = state.expect("The gen_unique_edge_ids hook works only for in-process fuzzing");
|
||||
if state.metadata().get::<QemuEdgesMapMetadata>().is_none() {
|
||||
if state.metadata_map().get::<QemuEdgesMapMetadata>().is_none() {
|
||||
state.add_metadata(QemuEdgesMapMetadata::new());
|
||||
}
|
||||
let meta = state
|
||||
.metadata_mut()
|
||||
.metadata_map_mut()
|
||||
.get_mut::<QemuEdgesMapMetadata>()
|
||||
.unwrap();
|
||||
|
||||
|
@ -162,7 +162,7 @@ impl<'a, const MAP_SIZE: usize> ForkserverBytesCoverageSugar<'a, MAP_SIZE> {
|
||||
|
||||
// Create a dictionary if not existing
|
||||
if let Some(tokens_file) = &self.tokens_file {
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from_file(tokens_file)?);
|
||||
}
|
||||
}
|
||||
|
@ -181,7 +181,7 @@ where
|
||||
|
||||
// Create a dictionary if not existing
|
||||
if let Some(tokens_file) = &self.tokens_file {
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from_file(tokens_file)?);
|
||||
}
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ where
|
||||
|
||||
// Create a dictionary if not existing
|
||||
if let Some(tokens_file) = &self.tokens_file {
|
||||
if state.metadata().get::<Tokens>().is_none() {
|
||||
if state.metadata_map().get::<Tokens>().is_none() {
|
||||
state.add_metadata(Tokens::from_file(tokens_file)?);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user