模糊测试

cargo-fuzz

cargo-fuzz 通过 libFuzzer 提供对模糊测试的支持。libFuzzer 是 LLVM 自带的库。

  1. 安装 cargo fuzz:

    cargo install cargo-fuzz
  2. 在项目路径中初始化 fuzz:

    cargo fuzz init

cargo-fuzz 会创建 fuzz 文件夹,需要模糊测试的文件以 bin 的形式添加到 fuzz/Cargo.toml 中即可:

[package]
name = "mypkg-fuzz"
version = "0.0.0"
authors = ["Automatically generated"]
publish = false
edition = "2018"

[package.metadata]
cargo-fuzz = true

[dependencies]
libfuzzer-sys = "0.4"


# Prevent this from interfering with workspaces
[workspace]
members = ["."]

[[bin]]
name = "serialize_string"
path = "fuzz_targets/serialize_string.rs"
test = false
doc = false

每个 bin 文件都是一个单独的 fuzz target。其内容为:

#![no_main]
use libfuzzer_sys::fuzz_target;

fuzz_target!(|data: &[u8]| {
    // do something
});

cargo-fuzz 命令

命令作用

cargo fuzz list

列出可执行的 fuzz target。

cargo fuzz run <target>

对 <target> 执行模糊测试

下面是一个实际的例子:

cargo fuzz run serialize_string -j8 -- -max_len=1440

性能测试

性能测试一般以 criterion.rs 为准。

  1. 将 criterion.rs 添加到 dev-dependencies 并添加 benchmark。

    [dev-dependencies]
    criterion = { version = "0.4", features = ["html_reports"] }
    
    [[bench]]
    name = "my_benchmark"
    harness = false
  2. 在 benches 文件夹中添加 benchmark:

    benchmark/my_benchmark
    use criterion::{black_box, criterion_group, criterion_main, Criterion};
    
    fn fibonacci(n: u64) -> u64 {
        match n {
            0 => 1,
            1 => 1,
            n => fibonacci(n-1) + fibonacci(n-2),
        }
    }
    
    fn criterion_benchmark(c: &mut Criterion) {
        c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20))));
    }
    
    criterion_group!(benches, criterion_benchmark);
    criterion_main!(benches);

由于编译器的优化很可能导致无法准确测试出性能,所以可以使用 block_box 禁止编译器进行优化。

Last moify: 2024-06-05 23:51:26
Build time:2025-07-18 09:41:42
Powered By asphinx