📜  “-fsanitize-coverage=trace-pc”clang (1)

📅  最后修改于: 2023-12-03 15:06:08.978000             🧑  作者: Mango

使用clang中的-fsanitize-coverage=trace-pc特性

当我们在开发大型的 C/C++ 项目时,代码覆盖率是一个非常重要的问题。代码覆盖率工具可以让我们了解哪些代码被测试用例覆盖,哪些代码没有被测试覆盖,以及代码中的其他一些重要信息等。在代码覆盖率工具中,-fsanitize-coverage=trace-pc 是一种很常用的特性。

简介
  • -fsanitize-coverage=trace-pc 是 Clang 的一个 sanitizer(即:负责检测代码中潜在漏洞的工具)选项,它可以记录程序执行时的控制流信息。

  • Trace-pc 是一种基于边界的代码覆盖检测,它能够帮助我们了解程序中被执行的分支、循环以及其他控制结构等的覆盖情况。

优点
  • Trace-pc 应用了贪心算法,能够覆盖更多的测试用例路径。

  • 运行程序的时间开销比其他类型的 sanitizer 较小。

如何使用
  1. 在编译命令中加入 -fsanitize-coverage=trace-pc 选项即可。

  2. 我们可以将选项加在我们原有的编译命令行中,例如:

clang++ -g -O0 -fsanitize=address -fsanitize-coverage=trace-pc -o test test.cpp 
  1. 使用 -fprofile-instr-generate 和 -fcoverage-mapping 两个 flag 生成两个 runtime 文件,进行代码覆盖率测试,例如:
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 是非常值得尝试的。