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 に加える必要がある

関連

出典