【问题标题】:generating branch coverage data for lcov为 lcov 生成分支覆盖率数据
【发布时间】:2012-09-03 19:41:00
【问题描述】:

我正在尝试将 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 个)
分支...:没有找到数据

有什么想法吗?

【问题讨论】:

    标签: c++ testing code-coverage lcov


    【解决方案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 覆盖表包含行、函数和分支的统计信息。也许仔细检查一下您实际上正在查看正确的输出 HTML?

    【讨论】:

    • 嗨,汤姆,你的例子也不适合我。命令输出显示“分支......:未找到数据”,所以我认为我没有遗漏 html 中的某些内容。但是,谢谢!如果您可以使用我的命令查看分支数据,则可能是安装问题或与该工具有关的问题..
    • 您可能使用了旧的 LCOV 版本 (
    【解决方案2】:

    最新版本的 LCOV 默认禁用分支覆盖。

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

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

    【讨论】:

    • 正如 Abhay Joshi 下面所说:记住在每个 lcov 调用中添加 --rc 行,否则它将删除分支统计信息。此外, genhtml 选项是 --rc genhtml_branch_coverage=1
    • 您是否偶然知道这种变化的原因?直觉上这感觉很不对。
    • 分支数据的收集在 2012 年被禁用(即 lcov 版本 1.11)。该更改指出了启用此功能时可能对性能产生的一些影响 (github.com/linux-test-project/lcov/commit/…)。它们的显着程度取决于程序的大小。通常,这应该不是问题。
    • 如果您想使用lcov -l file.info 输出基于文本的摘要,则--rc lcov... 参数不起作用。所以编辑.locvrc 文件似乎是更好的选择
    【解决方案3】:

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

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

    【讨论】:

    • 这是另一个问题:版本字符串似乎暗示这是 Apple 的一些 LLVM clang 版本,用于代替 GCC。众所周知,LLVM 会生成旧格式版本的覆盖数据,这通常与 LCOV 的预期不兼容。
    【解决方案4】:

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

    您需要为 lcov 为所有调用添加附加参数“--rc lcov_branch_coverage=1”。在您的情况下,将此参数添加到所有三个调用中。如果你错过了一个,它会降低分支覆盖率。

    genhtml 还需要 --branch-coverage。

    【讨论】:

    • 不幸的是,我看到了geninfo: Note: --initial does not generate branch coverage data,所以至少其中一个不会在分支覆盖范围内运行。
    • 对于 genhtml 我发现参数是--rc genhtml_branch_coverage=1 而不是--branch-coverage
    • @Abhay Joshi:这是关键。附加参数确实总是用于 lcov 的每次调用。即使您只想从报告中删除 std 包含文件。
    猜你喜欢
    • 2017-06-19
    • 2019-09-14
    • 2017-03-31
    • 2012-11-02
    • 1970-01-01
    • 2021-09-05
    • 2017-05-20
    • 2015-04-09
    • 1970-01-01
    相关资源
    最近更新 更多