2012-02-28 109 views
1

我開發了一個簡單的例子來測試gcovr和gcov的:Gcovr分支覆蓋了簡單的情況下

#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%呢?

回答

3

這是gcov的問題。如果你看一下底層gcov輸出,[此處,示例司機也太周到爲我們留下建設 - 運行/ ^#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古怪,但這是我們無法忽視的一種情況。

比爾·哈特 約翰Siirola

附:我鼓勵您在gcovr Trac頁面上提交gcovr門票:https://software.sandia.gov/trac/fast/newticket