Skip to content

Commit 1be61a5

Browse files
committed
add diff_nfas, function out do_fuzz so clippy can do its thing
1 parent c1dcf3e commit 1be61a5

File tree

4 files changed

+104
-14
lines changed

4 files changed

+104
-14
lines changed

fuzz/Cargo.toml

+4
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ path = "fuzz_targets/ast_fuzz_match_bytes.rs"
7171
name = "ast_diff_default"
7272
path = "fuzz_targets/ast_diff_default.rs"
7373

74+
[[bin]]
75+
name = "ast_diff_nfas"
76+
path = "fuzz_targets/ast_diff_nfas.rs"
77+
7478
[profile.release]
7579
opt-level = 3
7680
debug = true

fuzz/fuzz_targets/ast_diff_default.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ impl std::fmt::Debug for FuzzData {
2222
}
2323
}
2424

25-
fuzz_target!(|data: FuzzData| -> Corpus {
25+
fn do_fuzz(data: FuzzData) -> Corpus {
2626
let _ = env_logger::try_init();
2727

2828
let pattern = format!("{}", data.ast);
@@ -61,9 +61,11 @@ fuzz_target!(|data: FuzzData| -> Corpus {
6161
assert_eq!(c1.start(), c2.start);
6262
assert_eq!(c1.end(), c2.end);
6363
} else {
64-
assert!(!c2.is_some(), "Matched in baseline, but not target!");
64+
assert!(c2.is_none(), "Matched in baseline, but not target!");
6565
}
6666
}
6767
}
6868
Corpus::Keep
69-
});
69+
}
70+
71+
fuzz_target!(|data: FuzzData| -> Corpus { do_fuzz(data) });

fuzz/fuzz_targets/ast_diff_nfas.rs

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
#![no_main]
2+
3+
use {
4+
libfuzzer_sys::{fuzz_target, Corpus},
5+
regex_automata::nfa::thompson::{
6+
backtrack::BoundedBacktracker, pikevm::PikeVM, NFA,
7+
},
8+
regex_syntax::ast::Ast,
9+
};
10+
11+
#[derive(Eq, PartialEq, arbitrary::Arbitrary)]
12+
struct FuzzData {
13+
ast: Ast,
14+
haystack: String,
15+
}
16+
17+
impl std::fmt::Debug for FuzzData {
18+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
19+
let mut builder = f.debug_struct("FuzzData");
20+
builder.field("ast", &format!("{}", self.ast));
21+
builder.field("haystack", &self.haystack);
22+
builder.finish()
23+
}
24+
}
25+
26+
fn do_fuzz(data: FuzzData) -> Corpus {
27+
let _ = env_logger::try_init();
28+
29+
let pattern = format!("{}", data.ast);
30+
let config = NFA::config().nfa_size_limit(Some(1 << 20));
31+
let Ok(nfa) = NFA::compiler().configure(config).build(&pattern) else {
32+
return Corpus::Reject;
33+
};
34+
let Ok(backtracker) = BoundedBacktracker::new_from_nfa(nfa.clone()) else {
35+
return Corpus::Reject; };
36+
let mut backtracker_cache = backtracker.create_cache();
37+
let Ok(baseline) = PikeVM::new_from_nfa(nfa) else {
38+
return Corpus::Reject;
39+
};
40+
let mut baseline_cache = baseline.create_cache();
41+
42+
if let Ok(backtracked) =
43+
backtracker.try_is_match(&mut backtracker_cache, &data.haystack)
44+
{
45+
assert_eq!(
46+
backtracked,
47+
baseline.is_match(&mut baseline_cache, &data.haystack)
48+
);
49+
}
50+
if let Ok(found1) =
51+
backtracker.try_find(&mut backtracker_cache, &data.haystack)
52+
{
53+
let found2 = baseline.find(&mut baseline_cache, &data.haystack);
54+
if let Some(found1) = found1 {
55+
let found2 =
56+
found2.expect("Found in target, but not in baseline!");
57+
assert_eq!(found1.start(), found2.start());
58+
assert_eq!(found1.end(), found2.end());
59+
}
60+
}
61+
let mut backtracker_captures = backtracker.create_captures();
62+
if let Ok(()) = backtracker.try_captures(
63+
&mut backtracker_cache,
64+
&data.haystack,
65+
&mut backtracker_captures,
66+
) {
67+
let mut baseline_captures = baseline.create_captures();
68+
69+
baseline.captures(
70+
&mut baseline_cache,
71+
&data.haystack,
72+
&mut baseline_captures,
73+
);
74+
drop(baseline_cache);
75+
assert_eq!(
76+
backtracker_captures.group_len(),
77+
baseline_captures.group_len()
78+
);
79+
for (c1, c2) in
80+
backtracker_captures.iter().zip(baseline_captures.iter())
81+
{
82+
if let Some(c1) = c1 {
83+
let c2 = c2.expect("Matched in target, but not baseline!");
84+
assert_eq!(c1.start, c2.start);
85+
assert_eq!(c1.end, c2.end);
86+
} else {
87+
assert!(c2.is_none(), "Matched in baseline, but not target!");
88+
}
89+
}
90+
}
91+
Corpus::Keep
92+
}
93+
94+
fuzz_target!(|data: FuzzData| -> Corpus { do_fuzz(data) });

fuzz/oss-fuzz-build.sh

+1-11
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,7 @@
33
cd $SRC/regex
44
cargo fuzz build -O --debug-assertions
55

6-
targets=(
7-
fuzz_regex_match
8-
fuzz_regex_lite_match
9-
fuzz_regex_automata_deserialize_dense_dfa
10-
fuzz_regex_automata_deserialize_sparse_dfa
11-
ast_roundtrip
12-
ast_fuzz_match
13-
ast_fuzz_regex
14-
ast_fuzz_match_bytes
15-
ast_diff_default
16-
)
6+
targets=$(cargo fuzz list)
177
for target in "${targets[@]}"; do
188
cp "fuzz/target/x86_64-unknown-linux-gnu/release/${target}" "${OUT}/"
199
if [[ "$target" == ast_* ]]; then

0 commit comments

Comments
 (0)