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:
Matheus Baptistella 2023-03-14 10:24:33 -03:00 committed by GitHub
parent 8dfdee6fce
commit c38405ef83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
54 changed files with 296 additions and 201 deletions

View File

@ -107,7 +107,7 @@ pub fn main() {
) )
.unwrap(); .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()])); state.add_metadata(Tokens::from([b"FOO".to_vec(), b"BAR".to_vec()]));
} }

View File

@ -74,7 +74,7 @@ pub fn main() {
) )
.unwrap(); .unwrap();
if state.metadata().get::<NautilusChunksMetadata>().is_none() { if state.metadata_map().get::<NautilusChunksMetadata>().is_none() {
state.add_metadata(NautilusChunksMetadata::new("/tmp/".into())); state.add_metadata(NautilusChunksMetadata::new("/tmp/".into()));
} }

View File

@ -156,7 +156,7 @@ unsafe fn fuzz(options: &FuzzerOptions) -> Result<(), Error> {
println!("We're a client, let's fuzz :)"); println!("We're a client, let's fuzz :)");
// Create a PNG dictionary if not existing // 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([ state.add_metadata(Tokens::from([
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
b"IHDR".to_vec(), b"IHDR".to_vec(),
@ -271,7 +271,7 @@ unsafe fn fuzz(options: &FuzzerOptions) -> Result<(), Error> {
println!("We're a client, let's fuzz :)"); println!("We're a client, let's fuzz :)");
// Create a PNG dictionary if not existing // 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([ state.add_metadata(Tokens::from([
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
b"IHDR".to_vec(), b"IHDR".to_vec(),
@ -401,7 +401,7 @@ unsafe fn fuzz(options: &FuzzerOptions) -> Result<(), Error> {
println!("We're a client, let's fuzz :)"); println!("We're a client, let's fuzz :)");
// Create a PNG dictionary if not existing // 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([ state.add_metadata(Tokens::from([
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
b"IHDR".to_vec(), b"IHDR".to_vec(),

View File

@ -154,7 +154,7 @@ unsafe fn fuzz(options: &FuzzerOptions) -> Result<(), Error> {
println!("We're a client, let's fuzz :)"); println!("We're a client, let's fuzz :)");
// Create a PNG dictionary if not existing // 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([ state.add_metadata(Tokens::from([
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
b"IHDR".to_vec(), b"IHDR".to_vec(),
@ -269,7 +269,7 @@ unsafe fn fuzz(options: &FuzzerOptions) -> Result<(), Error> {
println!("We're a client, let's fuzz :)"); println!("We're a client, let's fuzz :)");
// Create a PNG dictionary if not existing // 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([ state.add_metadata(Tokens::from([
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
b"IHDR".to_vec(), b"IHDR".to_vec(),
@ -399,7 +399,7 @@ unsafe fn fuzz(options: &FuzzerOptions) -> Result<(), Error> {
println!("We're a client, let's fuzz :)"); println!("We're a client, let's fuzz :)");
// Create a PNG dictionary if not existing // 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([ state.add_metadata(Tokens::from([
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
b"IHDR".to_vec(), b"IHDR".to_vec(),

View File

@ -355,7 +355,7 @@ fn fuzz(
let mut stages = tuple_list!(calibration, tracing, i2s, power); let mut stages = tuple_list!(calibration, tracing, i2s, power);
// Read tokens // Read tokens
if state.metadata().get::<Tokens>().is_none() { if state.metadata_map().get::<Tokens>().is_none() {
let mut toks = Tokens::default(); let mut toks = Tokens::default();
if let Some(tokenfile) = tokenfile { if let Some(tokenfile) = tokenfile {
toks.add_from_file(tokenfile)?; toks.add_from_file(tokenfile)?;

View File

@ -351,7 +351,7 @@ fn fuzz(
// Read tokens // Read tokens
if let Some(tokenfile) = tokenfile { 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)?); state.add_metadata(Tokens::from_file(tokenfile)?);
} }
} }

View File

@ -366,7 +366,7 @@ fn fuzz(
// Read tokens // Read tokens
if let Some(tokenfile) = tokenfile { 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)?); state.add_metadata(Tokens::from_file(tokenfile)?);
} }
} }

View File

@ -416,7 +416,7 @@ fn fuzz_binary(
let mut stages = tuple_list!(calibration, tracing, i2s, power); let mut stages = tuple_list!(calibration, tracing, i2s, power);
// Read tokens // Read tokens
if state.metadata().get::<Tokens>().is_none() { if state.metadata_map().get::<Tokens>().is_none() {
let mut toks = Tokens::default(); let mut toks = Tokens::default();
if let Some(tokenfile) = tokenfile { if let Some(tokenfile) = tokenfile {
toks.add_from_file(tokenfile)?; toks.add_from_file(tokenfile)?;
@ -635,7 +635,7 @@ fn fuzz_text(
let mut stages = tuple_list!(generalization, calibration, tracing, i2s, power, grimoire); let mut stages = tuple_list!(generalization, calibration, tracing, i2s, power, grimoire);
// Read tokens // Read tokens
if state.metadata().get::<Tokens>().is_none() { if state.metadata_map().get::<Tokens>().is_none() {
let mut toks = Tokens::default(); let mut toks = Tokens::default();
if let Some(tokenfile) = tokenfile { if let Some(tokenfile) = tokenfile {
toks.add_from_file(tokenfile)?; toks.add_from_file(tokenfile)?;

View File

@ -236,7 +236,7 @@ pub fn LLVMFuzzerRunDriver(
}); });
// Create a dictionary if not existing // 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 { for tokens_file in &token_files {
state.add_metadata(Tokens::from_file(tokens_file)?); state.add_metadata(Tokens::from_file(tokens_file)?);
} }

View 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 :)"); println!("We're a client, let's fuzz :)");
// Add the JPEG tokens if not existing // 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")?); state.add_metadata(Tokens::from_file("./jpeg.dict")?);
} }

View File

@ -128,7 +128,7 @@ fn fuzz(corpus_dirs: &[PathBuf], objective_dir: PathBuf, broker_port: u16) -> Re
println!("We're a client, let's fuzz :)"); println!("We're a client, let's fuzz :)");
// Create a PNG dictionary if not existing // 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([ state.add_metadata(Tokens::from([
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
"IHDR".as_bytes().to_vec(), "IHDR".as_bytes().to_vec(),

View File

@ -174,7 +174,7 @@ pub fn libafl_main() {
println!("We're a client, let's fuzz :)"); println!("We're a client, let's fuzz :)");
// Create a PNG dictionary if not existing // 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![ state.add_metadata(Tokens::from(vec![
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
"IHDR".as_bytes().to_vec(), "IHDR".as_bytes().to_vec(),

View File

@ -127,7 +127,7 @@ fn fuzz(corpus_dirs: &[PathBuf], objective_dir: PathBuf, broker_port: u16) -> Re
println!("We're a client, let's fuzz :)"); println!("We're a client, let's fuzz :)");
// Create a PNG dictionary if not existing // 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([ state.add_metadata(Tokens::from([
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
"IHDR".as_bytes().to_vec(), "IHDR".as_bytes().to_vec(),

View File

@ -168,7 +168,7 @@ pub fn libafl_main() {
println!("We're a client, let's fuzz :)"); println!("We're a client, let's fuzz :)");
// Create a PNG dictionary if not existing // 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([ state.add_metadata(Tokens::from([
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
"IHDR".as_bytes().to_vec(), "IHDR".as_bytes().to_vec(),

View File

@ -173,7 +173,7 @@ pub fn libafl_main() {
println!("We're a client, let's fuzz :)"); println!("We're a client, let's fuzz :)");
// Create a PNG dictionary if not existing // 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([ state.add_metadata(Tokens::from([
vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header vec![137, 80, 78, 71, 13, 10, 26, 10], // PNG header
"IHDR".as_bytes().to_vec(), "IHDR".as_bytes().to_vec(),

View File

@ -172,7 +172,7 @@ pub fn libafl_main() {
.unwrap() .unwrap()
}); });
if state.metadata().get::<NautilusChunksMetadata>().is_none() { if state.metadata_map().get::<NautilusChunksMetadata>().is_none() {
state.add_metadata(NautilusChunksMetadata::new("/tmp/".into())); state.add_metadata(NautilusChunksMetadata::new("/tmp/".into()));
} }

View File

@ -27,7 +27,7 @@ where
{ {
fn compute(entry: &mut Testcase<PacketData>, _state: &S) -> Result<f64, Error> { fn compute(entry: &mut Testcase<PacketData>, _state: &S) -> Result<f64, Error> {
Ok(entry Ok(entry
.metadata() .metadata_map()
.get::<PacketLenMetadata>() .get::<PacketLenMetadata>()
.map_or(1, |m| m.length) as f64) .map_or(1, |m| m.length) as f64)
} }
@ -69,7 +69,7 @@ where
testcase: &mut Testcase<PacketData>, testcase: &mut Testcase<PacketData>,
) -> Result<(), Error> { ) -> Result<(), Error> {
testcase testcase
.metadata_mut() .metadata_map_mut()
.insert(PacketLenMetadata { length: self.len }); .insert(PacketLenMetadata { length: self.len });
Ok(()) Ok(())
} }

View File

@ -230,7 +230,7 @@ where
)); ));
let ondisk_meta = OnDiskMetadata { let ondisk_meta = OnDiskMetadata {
metadata: testcase.metadata(), metadata: testcase.metadata_map(),
exec_time: testcase.exec_time(), exec_time: testcase.exec_time(),
executions: testcase.executions(), executions: testcase.executions(),
}; };

