当我在运行我的单元测试套件后运行 gcovr 时,我得到错误的数字来覆盖头文件,其中放置了一些内联成员函数定义。例如:
----------------------------------------------------------------------------
File Lines Exec Cover Missing
------------------------------------------------------------------------------
include/analysis/dataobjects/DetailedHit.h 6 2 33% 41-43,45
include/analysis/dataobjects/Hit.h 19 0 0% 31-33,35-36,42-43,50-51,58-59,74-75,82-83,90-91,98-99
对于Hit.h
报告的覆盖率为 0%,但我确信在单元测试运行期间至少执行了该标头中的一些代码,因为如果我在其中放置一个 cout,那么我会在控制台输出中看到它。在网络上,经常有人认为这是一个问题,因为编译器内联了成员函数代码,因此没有生成函数调用,因此覆盖工具不会跟踪执行。所以我添加了标志:
-fno-inline -fno-inline-small-functions -fno-default-inline
调用编译器(gcc 8.2.1),但我得到相同的覆盖率报告。所以我不明白发生了什么。
最让我困惑的是为什么 gcovr 在DetailedHit.h
. 此标头非常相似,Hit.h
因此我希望报告覆盖率为 0% 时具有相同的行为,但此成员函数:
const std::vector<Herd::ParticleHit> ParticleHits() const {
return _particleHits;
}
执行 10 次的结果。这是一个简单的函数,因此它应该像 in 中的那样内联Hit.h
,但它仍然会被覆盖。万一重要,Hit 是DetailedHit 的具体基类,两者都没有虚拟方法。
我想我错过了一些关于 gcov 和 gcovr 如何工作的重要知识,但我在网上找不到相关线索,所以我很感激任何帮助。谢谢。