TL;DR
libFuzzer を使って Rust のコードをファズテストするための Cargo のサブコマンド。
仕組み
Rust のコンパイラは LLVM で作られているので、libFuzzer の機能を Rust から利用できる。cargo fuzz init でファズテスト用のサブプロジェクト(fuzz ディレクトリ)を作り、cargo fuzz add <ターゲット名> でファズターゲットを足し、cargo fuzz run <ターゲット名> で実行する。
#![no_main]
use libfuzzer_sys::fuzz_target;
fuzz_target!(|data: &[u8]| {
let _ = some_crate::is_fuzz(data);
});注意点
- 不安定なコマンドラインフラグを使うので、nightly のコンパイラが必要である(
cargo +nightly fuzz run fuzz_target_1) - libFuzzer が LLVM のサニタイザに依存するため、x86-64 と Aarch64 の Unix 系 OS でしか動かない。Windows には対応していない
- ワークスペースのクレートでは、
fuzzディレクトリをworkspace.membersに加える必要がある