C++ 为lcov生成分支覆盖率数据

C++ 为lcov生成分支覆盖率数据,c++,testing,code-coverage,lcov,C++,Testing,Code Coverage,Lcov,我试图使用lcov作为代码覆盖率指标,但我无法使分支覆盖率发挥作用 以下是我如何使用它: g++ -ggdb3 --coverage src/read.c tests/test.cpp -o bin/test lcov --zerocounters --directory $PWD lcov --capture --initial --directory $PWD --output-file coverage_output ./bin/test lcov --no-checksum -

我试图使用lcov作为代码覆盖率指标,但我无法使分支覆盖率发挥作用

以下是我如何使用它:

g++ -ggdb3 --coverage src/read.c tests/test.cpp -o bin/test 
lcov --zerocounters --directory $PWD 
lcov --capture --initial --directory $PWD --output-file coverage_output  
./bin/test 
lcov --no-checksum --directory $PWD --capture --output-file coverage_output 
genhtml --branch-coverage --highlight --legend --output-directory out coverage_output
但我得到:

总体覆盖率:
行数:100.0%(60行中的60行)
功能:100.0%(26项功能中的26项)
分支…:未找到任何数据

有什么想法吗?

对不起,与其说是“想法”,不如说是确认你做的每件事都是正确的。您的确切命令适用于以下简单代码:

#include <iostream>
using namespace std;

bool foo(int i)
{
    if (i != 0) {
        return 12 / i;
    } else {
        return 0;
    }
}

int main(int argc, char** argv)
{
    cout << foo(argc) << endl;
    return 0;
}
#包括
使用名称空间std;
布尔福(国际一)
{
如果(i!=0){
返回12/i;
}否则{
返回0;
}
}
int main(int argc,字符**argv)
{

cout默认情况下,LCOV的最新版本禁用了分支覆盖

您需要通过以下任一方式重新启用它:

  • 编辑
    ~/.lcovrc
    文件(从/etc/lcovrc复制)以将
    lcov\u分支机构\u覆盖范围设置更改为1
  • --rc lcov\u branch\u coverage=1
    添加到lcov命令行
基于此,差异可能取决于您使用的gcc版本。您可以分享您使用的版本吗。 我没有得到以下方面的分支机构保险:

 i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

.lcovrc文件是需要放置在lcov文件路径中的设置文件。坦率地说,我并没有对该文件的使用进行太多研究

您需要为所有呼叫的lcov添加额外参数“-rc lcov\u branch\u coverage=1”。在您的情况下,将此参数添加到所有三个呼叫中。如果错过一个,它将删除分支覆盖率


另外——genhtml需要分支覆盖率。

嗨,汤姆,你的例子对我也不适用。命令输出显示“分支…:找不到数据”,因此我不认为我在html中遗漏了什么。但是,谢谢!如果您可以使用我的命令查看分支数据,可能是安装问题或该工具的某些问题。您可能使用了旧的LCOV版本(<1.11)默认情况下,在启用分支数据收集的地方。正如Abhay Joshi在下面所说:记住在每次lcov调用中添加--rc行,否则它将删除分支统计数据。此外,genhtml选项是--rc genhtml\u branch\u coverage=1您是否碰巧知道该更改的基本原理?直觉上这感觉非常错误。bra的收集nch数据在2012年被禁用(即lcov版本1.11)。此更改说明了启用此功能时可能产生的一些性能影响()。它们的显著程度取决于程序的大小。通常,这不应该是一个问题。如果您想使用
lcov-l file.info
输出基于文本的摘要,
--rc lcov…
参数不起作用。因此编辑
.locvrc
文件似乎是btter的选择这是另一个问题:版本字符串seems暗示这是苹果公司的某个LLVM clang版本,用于代替GCC。众所周知,LLVM生成的覆盖率数据采用的是旧格式版本,通常与LCOV的预期不兼容。不幸的是,我看到
geninfo:Note:--initial不生成分支覆盖率数据,因此至少其中一个不会运行对于genhtml,我发现参数是
--rc genhtml\u branch\u coverage=1
而不是
--branch coverage
@Abhay Joshi:这是关键。附加参数实际上总是用于lcov的每次调用。即使您只是想从报告中删除std include文件。