• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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