问题 为什么gcov为STL标头创建代码覆盖率数据?


当我运行gcov foo.cpp时,它不仅为foo.cpp生成代码覆盖率报告,而且还为foo.cpp使用的所有STL头生成。

有办法防止这种情况吗?它似乎忽略了标准的库标题 <ctime>

编辑

刚刚在gcc邮件列表上看过这篇文章:

Re:gcc,gcov和STL


1710
2018-06-09 08:45


起源

是的,实现100%的stl覆盖率似乎是一个巨大的任务,我怀疑甚至STL开发人员都有一个覆盖率为100%的测试套件^^。这个问题确实很有用 - GameDeveloper


答案:


-r - 仅限相关

仅输出有关具有相对路径名的源文件的信息(在源前缀elision之后)。绝对路径通常是系统头文件,其中任何内联函数的覆盖通常是无趣的。


7
2017-07-23 19:58



谢谢。基本上会忽略包含的内容 #include <header> 并且仅跟踪包含的内容 #include "Myheader"。摆脱STL覆盖的最简单的解决方案^^ - GameDeveloper


任何带有内联代码的C ++头文件在编译时都会获得覆盖检测,并且结果将在gcov中可见。一个有用的标志是'gcov -long-file-names'(或者只是-l),它为给定文件包含的每个头创建一个唯一的.gcov输出文件。这些文件的名称类似于'foo.cpp ## bar.h.gcov'。这将使你以后很容易删除'rm * \#\#*。gcov'(小心那些反斜杠!)

您可以检测这些文件的另一种方法是在gcov输出中查找编号为0的行。这些标记信息包括'Source:'以及原始源文件的完整路径。


3
2017-10-19 20:05



也许你有一个旧版本,我在结果中看不到任何带有双#字符的文件。但是,有.gcno的二进制文件和那些匹配这些文件名的文件(你可以使用字符串来查看这些二进制文件。) - Alexis Wilke
好极了! '-l'解决了内联和模板功能的很多问题。 - Yinon Ehrlich