1.6 代码覆盖率

生成与可视化覆盖率报告

译文 · 基于 Rust Fuzz Book

代码覆盖率

原文链接: https://rust-fuzz.github.io/book/cargo-fuzz/coverage.html

可视化代码覆盖率有助于了解哪些代码路径正在被模糊测试覆盖,更重要的是——哪些还没有。为了帮助模糊器探索新代码路径,可以查看它未能到达的部分,然后添加新的种子输入到语料库,或调整模糊测试目标。本章介绍如何为模糊测试目标及其当前语料库生成覆盖率报告。

前置条件

首先,按 rustc 手册 所述安装 LLVM 覆盖率工具。

若默认工具链不是 nightly,请记住为 nightly 工具链而非默认工具链安装 rustup 组件(rustup component add --toolchain nightly llvm-tools-preview ...)。

还必须使用 0.10.0 或更新版本的 cargo fuzz 才能使用 cargo fuzz coverage 子命令。

生成代码覆盖率数据

对程序完成模糊测试后,使用 coverage 命令生成精确的基于源码的代码覆盖率信息:

1
$ cargo fuzz coverage <target> [corpus dirs] [-- <args>]

该命令会:

  • 使用 -Cinstrument-coverage Rust 编译器标志编译项目,

  • 在提供的语料库上不进行模糊测试地运行程序(若未提供语料库目录,默认使用 fuzz/corpus/<target>),

  • 对语料库中的每个输入文件,在 fuzz/coverage/<target>/raw 子目录中生成原始覆盖率数据,并

  • 将原始文件合并为位于 fuzz/coverage/<target> 子目录中的 coverage.profdata 文件。

之后,可使用生成的 coverage.profdata 文件按 rustc 手册 所述生成覆盖率报告并可视化代码覆盖率信息。

示例

假设我们有一个 my_compiler 模糊测试目标,希望可视化其代码覆盖率。

  1. 在 my_compiler 目标上运行模糊器:

    1
    
    $ cargo fuzz run my_compiler
    
  2. 生成代码覆盖率信息:

    1
    
    $ cargo fuzz coverage my_compiler
    
  3. 以 HTML 格式可视化覆盖率数据:

    1
    2
    3
    4
    
    $ cargo cov -- show fuzz/target/<target triple>/release/my_compiler \
        --format=html \
        -instr-profile=fuzz/coverage/my_compiler/coverage.profdata \
        > index.html
    

    还有许多可视化和覆盖率报告选项可用(参见 llvm-cov show --help)。

最后修改 August 23, 2026: 更新 (499855b16)