为什么gcov会为STL头文件创建代码覆盖数据?

11

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

有没有办法防止这种情况发生?看起来它会忽略像<ctime>这样的标准库头文件。

编辑

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

Re: gcc、gcov和STL


是的,实现100%的STL覆盖率似乎是一项巨大的任务,我怀疑即使STL开发人员也没有一个具有100%覆盖率的测试套件 ^ ^。这个问题确实非常有用。 - CoffeDeveloper
2个回答

7

-r --relative-only

仅输出相对路径名的源文件信息(在源前缀删减后)。绝对路径通常是系统头文件,其中内联函数的覆盖率通常不重要。


谢谢。基本上,这将忽略使用 #include <header> 包含的内容,并跟踪仅使用 #include "Myheader" 包含的内容。这是摆脱 STL 覆盖率的最简单解决方案 ^^ - CoffeDeveloper

5
任何带有内联代码的C++头文件在编译时都会得到覆盖率工具的仪器化,并且可以通过gcov查看结果。一个有用的标志是gcov -long-file-names(或只需-l),它为每个包含在给定文件中的头文件创建一个唯一的.gcov输出文件。这些文件的名称类似于foo.cpp##bar.h.gcov。您可以使用rm \*\\#\\#\*.gcov轻松删除它们(请注意反斜杠!)。
另一种检测这些文件的方法是在gcov输出中查找编号为0的行。这些行有标记信息,包括“Source:”和原始源文件的完整路径。

也许你使用的是旧版本,我在结果中没有看到任何带有双#字符的文件。但是,有些二进制文件具有.gcno扩展名,并且与这些文件名匹配(您可以使用strings命令查看这些二进制文件)。 - Alexis Wilke
太好了!‘-l’解决了我很多关于内联和模板函数的问题。 - Yinon Ehrlich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接