生成lcov的分支覆盖数据

时间:2012-09-10 22:12:29

标签: 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 --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个)
  分支......:没有找到数据

任何想法?

4 个答案:

答案 0 :(得分:24)

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

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

  • 修改.lcovrc文件(从/ etc / lcovrc复制)以将lcov_branch_coverage设置更改为1
  • --rc lcov_branch_coverage=1添加到您的lcov命令行

答案 1 :(得分:5)

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

您需要添加其他参数作为" - rc lcov_branch_coverage = 1"为所有电话lcov 。在您的情况下,将此参数添加到您的所有三个调用。如果你错过了一个,它将会降低分支覆盖范围。

genhtml还需要--branch-coverage。

答案 2 :(得分:1)

对不起,不是一个“想法”,而是确认你正确地做了一切。您的确切命令适用于这个简单的代码:

#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;
}

lcov coverage表包含Lines,Functions和Branches的统计信息。也许仔细检查你是否真的在查看正确的输出HTML?

答案 3 :(得分:0)

基于此post,差异可能取决于您使用的gcc版本。你能分享你正在使用的版本吗? 我没有得到分支机构的报道:

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