lcov 将带有函数声明的行标记为可达但未被覆盖
lcov marking lines with function declarations as reachable but not covered
我正在尝试使用 lcov(v1.13,在 OS X 上,使用 clang 作为编译器)为我的测试套件生成代码覆盖率,但我遇到了一个我不知道的恼人问题不知道怎么解决。 SO 上有几个类似的问题,但我找不到这个问题的解决方案。出于某种原因,function/member 声明被标记为可到达但未执行,有点像下面的示例(这是 header 中的内联方法定义):
这使得行覆盖率指标变得无用,所以我希望有一种方法可以修复它而无需将每个声明标记为 LCOV_EXCL_LINE。
使用的编译器标志非常标准:
-g -O0 -fno-inline -ftest-coverage -fprofile-arcs -fno-elide-constructors
奇怪的是,源文件中的方法定义也被标记为红色,尽管主体不是,例如:
// 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 中的测试工具。
回答我自己的问题:
显然,lcov -i
(初始捕获)假定函数的起始行已被检测,而对于 LLVM,它们实际上不是(而对于 GCC,它们是检测的)。有一个上游 GitHub 问题 (linux-test-project/lcov#30) 更详细地记录了这一点。
在 lcov
的上游解决这个问题之前,我已经发布了一个简单的 workaround -- 一个 Python 脚本,它从基本覆盖文件中删除函数起始行,它应该 "fix" 它,至少是暂时的。
我正在尝试使用 lcov(v1.13,在 OS X 上,使用 clang 作为编译器)为我的测试套件生成代码覆盖率,但我遇到了一个我不知道的恼人问题不知道怎么解决。 SO 上有几个类似的问题,但我找不到这个问题的解决方案。出于某种原因,function/member 声明被标记为可到达但未执行,有点像下面的示例(这是 header 中的内联方法定义):
这使得行覆盖率指标变得无用,所以我希望有一种方法可以修复它而无需将每个声明标记为 LCOV_EXCL_LINE。
使用的编译器标志非常标准:
-g -O0 -fno-inline -ftest-coverage -fprofile-arcs -fno-elide-constructors
奇怪的是,源文件中的方法定义也被标记为红色,尽管主体不是,例如:
// 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 中的测试工具。
回答我自己的问题:
显然,lcov -i
(初始捕获)假定函数的起始行已被检测,而对于 LLVM,它们实际上不是(而对于 GCC,它们是检测的)。有一个上游 GitHub 问题 (linux-test-project/lcov#30) 更详细地记录了这一点。
在 lcov
的上游解决这个问题之前,我已经发布了一个简单的 workaround -- 一个 Python 脚本,它从基本覆盖文件中删除函数起始行,它应该 "fix" 它,至少是暂时的。