1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This is the "library code" tested in this example.
// Compare with https://llvm.org/docs/LibFuzzer.html#toy-example
use {fuzz::fuzz, helper::toy_example};

// Imports that are only used by `main` needs to be conditional included.
#[cfg(not(fuzz))]
use std::io::{self, Read};

// Conditionally include `main`, allowing it to be omitted when provided by a compiler runtime.
#[cfg(not(fuzz))]
fn main() -> io::Result<()> {
    let mut s = String::new();
    io::stdin().read_to_string(&mut s)?;
    let _ = toy_example(s);
    Ok(())
}

// This is the "fuzzer code" for the binary code above.
// It can typically be placed alongside that code and will only be compiled when fuzzing.
#[cfg(fuzz)]
use helper::add_bang;

#[fuzz]
fn toy_example_with_main(input: String) {
    let _ = toy_example(add_bang(input));
}