Extend gramatron recursive mutator (#783)

This commit is contained in:
Andrea Fioraldi 2022-09-14 10:24:50 +02:00 committed by GitHub
parent 8cff2ce745
commit 74955d5376
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -16,6 +16,8 @@ use crate::{
Error, Error,
}; };
const RECUR_THRESHOLD: u64 = 5;
/// A random mutator for grammar fuzzing /// A random mutator for grammar fuzzing
#[derive(Debug)] #[derive(Debug)]
pub struct GramatronRandomMutator<'a, S> pub struct GramatronRandomMutator<'a, S>
@ -163,7 +165,8 @@ impl GramatronSpliceMutator {
pub struct GramatronRecursionMutator { pub struct GramatronRecursionMutator {
counters: HashMap<usize, (usize, usize, usize)>, counters: HashMap<usize, (usize, usize, usize)>,
states: Vec<usize>, states: Vec<usize>,
temp: Vec<Terminal>, suffix: Vec<Terminal>,
feature: Vec<Terminal>,
} }
impl<S> Mutator<GramatronInput, S> for GramatronRecursionMutator impl<S> Mutator<GramatronInput, S> for GramatronRecursionMutator
@ -227,11 +230,20 @@ where
} }
debug_assert!(idx_1 < idx_2); debug_assert!(idx_1 < idx_2);
self.temp.clear(); self.suffix.clear();
self.temp.extend_from_slice(&input.terminals()[idx_2..]); self.suffix.extend_from_slice(&input.terminals()[idx_2..]);
input.terminals_mut().truncate(idx_2); self.feature.clear();
input.terminals_mut().extend_from_slice(&self.temp); self.feature
.extend_from_slice(&input.terminals()[idx_1..idx_2]);
input.terminals_mut().truncate(idx_1);
for _ in 0..state.rand_mut().below(RECUR_THRESHOLD) {
input.terminals_mut().extend_from_slice(&self.feature);
}
input.terminals_mut().extend_from_slice(&self.suffix);
Ok(MutationResult::Mutated) Ok(MutationResult::Mutated)
} }