1、介绍
- LLVM 的 SanitizerCoverage 是一种代码覆盖工具,设计用于支持基于 fuzzing 的测试和其他安全相关工具。SanitizerCoverage 在编译时插桩代码,以在运行时收集覆盖信息,从而帮助识别未覆盖的代码路径,提高测试的有效性和全面性。
- SanitizerCoverage可以用户自定义桩代码,参考:LLVM入门教学——SanitizerCoverage插桩(自定义桩代码)-CSDN博客。
- 本文使用的是SanitizerCoverage自带的桩代码。
2、步骤
- 准备一个test.c文件,计算该程序运行时的覆盖率。
-
#include <stdio.h> int main(int argc, char *argv[]) { int a, b; char op; int result; scanf("%d%c%d", &a, &op, &b); switch (op) { case '+': result = a + b; break; case '-': result = a - b; break; case '*': result = a * b; break; case '/': result = a / b; break; default: return 1; } printf("%d\n", result); return 0; }
-
- 编译时插入桩代码。
-
clang -fsanitize=address -fsanitize-coverage=trace-pc-guard -o test test.c
-
- 执行程序获取覆盖率数据文件。
-
ASAN_OPTIONS=coverage=1 ./test
- 可能遇到段错误,重新执行即可。
-
- .sancov文件是 AddressSanitizer生成的覆盖率文件,这些文件包含了程序在运行时覆盖的代码部分的信息。将该文件转换为覆盖率信息。
-
sancov -symbolize *.sancov ./test > test.symcov
-
- 查看覆盖率信息。