View File

@ -45,13 +45,13 @@ where
{ {
/// Get all the metadata into an [`hashbrown::HashMap`] /// Get all the metadata into an [`hashbrown::HashMap`]
#[inline] #[inline]
fn metadata(&self) -> &SerdeAnyMap { fn metadata_map(&self) -> &SerdeAnyMap {
&self.metadata &self.metadata
} }
/// Get all the metadata into an [`hashbrown::HashMap`] (mutable) /// Get all the metadata into an [`hashbrown::HashMap`] (mutable)
#[inline] #[inline]
fn metadata_mut(&mut self) -> &mut SerdeAnyMap { fn metadata_map_mut(&mut self) -> &mut SerdeAnyMap {
&mut self.metadata &mut self.metadata
} }
} }
@ -476,7 +476,7 @@ pub mod pybind {
} }
fn metadata(&mut self) -> PyObject { 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>() { if !meta.contains::<PythonMetadata>() {
Python::with_gil(|py| { Python::with_gil(|py| {
let dict: Py<PyDict> = PyDict::new(py).into(); let dict: Py<PyDict> = PyDict::new(py).into();

View File

@ -79,7 +79,7 @@ where
.match_name::<ConcolicObserver>(&self.name) .match_name::<ConcolicObserver>(&self.name)
.map(ConcolicObserver::create_metadata_from_current_map) .map(ConcolicObserver::create_metadata_from_current_map)
{ {
testcase.metadata_mut().insert(metadata); testcase.metadata_map_mut().insert(metadata);
} }
Ok(()) Ok(())
} }

View File

@ -441,7 +441,7 @@ where
let observer = observers.match_name::<O>(&self.observer_name).unwrap(); let observer = observers.match_name::<O>(&self.observer_name).unwrap();
let initial = observer.initial(); let initial = observer.initial();
let map_state = state let map_state = state
.named_metadata_mut() .named_metadata_map_mut()
.get_mut::<MapFeedbackMetadata<T>>(&self.name) .get_mut::<MapFeedbackMetadata<T>>(&self.name)
.unwrap(); .unwrap();
@ -504,7 +504,7 @@ where
let observer = observers.match_name::<O>(&self.observer_name).unwrap(); let observer = observers.match_name::<O>(&self.observer_name).unwrap();
let map_state = state let map_state = state
.named_metadata_mut() .named_metadata_map_mut()
.get_mut::<MapFeedbackMetadata<u8>>(&self.name) .get_mut::<MapFeedbackMetadata<u8>>(&self.name)
.unwrap(); .unwrap();
let size = observer.usable_count(); let size = observer.usable_count();
@ -754,7 +754,7 @@ where
let observer = observers.match_name::<O>(&self.observer_name).unwrap(); let observer = observers.match_name::<O>(&self.observer_name).unwrap();
let map_state = state let map_state = state
.named_metadata_mut() .named_metadata_map_mut()
.get_mut::<MapFeedbackMetadata<T>>(&self.name) .get_mut::<MapFeedbackMetadata<T>>(&self.name)
.unwrap(); .unwrap();
let len = observer.len(); let len = observer.len();

View File

@ -111,7 +111,7 @@ where
{ {
let input = testcase.load_input()?.clone(); let input = testcase.load_input()?.clone();
let meta = state let meta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<NautilusChunksMetadata>() .get_mut::<NautilusChunksMetadata>()
.expect("NautilusChunksMetadata not in the state"); .expect("NautilusChunksMetadata not in the state");
meta.cks.add_tree(input.tree, self.ctx); meta.cks.add_tree(input.tree, self.ctx);

View File

@ -115,7 +115,7 @@ where
.expect("A NewHashFeedback needs a BacktraceObserver"); .expect("A NewHashFeedback needs a BacktraceObserver");
let backtrace_state = state let backtrace_state = state
.named_metadata_mut() .named_metadata_map_mut()
.get_mut::<NewHashFeedbackMetadata>(&self.name) .get_mut::<NewHashFeedbackMetadata>(&self.name)
.unwrap(); .unwrap();

View File

@ -113,7 +113,7 @@ where
corpus_idx: CorpusId, corpus_idx: CorpusId,
) -> Result<Self, Error> { ) -> Result<Self, Error> {
let meta = base let meta = base
.metadata() .metadata_map()
.get::<GeneralizedInputMetadata>() .get::<GeneralizedInputMetadata>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found(format!( Error::key_not_found(format!(
@ -121,6 +121,7 @@ where
)) ))
}) })
.cloned()?; .cloned()?;
Ok(meta) Ok(meta)
} }

View File

@ -125,7 +125,7 @@ where
other_testcase.add_metadata(meta); other_testcase.add_metadata(meta);
} }
let meta = other_testcase let meta = other_testcase
.metadata() .metadata_map()
.get::<GramatronIdxMapMetadata>() .get::<GramatronIdxMapMetadata>()
.unwrap(); .unwrap();
let other = other_testcase.input().as_ref().unwrap(); let other = other_testcase.input().as_ref().unwrap();

View File

