Extend gramatron recursive mutator (#783)
This commit is contained in:
parent
8cff2ce745
commit
74955d5376
@ -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)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user