Support raw byte grammar in NautilusContext (#1868)
* Support raw byte grammar in NautilusContext * Add `use` statement in doc comment
This commit is contained in:
parent
fafe8f5ce8
commit
ef16e645b7
@ -39,6 +39,47 @@ impl NautilusContext {
|
|||||||
Self { ctx }
|
Self { ctx }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns a new [`NautilusContext`] with support for non UTF-8 rules.
|
||||||
|
///
|
||||||
|
/// - This has the same behaviour as [`NautilusContext::new`] but returns `None` if the `rules` are empty.
|
||||||
|
/// - The starting rule is `rules[0]`.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use libafl::generators::nautilus::NautilusContext;
|
||||||
|
///
|
||||||
|
/// // Create a simple grammar for a series of null-terminated data.
|
||||||
|
/// let null = vec![0];
|
||||||
|
/// let mut rules = vec![
|
||||||
|
/// // rules[0] is considered the starting rule
|
||||||
|
/// ("SERIES", "{DATA}{NULL}".as_bytes()),
|
||||||
|
/// ("SERIES", "{SERIES}{SERIES}".as_bytes()),
|
||||||
|
/// ("DATA", "".as_bytes()),
|
||||||
|
/// ("DATA", "{BYTE}{DATA}".as_bytes()),
|
||||||
|
/// ("NULL", &null),
|
||||||
|
/// ];
|
||||||
|
///
|
||||||
|
/// let bytes: Vec<u8> = (1..=u8::MAX).collect();
|
||||||
|
/// for i in 0..bytes.len() {
|
||||||
|
/// rules.push(("BYTE", &bytes[i..=i]));
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// let context = NautilusContext::with_rules(100, &rules).unwrap();
|
||||||
|
/// ```
|
||||||
|
#[must_use]
|
||||||
|
pub fn with_rules(tree_depth: usize, rules: &[(&str, &[u8])]) -> Option<Self> {
|
||||||
|
let mut ctx = Context::new();
|
||||||
|
for (symbol, rule) in rules {
|
||||||
|
ctx.add_rule(symbol, rule);
|
||||||
|
}
|
||||||
|
|
||||||
|
let root = format!("{{{}}}", rules.first()?.0);
|
||||||
|
ctx.add_rule("START", root.as_bytes());
|
||||||
|
ctx.initialize(tree_depth);
|
||||||
|
Some(Self { ctx })
|
||||||
|
}
|
||||||
|
|
||||||
/// Create a new [`NautilusContext`] from a file
|
/// Create a new [`NautilusContext`] from a file
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn from_file<P: AsRef<Path>>(tree_depth: usize, grammar_file: P) -> Self {
|
pub fn from_file<P: AsRef<Path>>(tree_depth: usize, grammar_file: P) -> Self {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user