📅  最后修改于: 2023-12-03 15:06:08.978000             🧑  作者: Mango
当我们在开发大型的 C/C++ 项目时,代码覆盖率是一个非常重要的问题。代码覆盖率工具可以让我们了解哪些代码被测试用例覆盖,哪些代码没有被测试覆盖,以及代码中的其他一些重要信息等。在代码覆盖率工具中,-fsanitize-coverage=trace-pc 是一种很常用的特性。
-fsanitize-coverage=trace-pc 是 Clang 的一个 sanitizer(即:负责检测代码中潜在漏洞的工具)选项,它可以记录程序执行时的控制流信息。
Trace-pc 是一种基于边界的代码覆盖检测,它能够帮助我们了解程序中被执行的分支、循环以及其他控制结构等的覆盖情况。
Trace-pc 应用了贪心算法,能够覆盖更多的测试用例路径。
运行程序的时间开销比其他类型的 sanitizer 较小。
在编译命令中加入 -fsanitize-coverage=trace-pc 选项即可。
我们可以将选项加在我们原有的编译命令行中,例如:
clang++ -g -O0 -fsanitize=address -fsanitize-coverage=trace-pc -o test test.cpp
clang++ -g -O0 -fsanitize=address -fsanitize-coverage=trace-pc -fprofile-instr-generate -fcoverage-mapping -o test test.cpp
Trace-pc 特性只适用于 Clang/LLVM 。
Trace-pc 特性将会记录程序的运行时间以及所有的程序路径,因此会造成一定的性能损失。
如果你使用其他编译器,例如 gcc ,由于其尚未执行 LLVM 的重构,Trace-pc 特性并不具有对这些编译器友好的优化,将导致性能下降。
Trace-pc 不适用于 Windows 操作系统。
使用 -fsanitize-coverage=trace-pc 特性可以帮助我们获取程序中被执行的分支、循环以及其他控制结构的覆盖率信息。同时,我们还需注意该特性对程序性能方面的影响。
如果你想让你的项目具备更好的代码覆盖率信息,那么 -fsanitize-coverage=trace-pc 是非常值得尝试的。