我开发了一个简单的示例来测试gcovr和gcov:

#include <iostream>

int main (int argc, const char * argv[])
{
    std::cout << argc << std::endl;

    if(argc == 1)
    {
        int y = 1;
        std::cout << "Argc > 1" << std::endl;
    }
    if(argc == 2) std::cout << "Argc > 2" << std::endl;
    if(argc == 3)
    {
        std::cout << "Argc > 3" << std::endl;
    }

    int i = 34;
    i = i * i;

    return 0;
}

还有一个用于生成覆盖率报告的脚本:
#! /bin/bash

rm -rf build-run
mkdir build-run
cd build-run

g++ -O6 -DDEBUG=0 --coverage -ftest-coverage -fprofile-arcs -c -o main.o ../main.cpp

g++ -O6 -DDEBUG=0 --coverage -fprofile-arcs -ftest-coverage -lgcov -o coverage ./main.o

./coverage > out
./coverage --help > out
./coverage --help --out > out

gcovr -v -kpbu -r .. -o ../branch-report.txt
gcovr -v -kpu -r .. -o ../report.txt

我使用-b选项获得了80%的覆盖率,它使我指向了主块的最后一行。在我看来,对于这种情况,应该是100%吗?

最佳答案

这是gcov的问题。如果查看底层的gcov输出[示例驱动程序非常有礼貌地作为build-run / ^#main.cpp.gcov留给我们使用],您会看到:

[…snip…]
        3:   21:    return 0;
function _Z41__static_initialization_and_destruction_0ii called 3 returned 100% blocks executed 100%
        6:   22:}
branch  0 taken 3 (fallthrough)
branch  1 taken 0
branch  2 taken 3 (fallthrough)
branch  3 taken 0
function _GLOBAL__I_main called 3 returned 100% blocks executed 100%
        3:   23:/*EOF*/
call    0 returned 3

我认为正在报告的是iostream库中对象的静态成员的析构函数的分支覆盖范围。 …虽然我们尝试通过gcovr滤除大多数gcov怪异现象,但这是我们无法可靠忽略的情况之一。

比尔·哈特
约翰·西罗拉

附言我鼓励您在gcovr Trac页面上提交gcovr票:https://software.sandia.gov/trac/fast/newticket

10-05 21:38