1.6 代码覆盖率
2 分钟阅读
译文 · 基于 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 命令生成精确的基于源码的代码覆盖率信息:
| |
该命令会:
使用
-Cinstrument-coverageRust 编译器标志编译项目,在提供的语料库上不进行模糊测试地运行程序(若未提供语料库目录,默认使用
fuzz/corpus/<target>),对语料库中的每个输入文件,在
fuzz/coverage/<target>/raw子目录中生成原始覆盖率数据,并将原始文件合并为位于
fuzz/coverage/<target>子目录中的coverage.profdata文件。
之后,可使用生成的 coverage.profdata 文件按 rustc 手册 所述生成覆盖率报告并可视化代码覆盖率信息。
示例
假设我们有一个 my_compiler 模糊测试目标,希望可视化其代码覆盖率。
在
my_compiler目标上运行模糊器:1$ cargo fuzz run my_compiler生成代码覆盖率信息:
1$ cargo fuzz coverage my_compiler以 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)。