【问题标题】:Gcovr branch coverage for simple case简单案例的 Gcovr 分支覆盖率
【发布时间】:2012-03-17 13:44:15
【问题描述】:

我开发了一个简单的例子来测试 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%?

【问题讨论】:

    标签: c++ gcc gcov


    【解决方案1】:

    这是 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 2014-10-13
      • 2017-06-27
      • 2021-01-09
      • 1970-01-01
      • 2016-02-05
      相关资源
      最近更新 更多