为啥 gcov 为 STL 标头创建代码覆盖率数据?
Posted
技术标签:
【中文标题】为啥 gcov 为 STL 标头创建代码覆盖率数据?【英文标题】:Why is gcov creating Code Coverage data for STL Headers?为什么 gcov 为 STL 标头创建代码覆盖率数据? 【发布时间】:2011-03-01 13:28:28 【问题描述】:当我运行 gcov foo.cpp 时,它不仅会生成 foo.cpp 的代码覆盖率报告,还会生成 foo.cpp 使用的所有 STL 标头。
有没有办法防止这种情况发生?它似乎忽略了像<ctime>
这样的标准库头文件。
编辑
刚刚在 gcc 邮件列表上看到了这篇文章:
Re: gcc, gcov and STL
【问题讨论】:
是的,实现 100% 的 stl 覆盖率似乎是一项艰巨的任务,我怀疑即使是 STL 开发人员也有一个覆盖率 100% 的测试套件^^。这个问题确实很有用 【参考方案1】:-r --relative-only
仅输出有关具有相对路径名的源文件的信息(在源前缀省略之后)。绝对路径通常是系统头文件,其中任何内联函数的覆盖范围通常是无趣的。
【讨论】:
谢谢。基本上,这将忽略#include <header>
中包含的内容并仅跟踪 #include "Myheader"
中包含的内容。摆脱 STL 覆盖的最简单解决方案 ^^【参考方案2】:
任何带有内联代码的 C++ 头文件都将在您编译时获得覆盖率检测,结果将在 gcov 中可见。一个有用的标志是gcov -long-file-names
(或只是-l),它为给定文件包含的每个标头创建一个唯一的.gcov 输出文件。这些文件的名称类似于foo.cpp##bar.h.gcov
。这将使您之后使用rm \*\\#\\#\*.gcov
轻松删除它们(小心那些反斜杠!)
检测这些文件的另一种方法是在 gcov 输出中查找编号为 0 的行。这些标记信息包括“来源:”以及原始源文件的完整路径。
【讨论】:
也许你有一个旧版本,我没有在我的结果中看到任何带有双 # 字符的文件。但是,存在带有 .gcno 的二进制文件,并且这些文件与这些文件名匹配(您可以使用字符串对这些二进制文件进行查看。) 太棒了! '-l' 解决了我很多关于内联和模板函数的问题。以上是关于为啥 gcov 为 STL 标头创建代码覆盖率数据?的主要内容,如果未能解决你的问题,请参考以下文章