1 // libfuzzer:
2 //
3 // cargo install cargo-fuzz
4 // cargo fuzz run parse_token_stream -j $(nproc) -- -max_len=200 -timeout=1
5 //
6 // afl++:
7 //
8 // cargo install cargo-afl
9 // cargo afl build --no-default-features --features afl --release
10 // cargo afl fuzz -i in -o out target/release/parse_token_stream
11 //
12 // honggfuzz:
13 //
14 // cargo install honggfuzz
15 // cargo hfuzz build --no-default-features --features honggfuzz
16 // HFUZZ_RUN_ARGS="--threads $(nproc) --max_file_size 200 --timeout 1" cargo hfuzz run parse_token_stream
17
18 #![cfg_attr(feature = "libfuzzer", no_main)]
19
20 use std::str;
21
22 #[cfg(not(any(
23 all(
24 feature = "libfuzzer",
25 not(feature = "afl"),
26 not(feature = "honggfuzz")
27 ),
28 all(
29 not(feature = "libfuzzer"),
30 feature = "afl",
31 not(feature = "honggfuzz")
32 ),
33 all(
34 not(feature = "libfuzzer"),
35 not(feature = "afl"),
36 feature = "honggfuzz"
37 ),
38 )))]
main()39 fn main() {
40 compile_error! {
41 r#"exactly one of feature="libfuzzer" or feature="afl" or feature="honggfuzz" must be enabled"#
42 }
43 }
44
45 #[cfg(feature = "libfuzzer")]
46 libfuzzer_sys::fuzz_target!(|bytes: &[u8]| do_fuzz(bytes));
47
48 #[cfg(feature = "afl")]
main()49 fn main() {
50 let hook = true; // turn panic into crashes
51 afl::fuzz(hook, do_fuzz);
52 }
53
54 #[cfg(feature = "honggfuzz")]
main()55 fn main() {
56 loop {
57 honggfuzz::fuzz(do_fuzz);
58 }
59 }
60
do_fuzz(bytes: &[u8])61 fn do_fuzz(bytes: &[u8]) {
62 let ..=199 = bytes.len() else { return };
63 let Ok(string) = str::from_utf8(bytes) else {
64 return;
65 };
66 let _ = string.parse::<proc_macro2::TokenStream>();
67 }
68