@ -34,7 +34,10 @@ where
let rand2 = state.rand_mut().next() as usize; let rand2 = state.rand_mut().next() as usize;
let other_testcase = state.corpus().get(idx)?.borrow(); 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(); let gen = other.generalized();
for (i, _) in gen for (i, _) in gen
@ -64,7 +67,7 @@ where
let rand1 = state.rand_mut().next() as usize; 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() { if !meta.tokens().is_empty() {
let tok = &meta.tokens()[rand1 % meta.tokens().len()]; let tok = &meta.tokens()[rand1 % meta.tokens().len()];
if items.last() != Some(&GeneralizedItem::Gap) { if items.last() != Some(&GeneralizedItem::Gap) {
@ -82,7 +85,10 @@ where
} }
let other_testcase = state.corpus().get(idx)?.borrow(); 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(); let gen = other.generalized();
if items.last() == Some(&GeneralizedItem::Gap) && gen.first() == Some(&GeneralizedItem::Gap) if items.last() == Some(&GeneralizedItem::Gap) && gen.first() == Some(&GeneralizedItem::Gap)
@ -232,7 +238,7 @@ where
_stage_idx: i32, _stage_idx: i32,
) -> Result<MutationResult, Error> { ) -> Result<MutationResult, Error> {
let tokens_len = { let tokens_len = {
let meta = state.metadata().get::<Tokens>(); let meta = state.metadata_map().get::<Tokens>();
if let Some(tokens) = meta { if let Some(tokens) = meta {
if tokens.is_empty() { if tokens.is_empty() {
return Ok(MutationResult::Skipped); return Ok(MutationResult::Skipped);
@ -252,7 +258,7 @@ where
let stop_at_first = state.rand_mut().below(100) > 50; let stop_at_first = state.rand_mut().below(100) > 50;
let mut rand_idx = state.rand_mut().next() as usize; 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_1 = &meta.tokens()[token_find];
let token_2 = &meta.tokens()[token_replace]; let token_2 = &meta.tokens()[token_replace];

View File

@ -413,7 +413,7 @@ where
let before = self.finds_before; let before = self.finds_before;
let after = state.corpus().count() + state.solutions().count(); 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; let key_module = self.mode;
match key_module { match key_module {
MOptMode::Corefuzzing => { MOptMode::Corefuzzing => {
@ -553,7 +553,7 @@ where
stage_idx: i32, stage_idx: i32,
) -> Result<MutationResult, Error> { ) -> Result<MutationResult, Error> {
let mut r = MutationResult::Skipped; 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 { for i in 0..mopt.operator_num {
mopt.core_operator_cycles_v3[i] = mopt.core_operator_cycles_v2[i]; mopt.core_operator_cycles_v3[i] = mopt.core_operator_cycles_v2[i];
} }
@ -568,7 +568,7 @@ where
} }
state state
.metadata_mut() .metadata_map_mut()
.get_mut::<MOpt>() .get_mut::<MOpt>()
.unwrap() .unwrap()
.core_operator_cycles_v2[idx.0] += 1; .core_operator_cycles_v2[idx.0] += 1;
@ -585,7 +585,7 @@ where
let mut r = MutationResult::Skipped; let mut r = MutationResult::Skipped;
let swarm_now; 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; swarm_now = mopt.swarm_now;
for i in 0..mopt.operator_num { for i in 0..mopt.operator_num {
@ -604,7 +604,7 @@ where
} }
state state
.metadata_mut() .metadata_map_mut()
.get_mut::<MOpt>() .get_mut::<MOpt>()
.unwrap() .unwrap()
.pilot_operator_cycles_v2[swarm_now][idx.0] += 1; .pilot_operator_cycles_v2[swarm_now][idx.0] += 1;
@ -646,7 +646,7 @@ where
#[inline] #[inline]
fn schedule(&self, state: &mut S, _: &I) -> MutationId { fn schedule(&self, state: &mut S, _: &I) -> MutationId {
state state
.metadata_mut() .metadata_map_mut()
.get_mut::<MOpt>() .get_mut::<MOpt>()
.unwrap() .unwrap()
.select_algorithm() .select_algorithm()

View File

@ -165,7 +165,7 @@ where
_stage_idx: i32, _stage_idx: i32,
) -> Result<MutationResult, Error> { ) -> Result<MutationResult, Error> {
let meta = state let meta = state
.metadata() .metadata_map()
.get::<NautilusChunksMetadata>() .get::<NautilusChunksMetadata>()
.expect("NautilusChunksMetadata not in the state"); .expect("NautilusChunksMetadata not in the state");
// TODO get rid of tmp // TODO get rid of tmp

View File

@ -304,7 +304,7 @@ where
) -> Result<MutationResult, Error> { ) -> Result<MutationResult, Error> {
let max_size = state.max_size(); let max_size = state.max_size();
let tokens_len = { let tokens_len = {
let meta = state.metadata().get::<Tokens>(); let meta = state.metadata_map().get::<Tokens>();
if meta.is_none() { if meta.is_none() {
return Ok(MutationResult::Skipped); return Ok(MutationResult::Skipped);
} }
@ -318,7 +318,7 @@ where
let size = input.bytes().len(); let size = input.bytes().len();
let off = state.rand_mut().below((size + 1) as u64) as usize; 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 token = &meta.tokens()[token_idx];
let mut len = token.len(); let mut len = token.len();
@ -374,7 +374,7 @@ where
} }
let tokens_len = { let tokens_len = {
let meta = state.metadata().get::<Tokens>(); let meta = state.metadata_map().get::<Tokens>();
if meta.is_none() { if meta.is_none() {
return Ok(MutationResult::Skipped); return Ok(MutationResult::Skipped);
} }
@ -387,7 +387,7 @@ where
let off = state.rand_mut().below(size as u64) as usize; 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 token = &meta.tokens()[token_idx];
let mut len = token.len(); let mut len = token.len();
if off + len > size { if off + len > size {
@ -437,7 +437,7 @@ where
} }
let cmps_len = { let cmps_len = {
let meta = state.metadata().get::<CmpValuesMetadata>(); let meta = state.metadata_map().get::<CmpValuesMetadata>();
if meta.is_none() { if meta.is_none() {
return Ok(MutationResult::Skipped); return Ok(MutationResult::Skipped);
} }
@ -452,7 +452,7 @@ where
let len = input.bytes().len(); let len = input.bytes().len();
let bytes = input.bytes_mut(); 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 cmp_values = &meta.list[idx];
let mut result = MutationResult::Skipped; let mut result = MutationResult::Skipped;
@ -1077,8 +1077,8 @@ where
} }
let (cmp_len, cmp_meta, taint_meta) = { let (cmp_len, cmp_meta, taint_meta) = {
let cmp_meta = state.metadata().get::<AFLppCmpValuesMetadata>(); let cmp_meta = state.metadata_map().get::<AFLppCmpValuesMetadata>();
let taint_meta = state.metadata().get::<TaintMetadata>(); let taint_meta = state.metadata_map().get::<TaintMetadata>();
if cmp_meta.is_none() || taint_meta.is_none() { if cmp_meta.is_none() || taint_meta.is_none() {
return Ok(MutationResult::Skipped); return Ok(MutationResult::Skipped);
} }

View File

@ -57,7 +57,7 @@ impl TuneableScheduledMutatorMetadata {
/// Gets the stored metadata, used to alter the [`TuneableScheduledMutator`] behavior /// Gets the stored metadata, used to alter the [`TuneableScheduledMutator`] behavior
pub fn get<S: HasMetadata>(state: &S) -> Result<&Self, Error> { pub fn get<S: HasMetadata>(state: &S) -> Result<&Self, Error> {
state state
.metadata() .metadata_map()
.get::<Self>() .get::<Self>()
.ok_or_else(|| Error::illegal_state("TuneableScheduledMutator not in use")) .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 /// Gets the stored metadata, used to alter the [`TuneableScheduledMutator`] behavior, mut
pub fn get_mut<S: HasMetadata>(state: &mut S) -> Result<&mut Self, Error> { pub fn get_mut<S: HasMetadata>(state: &mut S) -> Result<&mut Self, Error> {
state state
.metadata_mut() .metadata_map_mut()
.get_mut::<Self>() .get_mut::<Self>()
.ok_or_else(|| Error::illegal_state("TuneableScheduledMutator not in use")) .ok_or_else(|| Error::illegal_state("TuneableScheduledMutator not in use"))
} }
@ -228,14 +228,14 @@ where
{ {
fn metadata_mut(state: &mut S) -> &mut TuneableScheduledMutatorMetadata { fn metadata_mut(state: &mut S) -> &mut TuneableScheduledMutatorMetadata {
state state
.metadata_mut() .metadata_map_mut()
.get_mut::<TuneableScheduledMutatorMetadata>() .get_mut::<TuneableScheduledMutatorMetadata>()
.unwrap() .unwrap()
} }
fn metadata(state: &S) -> &TuneableScheduledMutatorMetadata { fn metadata(state: &S) -> &TuneableScheduledMutatorMetadata {
state state
.metadata() .metadata_map()
.get::<TuneableScheduledMutatorMetadata>() .get::<TuneableScheduledMutatorMetadata>()
.unwrap() .unwrap()
} }

View File

@ -138,11 +138,14 @@ where
S: HasMetadata, S: HasMetadata,
{ {
#[allow(clippy::option_if_let_else)] // we can't mutate state in a closure #[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 meta
} else { } else {
state.add_metadata(CmpValuesMetadata::new()); state.add_metadata(CmpValuesMetadata::new());
state.metadata_mut().get_mut::<CmpValuesMetadata>().unwrap() state
.metadata_map_mut()
.get_mut::<CmpValuesMetadata>()
.unwrap()
}; };
meta.list.clear(); meta.list.clear();
let count = self.usable_count(); let count = self.usable_count();
@ -390,12 +393,13 @@ where
S: HasMetadata, S: HasMetadata,
{ {
#[allow(clippy::option_if_let_else)] // we can't mutate state in a closure #[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 meta
} else { } else {
state.add_metadata(AFLppCmpValuesMetadata::new()); state.add_metadata(AFLppCmpValuesMetadata::new());
state state
.metadata_mut() .metadata_map_mut()
.get_mut::<AFLppCmpValuesMetadata>() .get_mut::<AFLppCmpValuesMetadata>()
.unwrap() .unwrap()
}; };

View File

@ -145,7 +145,7 @@ where
fn next(&mut self, state: &mut Self::State) -> Result<CorpusId, Error> { fn next(&mut self, state: &mut Self::State) -> Result<CorpusId, Error> {
if state if state
.metadata() .metadata_map()
.get::<TopAccountingMetadata>() .get::<TopAccountingMetadata>()
.map_or(false, |x| x.changed) .map_or(false, |x| x.changed)
{ {
@ -207,7 +207,7 @@ where
let mut equal_score = false; 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 let Some(old_idx) = top_acc.map.get(&idx) {
if top_acc.max_accounting[idx] > self.accounting_map[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 mut old = state.corpus().get(*old_idx)?.borrow_mut();
let must_remove = { 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!( Error::key_not_found(format!(
"AccountingIndexesMetadata, needed by CoverageAccountingScheduler, not found in testcase #{old_idx}" "AccountingIndexesMetadata, needed by CoverageAccountingScheduler, not found in testcase #{old_idx}"
)) ))
@ -230,13 +230,13 @@ where
}; };
if must_remove { if must_remove {
drop(old.metadata_mut().remove::<AccountingIndexesMetadata>()); drop(old.metadata_map_mut().remove::<AccountingIndexesMetadata>());
} }
} }
} }
let top_acc = state let top_acc = state
.metadata_mut() .metadata_map_mut()
.get_mut::<TopAccountingMetadata>() .get_mut::<TopAccountingMetadata>()
.unwrap(); .unwrap();
@ -255,12 +255,18 @@ where
return Ok(()); return Ok(());
} }
state.corpus().get(idx)?.borrow_mut().metadata_mut().insert( state
AccountingIndexesMetadata::with_tcref(indexes, new_favoreds.len() as isize), .corpus()
); .get(idx)?
.borrow_mut()
.metadata_map_mut()
.insert(AccountingIndexesMetadata::with_tcref(
indexes,
new_favoreds.len() as isize,
));
let top_acc = state let top_acc = state
.metadata_mut() .metadata_map_mut()
.get_mut::<TopAccountingMetadata>() .get_mut::<TopAccountingMetadata>()
.unwrap(); .unwrap();
top_acc.changed = true; top_acc.changed = true;
@ -275,7 +281,7 @@ where
/// Cull the `Corpus` /// Cull the `Corpus`
#[allow(clippy::unused_self)] #[allow(clippy::unused_self)]
pub fn accounting_cull(&self, state: &mut CS::State) -> Result<(), Error> { 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 { for (_key, idx) in &top_rated.map {
let mut entry = state.corpus().get(*idx)?.borrow_mut(); let mut entry = state.corpus().get(*idx)?.borrow_mut();
@ -292,7 +298,7 @@ where
/// Creates a new [`CoverageAccountingScheduler`] that wraps a `base` [`Scheduler`] /// 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`]. /// 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 { 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) => { Some(meta) => {
if meta.max_accounting.len() != accounting_map.len() { if meta.max_accounting.len() != accounting_map.len() {
state.add_metadata(TopAccountingMetadata::new(accounting_map.len())); state.add_metadata(TopAccountingMetadata::new(accounting_map.len()));
@ -317,7 +323,7 @@ where
skip_non_favored_prob: u64, skip_non_favored_prob: u64,
accounting_map: &'a [u32], accounting_map: &'a [u32],
) -> Self { ) -> Self {
match state.metadata().get::<TopAccountingMetadata>() { match state.metadata_map().get::<TopAccountingMetadata>() {
Some(meta) => { Some(meta) => {
if meta.max_accounting.len() != accounting_map.len() { if meta.max_accounting.len() != accounting_map.len() {
state.add_metadata(TopAccountingMetadata::new(accounting_map.len())); state.add_metadata(TopAccountingMetadata::new(accounting_map.len()));

View File

@ -102,7 +102,7 @@ where
let (last_mutation_num, last_corpus_count) = { let (last_mutation_num, last_corpus_count) = {
let meta = state let meta = state
.metadata() .metadata_map()
.get::<EcoMetadata>() .get::<EcoMetadata>()
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?; .ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?;
(meta.last_mutation_num, meta.last_corpus_count) (meta.last_mutation_num, meta.last_corpus_count)
@ -112,7 +112,7 @@ where
let mut testcase = state.corpus().get(id)?.borrow_mut(); let mut testcase = state.corpus().get(id)?.borrow_mut();
let meta = testcase let meta = testcase
.metadata_mut() .metadata_map_mut()
.get_mut::<EcoTestcaseMetadata>() .get_mut::<EcoTestcaseMetadata>()
.ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?; .ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?;
// Set was_fuzzed for the old current // Set was_fuzzed for the old current
@ -122,7 +122,7 @@ where
}; };
let meta = state let meta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<EcoMetadata>() .get_mut::<EcoMetadata>()
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?; .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> { fn first_iteration(state: &mut S) -> Result<(), Error> {
let count = state.corpus().count(); let count = state.corpus().count();
state state
.metadata_mut() .metadata_map_mut()
.get_mut::<EcoMetadata>() .get_mut::<EcoMetadata>()
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))? .ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?
.initial_corpus_count .initial_corpus_count
@ -174,7 +174,7 @@ where
let was_fuzzed = state.corpus().get(id)?.borrow().scheduled_count() > 0; let was_fuzzed = state.corpus().get(id)?.borrow().scheduled_count() > 0;
if was_fuzzed { if was_fuzzed {
state state
.metadata_mut() .metadata_map_mut()
.get_mut::<EcoMetadata>() .get_mut::<EcoMetadata>()
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))? .ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?
.state = EcoState::Exploration; .state = EcoState::Exploration;
@ -183,7 +183,7 @@ where
} }
state state
.metadata_mut() .metadata_map_mut()
.get_mut::<EcoMetadata>() .get_mut::<EcoMetadata>()
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))? .ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?
.state = EcoState::Exploitation; .state = EcoState::Exploitation;
@ -194,7 +194,7 @@ where
.corpus() .corpus()
.get(id)? .get(id)?
.borrow() .borrow()
.metadata() .metadata_map()
.get::<EcoTestcaseMetadata>() .get::<EcoTestcaseMetadata>()
.ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))? .ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?
.state; .state;
@ -210,7 +210,7 @@ where
.corpus() .corpus()
.get(id)? .get(id)?
.borrow_mut() .borrow_mut()
.metadata_mut() .metadata_map_mut()
.get_mut::<EcoTestcaseMetadata>() .get_mut::<EcoTestcaseMetadata>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("EcoTestcaseMetadata not found".to_string()) Error::key_not_found("EcoTestcaseMetadata not found".to_string())
@ -226,7 +226,7 @@ where
.corpus() .corpus()
.get(selection)? .get(selection)?
.borrow() .borrow()
.metadata() .metadata_map()
.get::<EcoTestcaseMetadata>() .get::<EcoTestcaseMetadata>()
.ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))? .ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?
.clone(); .clone();
@ -234,7 +234,7 @@ where
for id in state.corpus().ids() { for id in state.corpus().ids() {
let testcase = state.corpus().get(id)?.borrow(); let testcase = state.corpus().get(id)?.borrow();
let meta = testcase let meta = testcase
.metadata() .metadata_map()
.get::<EcoTestcaseMetadata>() .get::<EcoTestcaseMetadata>()
.ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?; .ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?;
@ -274,7 +274,7 @@ where
.corpus() .corpus()
.get(parent_idx)? .get(parent_idx)?
.borrow_mut() .borrow_mut()
.metadata_mut() .metadata_map_mut()
.get_mut::<SchedulerTestcaseMetaData>() .get_mut::<SchedulerTestcaseMetaData>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string()) Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
@ -302,7 +302,7 @@ where
let executions = *state.executions(); let executions = *state.executions();
let meta = state let meta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<EcoMetadata>() .get_mut::<EcoMetadata>()
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?; .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 mut hash = observer.hash() as usize;
let psmeta = state let psmeta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<SchedulerMetadata>() .get_mut::<SchedulerMetadata>()
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?; .ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
@ -341,7 +341,7 @@ where
.corpus() .corpus()
.get(id)? .get(id)?
.borrow_mut() .borrow_mut()
.metadata_mut() .metadata_map_mut()
.get_mut::<EcoTestcaseMetadata>() .get_mut::<EcoTestcaseMetadata>()
.ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))? .ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?
.mutation_num += 1; .mutation_num += 1;
@ -350,7 +350,7 @@ where
.corpus() .corpus()
.get(id)? .get(id)?
.borrow() .borrow()
.metadata() .metadata_map()
.get::<SchedulerTestcaseMetaData>() .get::<SchedulerTestcaseMetaData>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string()) Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
@ -361,7 +361,7 @@ where
.corpus() .corpus()
.get(id)? .get(id)?
.borrow_mut() .borrow_mut()
.metadata_mut() .metadata_map_mut()
.get_mut::<EcoTestcaseMetadata>() .get_mut::<EcoTestcaseMetadata>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("EcoTestcaseMetadata not found".to_string()) Error::key_not_found("EcoTestcaseMetadata not found".to_string())
@ -389,7 +389,7 @@ where
.corpus() .corpus()
.get(id)? .get(id)?
.borrow_mut() .borrow_mut()
.metadata_mut() .metadata_map_mut()
.get_mut::<EcoTestcaseMetadata>() .get_mut::<EcoTestcaseMetadata>()
.ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))? .ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?
.mutation_num; .mutation_num;
@ -397,7 +397,7 @@ where
let executions = *state.executions(); let executions = *state.executions();
let meta = state let meta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<EcoMetadata>() .get_mut::<EcoMetadata>()
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?; .ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?;
meta.last_mutation_num = mutation_num; meta.last_mutation_num = mutation_num;
@ -453,14 +453,14 @@ where
let (cur_state, rate) = { let (cur_state, rate) = {
let meta = state let meta = state
.metadata() .metadata_map()
.get::<EcoMetadata>() .get::<EcoMetadata>()
.ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?; .ok_or_else(|| Error::key_not_found("EcoMetadata not found".to_string()))?;
(meta.state, meta.rate) (meta.state, meta.rate)
}; };
let meta = entry let meta = entry
.metadata_mut() .metadata_map_mut()
.get_mut::<EcoTestcaseMetadata>() .get_mut::<EcoTestcaseMetadata>()
.ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?; .ok_or_else(|| Error::key_not_found("EcoTestcaseMetadata not found".to_string()))?;

View File

@ -101,7 +101,8 @@ where
testcase: &Option<Testcase<<CS::State as UsesInput>::Input>>, testcase: &Option<Testcase<<CS::State as UsesInput>::Input>>,
) -> Result<(), Error> { ) -> Result<(), Error> {
self.base.on_remove(state, idx, testcase)?; 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 let entries = meta
.map .map
.drain_filter(|_, other_idx| *other_idx == idx) .drain_filter(|_, other_idx| *other_idx == idx)
@ -116,7 +117,7 @@ where
for i in state.corpus().ids() { for i in state.corpus().ids() {
let mut old = state.corpus().get(i)?.borrow_mut(); let mut old = state.corpus().get(i)?.borrow_mut();
let factor = F::compute(&mut *old, state)?; 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 e_iter = entries.iter();
let mut map_iter = old_map.as_slice().iter(); // ASSERTION: guaranteed to be in order? 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 meta.map
.extend(map.into_iter().map(|(entry, (_, idx))| (entry, idx))); .extend(map.into_iter().map(|(entry, (_, idx))| (entry, idx)));
} }
@ -225,7 +226,7 @@ where
#[allow(clippy::cast_possible_wrap)] #[allow(clippy::cast_possible_wrap)]
pub fn update_score(&self, state: &mut CS::State, idx: CorpusId) -> Result<(), Error> { pub fn update_score(&self, state: &mut CS::State, idx: CorpusId) -> Result<(), Error> {
// Create a new top rated meta if not existing // 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()); state.add_metadata(TopRatedsMetadata::new());
} }
@ -233,12 +234,12 @@ where
{ {
let mut entry = state.corpus().get(idx)?.borrow_mut(); let mut entry = state.corpus().get(idx)?.borrow_mut();
let factor = F::compute(&mut *entry, state)?; 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!( Error::key_not_found(format!(
"Metadata needed for MinimizerScheduler not found in testcase #{idx}" "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() { for elem in meta.as_slice() {
if let Some(old_idx) = top_rateds.map.get(elem) { if let Some(old_idx) = top_rateds.map.get(elem) {
if *old_idx == idx { if *old_idx == idx {
@ -251,7 +252,7 @@ where
} }
let must_remove = { 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!( Error::key_not_found(format!(
"{} needed for MinimizerScheduler not found in testcase #{old_idx}", "{} needed for MinimizerScheduler not found in testcase #{old_idx}",
type_name::<M>() type_name::<M>()
@ -262,7 +263,7 @@ where
}; };
if must_remove { if must_remove {
drop(old.metadata_mut().remove::<M>()); drop(old.metadata_map_mut().remove::<M>());
} }
} }
@ -278,7 +279,7 @@ where
.corpus() .corpus()
.get(idx)? .get(idx)?
.borrow_mut() .borrow_mut()
.metadata_mut() .metadata_map_mut()
.remove::<M>(), .remove::<M>(),
); );
return Ok(()); return Ok(());
@ -286,7 +287,7 @@ where
for elem in new_favoreds { for elem in new_favoreds {
state state
.metadata_mut() .metadata_map_mut()
.get_mut::<TopRatedsMetadata>() .get_mut::<TopRatedsMetadata>()
.unwrap() .unwrap()
.map .map
@ -298,14 +299,14 @@ where
/// Cull the `Corpus` using the `MinimizerScheduler` /// Cull the `Corpus` using the `MinimizerScheduler`
#[allow(clippy::unused_self)] #[allow(clippy::unused_self)]
pub fn cull(&self, state: &mut CS::State) -> Result<(), Error> { 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(); let mut acc = HashSet::new();
for (key, idx) in &top_rated.map { for (key, idx) in &top_rated.map {
if !acc.contains(key) { if !acc.contains(key) {
let mut entry = state.corpus().get(*idx)?.borrow_mut(); 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!( Error::key_not_found(format!(
"{} needed for MinimizerScheduler not found in testcase #{idx}", "{} needed for MinimizerScheduler not found in testcase #{idx}",
type_name::<M>() type_name::<M>()

View File

@ -191,7 +191,7 @@ where
prev: &Testcase<<Self::State as UsesInput>::Input>, prev: &Testcase<<Self::State as UsesInput>::Input>,
) -> Result<(), Error> { ) -> Result<(), Error> {
let prev_meta = prev let prev_meta = prev
.metadata() .metadata_map()
.get::<SchedulerTestcaseMetaData>() .get::<SchedulerTestcaseMetaData>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string()) 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 prev_bitmap_size_log = libm::log2(prev_bitmap_size as f64);
let psmeta = state let psmeta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<SchedulerMetadata>() .get_mut::<SchedulerMetadata>()
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?; .ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
@ -239,7 +239,7 @@ where
})?; })?;
let prev_meta = prev let prev_meta = prev
.metadata() .metadata_map()
.get::<SchedulerTestcaseMetaData>() .get::<SchedulerTestcaseMetaData>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string()) 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 prev_bitmap_size_log = libm::log2(prev_bitmap_size as f64);
let psmeta = state let psmeta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<SchedulerMetadata>() .get_mut::<SchedulerMetadata>()
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?; .ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
@ -279,7 +279,7 @@ where
.corpus() .corpus()
.get(parent_idx)? .get(parent_idx)?
.borrow() .borrow()
.metadata() .metadata_map()
.get::<SchedulerTestcaseMetaData>() .get::<SchedulerTestcaseMetaData>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string()) Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
@ -318,7 +318,7 @@ where
let mut hash = observer.hash() as usize; let mut hash = observer.hash() as usize;
let psmeta = state let psmeta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<SchedulerMetadata>() .get_mut::<SchedulerMetadata>()
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?; .ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
@ -341,7 +341,7 @@ where
next next
} else { } else {
let psmeta = state let psmeta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<SchedulerMetadata>() .get_mut::<SchedulerMetadata>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("SchedulerMetadata not found".to_string()) Error::key_not_found("SchedulerMetadata not found".to_string())
@ -374,7 +374,7 @@ where
testcase.set_scheduled_count(scheduled_count + 1); testcase.set_scheduled_count(scheduled_count + 1);
let tcmeta = testcase let tcmeta = testcase
.metadata_mut() .metadata_map_mut()
.get_mut::<SchedulerTestcaseMetaData>() .get_mut::<SchedulerTestcaseMetaData>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string()) Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())

View File

@ -77,7 +77,7 @@ where
)); ));
} }
let meta = state let meta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<ProbabilityMetadata>() .get_mut::<ProbabilityMetadata>()
.unwrap(); .unwrap();
let prob = 1.0 / factor; let prob = 1.0 / factor;
@ -107,7 +107,7 @@ where
.borrow_mut() .borrow_mut()
.set_parent_id_optional(current_idx); .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()); state.add_metadata(ProbabilityMetadata::new());
} }
self.store_probability(state, idx) self.store_probability(state, idx)
@ -120,7 +120,7 @@ where
Err(Error::empty(String::from("No entries in corpus"))) Err(Error::empty(String::from("No entries in corpus")))
} else { } else {
let rand_prob: f64 = (state.rand_mut().below(100) as f64) / 100.0; 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 threshold = meta.total_probability * rand_prob;
let mut k: f64 = 0.0; let mut k: f64 = 0.0;
let mut ret = *meta.map.keys().last().unwrap(); let mut ret = *meta.map.keys().last().unwrap();

View File

@ -67,7 +67,7 @@ where
)] )]
fn compute(entry: &mut Testcase<S::Input>, state: &S) -> Result<f64, Error> { fn compute(entry: &mut Testcase<S::Input>, state: &S) -> Result<f64, Error> {
let psmeta = state let psmeta = state
.metadata() .metadata_map()
.get::<SchedulerMetadata>() .get::<SchedulerMetadata>()
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?; .ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
@ -80,7 +80,7 @@ where
for idx in corpus.ids() { for idx in corpus.ids() {
let n_fuzz_entry = if cur_index == idx { let n_fuzz_entry = if cur_index == idx {
entry entry
.metadata() .metadata_map()
.get::<SchedulerTestcaseMetaData>() .get::<SchedulerTestcaseMetaData>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found( Error::key_not_found(
@ -92,7 +92,7 @@ where
corpus corpus
.get(idx)? .get(idx)?
.borrow() .borrow()
.metadata() .metadata_map()
.get::<SchedulerTestcaseMetaData>() .get::<SchedulerTestcaseMetaData>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found( Error::key_not_found(
@ -129,7 +129,7 @@ where
let favored = entry.has_metadata::<IsFavoredMetadata>(); let favored = entry.has_metadata::<IsFavoredMetadata>();
let tcmeta = entry let tcmeta = entry
.metadata() .metadata_map()
.get::<SchedulerTestcaseMetaData>() .get::<SchedulerTestcaseMetaData>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string()) 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> { fn compute(entry: &mut Testcase<S::Input>, state: &S) -> Result<f64, Error> {
let mut weight = 1.0; let mut weight = 1.0;
let psmeta = state let psmeta = state
.metadata() .metadata_map()
.get::<SchedulerMetadata>() .get::<SchedulerMetadata>()
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?; .ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
let tcmeta = entry let tcmeta = entry
.metadata() .metadata_map()
.get::<SchedulerTestcaseMetaData>() .get::<SchedulerTestcaseMetaData>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string()) Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
@ -344,13 +344,13 @@ where
weight *= avg_exec_us / q_exec_us; weight *= avg_exec_us / q_exec_us;
weight *= libm::log2(q_bitmap_size).max(1.0) / avg_bitmap_size; 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, Some(meta) => meta.refcnt() as f64,
None => 0.0, None => 0.0,
}; };
let avg_top_size = state let avg_top_size = state
.metadata() .metadata_map()
.get::<TopRatedsMetadata>() .get::<TopRatedsMetadata>()
.ok_or_else(|| Error::key_not_found("TopRatedsMetadata not found".to_string()))? .ok_or_else(|| Error::key_not_found("TopRatedsMetadata not found".to_string()))?
.map() .map()

View File

@ -48,13 +48,16 @@ where
fn metadata_mut(state: &mut S) -> &mut TuneableSchedulerMetadata { fn metadata_mut(state: &mut S) -> &mut TuneableSchedulerMetadata {
state state
.metadata_mut() .metadata_map_mut()
.get_mut::<TuneableSchedulerMetadata>() .get_mut::<TuneableSchedulerMetadata>()
.unwrap() .unwrap()
} }
fn metadata(state: &S) -> &TuneableSchedulerMetadata { fn metadata(state: &S) -> &TuneableSchedulerMetadata {
state.metadata().get::<TuneableSchedulerMetadata>().unwrap() state
.metadata_map()
.get::<TuneableSchedulerMetadata>()
.unwrap()
} }
/// Sets the next corpus id to be used /// Sets the next corpus id to be used

View File

@ -209,7 +209,7 @@ where
} }
let wsmeta = state let wsmeta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<WeightedScheduleMetadata>() .get_mut::<WeightedScheduleMetadata>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("WeigthedScheduleMetadata not found".to_string()) Error::key_not_found("WeigthedScheduleMetadata not found".to_string())
@ -249,7 +249,7 @@ where
})?; })?;
let prev_meta = prev let prev_meta = prev
.metadata() .metadata_map()
.get::<SchedulerTestcaseMetaData>() .get::<SchedulerTestcaseMetaData>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string()) 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 prev_bitmap_size_log = libm::log2(prev_bitmap_size as f64);
let psmeta = state let psmeta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<SchedulerMetadata>() .get_mut::<SchedulerMetadata>()
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?; .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>, prev: &crate::corpus::Testcase<<Self::State as UsesInput>::Input>,
) -> Result<(), Error> { ) -> Result<(), Error> {
let prev_meta = prev let prev_meta = prev
.metadata() .metadata_map()
.get::<SchedulerTestcaseMetaData>() .get::<SchedulerTestcaseMetaData>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string()) 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 prev_bitmap_size_log = libm::log2(prev_bitmap_size as f64);
let psmeta = state let psmeta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<SchedulerMetadata>() .get_mut::<SchedulerMetadata>()
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?; .ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?;
@ -332,7 +332,7 @@ where
.corpus() .corpus()
.get(parent_idx)? .get(parent_idx)?
.borrow_mut() .borrow_mut()
.metadata_mut() .metadata_map_mut()
.get_mut::<SchedulerTestcaseMetaData>() .get_mut::<SchedulerTestcaseMetaData>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string()) Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
@ -376,7 +376,7 @@ where
let mut hash = observer.hash() as usize; let mut hash = observer.hash() as usize;
let psmeta = state let psmeta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<SchedulerMetadata>() .get_mut::<SchedulerMetadata>()
.ok_or_else(|| Error::key_not_found("SchedulerMetadata not found".to_string()))?; .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 probability = state.rand_mut().between(0, 1000000000) as f64 / 1000000000_f64;
let wsmeta = state let wsmeta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<WeightedScheduleMetadata>() .get_mut::<WeightedScheduleMetadata>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("WeigthedScheduleMetadata not found".to_string()) Error::key_not_found("WeigthedScheduleMetadata not found".to_string())
@ -425,7 +425,7 @@ where
// Update depth // Update depth
if current_cycles > corpus_counts { if current_cycles > corpus_counts {
let psmeta = state let psmeta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<SchedulerMetadata>() .get_mut::<SchedulerMetadata>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("SchedulerMetadata not found".to_string()) Error::key_not_found("SchedulerMetadata not found".to_string())
@ -454,7 +454,7 @@ where
testcase.set_scheduled_count(scheduled_count + 1); testcase.set_scheduled_count(scheduled_count + 1);
let tcmeta = testcase let tcmeta = testcase
.metadata_mut() .metadata_map_mut()
.get_mut::<SchedulerTestcaseMetaData>() .get_mut::<SchedulerTestcaseMetaData>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string()) Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())

View File

@ -199,7 +199,7 @@ where
.to_vec(); .to_vec();
let history_map = &mut state let history_map = &mut state
.named_metadata_mut() .named_metadata_map_mut()
.get_mut::<MapFeedbackMetadata<O::Entry>>(&self.map_name) .get_mut::<MapFeedbackMetadata<O::Entry>>(&self.map_name)
.unwrap() .unwrap()
.history_map; .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 we see new stable entries executing this new corpus entries, then merge with the existing one
if state.has_metadata::<UnstableEntriesMetadata>() { if state.has_metadata::<UnstableEntriesMetadata>() {
let existing = state let existing = state
.metadata_mut() .metadata_map_mut()
.get_mut::<UnstableEntriesMetadata>() .get_mut::<UnstableEntriesMetadata>()
.unwrap(); .unwrap();
for item in unstable_entries { for item in unstable_entries {
@ -261,7 +261,10 @@ where
let bitmap_size = map.count_bytes(); 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(); let handicap = psmeta.queue_cycles();
psmeta.set_exec_time(psmeta.exec_time() + total_time); psmeta.set_exec_time(psmeta.exec_time() + total_time);
@ -278,7 +281,7 @@ where
// log::trace!("time: {:#?}", testcase.exec_time()); // log::trace!("time: {:#?}", testcase.exec_time());
let data = testcase let data = testcase
.metadata_mut() .metadata_map_mut()
.get_mut::<SchedulerTestcaseMetaData>() .get_mut::<SchedulerTestcaseMetaData>()
.ok_or_else(|| { .ok_or_else(|| {
Error::key_not_found("SchedulerTestcaseMetaData not found".to_string()) Error::key_not_found("SchedulerTestcaseMetaData not found".to_string())
@ -290,7 +293,7 @@ where
} }
// Send the stability event to the broker // 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 unstable_entries = meta.unstable_entries().len();
let map_len = meta.map_len(); let map_len = meta.map_len();
mgr.fire( mgr.fire(

View File

@ -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); meta.update(input.bytes().to_vec(), res);
// println!("meta: {:#?}", meta); // println!("meta: {:#?}", meta);

View File

@ -61,7 +61,7 @@ where
.get(corpus_idx) .get(corpus_idx)
.unwrap() .unwrap()
.borrow_mut() .borrow_mut()
.metadata_mut() .metadata_map_mut()
.insert(metadata); .insert(metadata);
} }
Ok(()) Ok(())
@ -367,7 +367,8 @@ where
let testcase = state.corpus().get(corpus_idx)?.clone(); let testcase = state.corpus().get(corpus_idx)?.clone();
mark_feature_time!(state, PerfFeature::GetInputFromCorpus); 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); start_timer!(state);
let mutations = generate_mutations(meta.iter_messages()); let mutations = generate_mutations(meta.iter_messages());
mark_feature_time!(state, PerfFeature::Mutate); mark_feature_time!(state, PerfFeature::Mutate);

View File

@ -57,7 +57,7 @@ where
_corpus_idx: CorpusId, _corpus_idx: CorpusId,
) -> Result<(), Error> { ) -> Result<(), Error> {
let (mut corpus_idx, mut solutions_idx) = 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_corpus.and_then(|x| state.corpus().next(x)),
meta.last_solution.and_then(|x| state.solutions().next(x)), meta.last_solution.and_then(|x| state.solutions().next(x)),

View File

@ -87,7 +87,7 @@ where
let payload: Vec<_> = input.bytes().iter().map(|&x| Some(x)).collect(); let payload: Vec<_> = input.bytes().iter().map(|&x| Some(x)).collect();
let original = input.clone(); 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!( Error::key_not_found(format!(
"MapNoveltiesMetadata needed for GeneralizationStage not found in testcase #{corpus_idx} (check the arguments of MapFeedback::new(...))" "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)); assert!(meta.generalized().last() == Some(&GeneralizedItem::Gap));
let mut entry = state.corpus().get(corpus_idx)?.borrow_mut(); let mut entry = state.corpus().get(corpus_idx)?.borrow_mut();
entry.metadata_mut().insert(meta); entry.metadata_map_mut().insert(meta);
} }
} }

View File

@ -71,7 +71,7 @@ where
_corpus_idx: CorpusId, _corpus_idx: CorpusId,
) -> Result<(), Error> { ) -> Result<(), Error> {
let last = state let last = state
.metadata() .metadata_map()
.get::<SyncFromDiskMetadata>() .get::<SyncFromDiskMetadata>()
.map(|m| m.last_time); .map(|m| m.last_time);
let path = self.sync_dir.clone(); let path = self.sync_dir.clone();
@ -80,11 +80,11 @@ where
{ {
if last.is_none() { if last.is_none() {
state state
.metadata_mut() .metadata_map_mut()
.insert(SyncFromDiskMetadata::new(max_time)); .insert(SyncFromDiskMetadata::new(max_time));
} else { } else {
state state
.metadata_mut() .metadata_map_mut()
.get_mut::<SyncFromDiskMetadata>() .get_mut::<SyncFromDiskMetadata>()
.unwrap() .unwrap()
.last_time = max_time; .last_time = max_time;
@ -254,7 +254,7 @@ where
) -> Result<(), Error> { ) -> Result<(), Error> {
if self.client.can_convert() { if self.client.can_convert() {
let last_id = state let last_id = state
.metadata() .metadata_map()
.get::<SyncFromBrokerMetadata>() .get::<SyncFromBrokerMetadata>()
.and_then(|m| m.last_id); .and_then(|m| m.last_id);
@ -283,11 +283,11 @@ where
let last = state.corpus().last(); let last = state.corpus().last();
if last_id.is_none() { if last_id.is_none() {
state state
.metadata_mut() .metadata_map_mut()
.insert(SyncFromBrokerMetadata::new(last)); .insert(SyncFromBrokerMetadata::new(last));
} else { } else {
state state
.metadata_mut() .metadata_map_mut()
.get_mut::<SyncFromBrokerMetadata>() .get_mut::<SyncFromBrokerMetadata>()
.unwrap() .unwrap()
.last_id = last; .last_id = last;

View File

@ -178,7 +178,7 @@ where
.post_exec_all(state, &unmutated_input, &exit_kind)?; .post_exec_all(state, &unmutated_input, &exit_kind)?;
// Second run with the mutated input // 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()), Some(meta) => BytesInput::from(meta.input_vec().as_ref()),
None => return Err(Error::unknown("No metadata found")), None => return Err(Error::unknown("No metadata found")),
}; };

View File

@ -27,7 +27,7 @@ impl_serdeany!(TuneableMutationalStageMetadata);
/// Set the number of iterations to be used by this mutational stage /// 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> { pub fn set_iters<S: HasMetadata>(state: &mut S, iters: u64) -> Result<(), Error> {
let metadata = state let metadata = state
.metadata_mut() .metadata_map_mut()
.get_mut::<TuneableMutationalStageMetadata>() .get_mut::<TuneableMutationalStageMetadata>()
.ok_or_else(|| Error::illegal_state("TuneableMutationslStage not in use")); .ok_or_else(|| Error::illegal_state("TuneableMutationslStage not in use"));
metadata.map(|metadata| { metadata.map(|metadata| {
@ -38,7 +38,7 @@ pub fn set_iters<S: HasMetadata>(state: &mut S, iters: u64) -> Result<(), Error>
/// Get the set iterations /// Get the set iterations
pub fn get_iters<S: HasMetadata>(state: &S) -> Result<Option<u64>, Error> { pub fn get_iters<S: HasMetadata>(state: &S) -> Result<Option<u64>, Error> {
state state
.metadata() .metadata_map()
.get::<TuneableMutationalStageMetadata>() .get::<TuneableMutationalStageMetadata>()
.ok_or_else(|| Error::illegal_state("TuneableMutationslStage not in use")) .ok_or_else(|| Error::illegal_state("TuneableMutationslStage not in use"))
.map(|metadata| metadata.iters) .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 /// Reset this to a normal, randomized, stage
pub fn reset<S: HasMetadata>(state: &mut S) -> Result<(), Error> { pub fn reset<S: HasMetadata>(state: &mut S) -> Result<(), Error> {
state state
.metadata_mut() .metadata_map_mut()
.get_mut::<TuneableMutationalStageMetadata>() .get_mut::<TuneableMutationalStageMetadata>()
.ok_or_else(|| Error::illegal_state("TuneableMutationslStage not in use")) .ok_or_else(|| Error::illegal_state("TuneableMutationslStage not in use"))
.map(|metadata| metadata.iters = None) .map(|metadata| metadata.iters = None)

View File

@ -1,6 +1,11 @@
//! The fuzzer, and state are the core pieces of every good fuzzer //! 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")] #[cfg(feature = "std")]
use std::{ use std::{
fs, fs,
@ -17,7 +22,7 @@ use crate::{
rands::Rand, rands::Rand,
serdeany::{NamedSerdeAnyMap, SerdeAny, SerdeAnyMap}, serdeany::{NamedSerdeAnyMap, SerdeAny, SerdeAnyMap},
}, },
corpus::{Corpus, CorpusId}, corpus::{Corpus, CorpusId, Testcase},
events::{Event, EventFirer, LogSeverity}, events::{Event, EventFirer, LogSeverity},
feedbacks::Feedback, feedbacks::Feedback,
fuzzer::{Evaluator, ExecuteInputResult}, fuzzer::{Evaluator, ExecuteInputResult},
@ -101,9 +106,9 @@ pub trait HasClientPerfMonitor {
/// Trait for elements offering metadata /// Trait for elements offering metadata
pub trait HasMetadata { pub trait HasMetadata {
/// A map, storing all metadata /// A map, storing all metadata
fn metadata(&self) -> &SerdeAnyMap; fn metadata_map(&self) -> &SerdeAnyMap;
/// A map, storing all metadata (mutable) /// 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 /// Add a metadata to the metadata map
#[inline] #[inline]
@ -111,7 +116,7 @@ pub trait HasMetadata {
where where
M: SerdeAny, M: SerdeAny,
{ {
self.metadata_mut().insert(meta); self.metadata_map_mut().insert(meta);
} }
/// Check for a metadata /// Check for a metadata
@ -120,16 +125,38 @@ pub trait HasMetadata {
where where
M: SerdeAny, 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 /// Trait for elements offering named metadata
pub trait HasNamedMetadata { pub trait HasNamedMetadata {
/// A map, storing all metadata /// A map, storing all metadata
fn named_metadata(&self) -> &NamedSerdeAnyMap; fn named_metadata_map(&self) -> &NamedSerdeAnyMap;
/// A map, storing all metadata (mutable) /// 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 /// Add a metadata to the metadata map
#[inline] #[inline]
@ -137,7 +164,7 @@ pub trait HasNamedMetadata {
where where
M: SerdeAny, M: SerdeAny,
{ {
self.named_metadata_mut().insert(meta, name); self.named_metadata_map_mut().insert(meta, name);
} }
/// Check for a metadata /// Check for a metadata
@ -146,7 +173,31 @@ pub trait HasNamedMetadata {
where where
M: SerdeAny, 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; 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. /// The state a fuzz run.
#[derive(Serialize, Deserialize, Clone, Debug)] #[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(bound = " #[serde(bound = "
@ -280,13 +347,13 @@ where
impl<I, C, R, SC> HasMetadata for StdState<I, C, R, SC> { impl<I, C, R, SC> HasMetadata for StdState<I, C, R, SC> {
/// Get all the metadata into an [`hashbrown::HashMap`] /// Get all the metadata into an [`hashbrown::HashMap`]
#[inline] #[inline]
fn metadata(&self) -> &SerdeAnyMap { fn metadata_map(&self) -> &SerdeAnyMap {
&self.metadata &self.metadata
} }
/// Get all the metadata into an [`hashbrown::HashMap`] (mutable) /// Get all the metadata into an [`hashbrown::HashMap`] (mutable)
#[inline] #[inline]
fn metadata_mut(&mut self) -> &mut SerdeAnyMap { fn metadata_map_mut(&mut self) -> &mut SerdeAnyMap {
&mut self.metadata &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> { impl<I, C, R, SC> HasNamedMetadata for StdState<I, C, R, SC> {
/// Get all the metadata into an [`hashbrown::HashMap`] /// Get all the metadata into an [`hashbrown::HashMap`]
#[inline] #[inline]
fn named_metadata(&self) -> &NamedSerdeAnyMap { fn named_metadata_map(&self) -> &NamedSerdeAnyMap {
&self.named_metadata &self.named_metadata
} }
/// Get all the metadata into an [`hashbrown::HashMap`] (mutable) /// Get all the metadata into an [`hashbrown::HashMap`] (mutable)
#[inline] #[inline]
fn named_metadata_mut(&mut self) -> &mut NamedSerdeAnyMap { fn named_metadata_map_mut(&mut self) -> &mut NamedSerdeAnyMap {
&mut self.named_metadata &mut self.named_metadata
} }
} }
@ -771,11 +838,11 @@ impl<I> HasExecutions for NopState<I> {
#[cfg(test)] #[cfg(test)]
impl<I> HasMetadata for NopState<I> { impl<I> HasMetadata for NopState<I> {
fn metadata(&self) -> &SerdeAnyMap { fn metadata_map(&self) -> &SerdeAnyMap {
&self.metadata &self.metadata
} }
fn metadata_mut(&mut self) -> &mut SerdeAnyMap { fn metadata_map_mut(&mut self) -> &mut SerdeAnyMap {
&mut self.metadata &mut self.metadata
} }
} }
@ -878,7 +945,7 @@ pub mod pybind {
} }
fn metadata(&mut self) -> PyObject { 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>() { if !meta.contains::<PythonMetadata>() {
Python::with_gil(|py| { Python::with_gil(|py| {
let dict: Py<PyDict> = PyDict::new(py).into(); let dict: Py<PyDict> = PyDict::new(py).into();

View File

@ -132,11 +132,11 @@ where
} }
} }
let state = state.expect("The gen_unique_cmp_ids hook works only for in-process fuzzing"); 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()); state.add_metadata(QemuCmpsMapMetadata::new());
} }
let meta = state let meta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<QemuCmpsMapMetadata>() .get_mut::<QemuCmpsMapMetadata>()
.unwrap(); .unwrap();
let id = meta.current_id as usize; let id = meta.current_id as usize;

View File

@ -214,13 +214,16 @@ where
let state = state.expect("The gen_unique_block_ids hook works only for in-process fuzzing"); let state = state.expect("The gen_unique_block_ids hook works only for in-process fuzzing");
if state if state
.metadata_mut() .metadata_map_mut()
.get_mut::<QemuDrCovMetadata>() .get_mut::<QemuDrCovMetadata>()
.is_none() .is_none()
{ {
state.add_metadata(QemuDrCovMetadata::new()); 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) { match DRCOV_MAP.lock().unwrap().as_mut().unwrap().entry(pc) {
Entry::Occupied(e) => { Entry::Occupied(e) => {

View File

@ -167,11 +167,11 @@ where
} }
} }
let state = state.expect("The gen_unique_edge_ids hook works only for in-process fuzzing"); 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()); state.add_metadata(QemuEdgesMapMetadata::new());
} }
let meta = state let meta = state
.metadata_mut() .metadata_map_mut()
.get_mut::<QemuEdgesMapMetadata>() .get_mut::<QemuEdgesMapMetadata>()
.unwrap(); .unwrap();

View File

@ -162,7 +162,7 @@ impl<'a, const MAP_SIZE: usize> ForkserverBytesCoverageSugar<'a, MAP_SIZE> {
// Create a dictionary if not existing // Create a dictionary if not existing
if let Some(tokens_file) = &self.tokens_file { 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)?); state.add_metadata(Tokens::from_file(tokens_file)?);
} }
} }

View File

@ -181,7 +181,7 @@ where
// Create a dictionary if not existing // Create a dictionary if not existing
if let Some(tokens_file) = &self.tokens_file { 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)?); state.add_metadata(Tokens::from_file(tokens_file)?);
} }
} }

View File

@ -192,7 +192,7 @@ where
// Create a dictionary if not existing // Create a dictionary if not existing
if let Some(tokens_file) = &self.tokens_file { 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)?); state.add_metadata(Tokens::from_file(tokens_file)?);
} }
} }