lcov标记具有可达但未覆盖的函数声明的行

时间:2017-12-24 13:23:36

标签: c++ clang code-coverage gcov lcov

我正在尝试使用lcov(在操作系统X上使用v1.13,使用clang作为编译器)为我的测试套件生成代码覆盖率,并且我遇到了一个我不知道如何解决的恼人问题。在SO上有一些类似的问题,但我找不到这个问题的解决方案。由于某种原因,函数/成员声明被标记为可访问但未执行,类似于下面的示例(这是标题中的内联方法定义):

enter image description here

这使得行覆盖率指标无效,所以我希望有一种方法可以修复它而不将每个声明标记为LCOV_EXCL_LINE。

使用的编译器标志非常标准:

-g -O0 -fno-inline -ftest-coverage -fprofile-arcs -fno-elide-constructors

奇怪的是,源文件中的方法 definitions 也标记为红色,尽管主体不是,例如:

// header.h
class Foo { 
    void bar();      // ignored, marked as unreachable
}  

// header.cpp
void Foo::bar() {    // marked as red (reachable / not executed)
    do_something();  // marked as covered
}

如果它具有任何重要性,源文件是静态库的一部分,静态库静态链接到CMake中的测试工具。

1 个答案:

答案 0 :(得分:3)

回答我自己的问题:

显然,lcov -i(初始捕获)假定函数的起始行是有装备的,而对于LLVM,它们实际上不是(而对于GCC它们在哪里)。有一个上游GitHub问题(linux-test-project/lcov#30)更详细地记录了这一点。

lcov上游修复此问题之前,我发布了一个简单的workaround - 一个Python脚本,它从基本覆盖文件中删除了函数起始行,该文件应该“修复”它,至少暂时的。