2016-09-21 28 views
7

GCOVでGCC 4.9を使用してコードと分岐カバレッジを取得しています。しかし、ブランチカバレッジの結果は、私のC++コードではまったく役に立たない。私が知っているすべての-fno-*-inlineフラグを使用しているにもかかわらず、GCCインラインテンプレートのようです。gcovでテンプレートのインライン展開を抑制する方法

------------------------------------------------------------------------------ 
          GCC Code Coverage Report 
Directory: . 
------------------------------------------------------------------------------ 
File         Branches Taken Cover Missing 
------------------------------------------------------------------------------ 
test.cpp          14  7 50% 7,8,9,10 
------------------------------------------------------------------------------ 
TOTAL           14  7 50% 
------------------------------------------------------------------------------ 

がありません:testgcovr -r . -bプリントを実行した後

#include <string> 
#include <iostream> 

using namespace std; 

int main() { 
    string foo; 
    foo = "abc"; 
    cout << foo << endl; 
} 

は私がg++ -O0 -fno-inline -fno-inline-small-functions -fno-default-inline --coverage -fprofile-arcs test.cpp -o test

でプログラムをコンパイルします。ここでは

は、問題を示し、小さなサンプルアプリケーションであります私達の main機能の単一のブランチ。たとえば、7行目には string foo;が含まれています。 std::basic_string<...>のコンストラクタにはif文が含まれているようですが、 mainのカバレッジを見ると有用な情報ではありません。

これらのすべてのインラインブランチが合計され、実際のユニットテストで計算されたブランチカバレッジは約40%です。私は、C++標準ライブラリでどのくらいのブランチを打つのかとは対照的に、私のコードのブランチカバレッジに興味があります。

コンパイラのインライン化を完全にシャットダウンする方法や、GCOVにインラインブランチを考慮させないように指示する方法はありますか?私はGCOVのホームページやそのトピックに関する他のガイドを見つけることができませんでした。

ご迷惑をおかけして申し訳ありません。

+2

そして、gcovの出力ファイルには何が表示されますか?すべてのstdライブラリコードは、インライン化されていなくても要約の中の 'test.cpp'に帰属しますが、詳細な出力はどのブランチが実際にどの関数が現れるかを示すはずです。 – Useless

答えて

4

さて、あなたはいつもあなたの期待を再確認するべきです。私自身がgcov出力を指摘してくれてありがとう@Useless。あなたはかなり正しくはありませんでした。ブランチはtest.cppファイルに帰属していません。 gcovr-kと実行し、すべての中間ファイルを見ると、gcovは、C++標準ライブラリ側の範囲を示す#usr#include#c++#4.9#bits#basic_string.h.gcovなどのファイルを正しく生成していることを示しています。

ただし、test.cppのすべてのブランチの理由はインライン展開されていません。 例外です。潜在的な例外(例:std::bad_alloc)のため、標準ライブラリへの各呼び出しはブランチです。ノイズのため申し訳ありません

 -: 0:Source:test.cpp 
     -: 0:Graph:/home/neverlord/gcov/test.gcno 
     -: 0:Data:/home/neverlord/gcov/test.gcda 
     -: 0:Runs:1 
     -: 0:Programs:1 
     -: 1:#include <string> 
     -: 2:#include <iostream> 
     -: 3: 
     -: 4:using namespace std; 
     -: 5: 
function main called 1 returned 100% blocks executed 100% 
     1: 6:int main() { 
     1: 7: string foo; 
call 0 returned 1 
     1: 8: foo = "abc"; 
call 0 returned 1 
     1: 9: cout << foo << endl; 
call 0 returned 1 
call 1 returned 1 
call 2 returned 1 
function _GLOBAL__sub_I_main called 1 returned 100% blocks executed 100% 
function _Z41__static_initialization_and_destruction_0ii called 1 returned 100% blocks executed 100% 
     4: 10:} 
call 0 returned 1 
branch 1 taken 1 (fallthrough) 
branch 2 taken 0 
branch 3 taken 1 (fallthrough) 
branch 4 taken 0 

cat foo.cpp.gcov印刷物経由gcov出力をより深く掘り

------------------------------------------------------------------------------ 
          GCC Code Coverage Report 
Directory: . 
------------------------------------------------------------------------------ 
File         Branches Taken Cover Missing 
------------------------------------------------------------------------------ 
test.cpp          4  2 50% 10 
------------------------------------------------------------------------------ 
TOTAL           4  2 50% 
------------------------------------------------------------------------------ 

:コンパイラフラグに-fno-exceptionsを追加すると、次の出力が得られます。

関連する問題