| # FuzzTest Rust | |
| A framework for fuzzing Rust projects using FuzzTest. | |
| ## Prerequisites | |
| 1. Clone the repository. | |
| 2. Build the C++ Centipede static library engine using Bazel (from the | |
| repository root): | |
| ```bash | |
| cd /path/to/fuzztest | |
| bazel build //centipede:centipede_engine_static | |
| ``` | |
| 3. Copy the libcentipede_engine_static.a library to another location: | |
| ```bash | |
| mkdir -p $HOME/.local/lib | |
| cp /path/to/fuzztest/bazel-bin/centipede/libcentipede_engine_static.a \ | |
| $HOME/.local/lib/ | |
| ``` | |
| ## Setup a Project | |
| 1. Create a new Rust project: | |
| ```bash | |
| cargo new my_fuzz_project --bin | |
| ``` | |
| 2. Add `fuzztest` as a dependency in your `Cargo.toml`: | |
| ```toml | |
| [dependencies] | |
| fuzztest = { path = "/path/to/fuzztest/rust" } | |
| googletest = "0.14.3" | |
| ``` | |
| ## Write a Fuzz Test | |
| In `src/main.rs`: | |
| ```rust | |
| #[cfg(test)] | |
| mod tests { | |
| use fuzztest::domains::arbitrary::Arbitrary; | |
| use fuzztest::fuzztest; | |
| #[fuzztest(a = Arbitrary::<i32>::default(), b = Arbitrary::<i32>::default())] | |
| fn test_addition(a: i32, b: i32) { | |
| let _ = a.wrapping_add(b); | |
| } | |
| } | |
| ``` | |
| ## Build and Run Fuzz Tests | |
| To run the fuzz tests, you must specify the path that contains the previously | |
| built `libcentipede_engine_static.a` using the `FUZZTEST_LIB_PATH` environment | |
| variable: | |
| ```bash | |
| # Run all fuzztests in smoke-test mode. | |
| FUZZTEST_LIB_PATH="$HOME/.local/lib" cargo test __fuzztest_mod__ | |
| ``` | |
| // TODO(the-shank): add example of more commands for fuzzing, along with sample | |
| outputs. |