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
-
- 查看覆盖率信息。