2017-06-20 1 views
0

私はC++のブランチカバレッジの理解に問題があります。シンプルなプログラムであっても、分岐カバレッジは50%です。私がブーストを使用するとき、ブランチカバレッジは20%以下です。特にサードパーティ製のライブラリを使用している場合、ブランチカバレッジが低い。 ex boost

enter image description here

なぜこれが起こっている誰かが私に説明してもらえますか?私は

-fno-exceptions -g -O0 -fprofile-arcs -ftest-coverage -fPIC -Wall 

コンパイラフラグとgcovrレポートを生成するために使用しています。私も全く同じ結果を持つlcovを試しました。

答えて

1

これは単なる一般的なC++コンパイラの奇妙なことです。 gcovrとlcovはどちらも、GCCがオブジェクトコード内で測定するカバレッジデータに依存しており、コンパイラはそこにいくつかの分岐文を挿入しているようです。

私はdisassembly of the generated code on Godboltを見ており、コンパイラは実際には__static_initialization_and_destruction_0セクションの下に2つのjne分岐命令を挿入します。これらは、-O1でコンパイルすると消えます。

カバレッジ測定で選択する必要がある最適化レベルは、少し複雑です。コンパイラが多くのコードを最適化する可能性があるため、有効にする最適化が増えるほど、カバレッジ測定を特定のソースコード行に結びつけるのが難しくなります。しかし、C++ではいくつかの最適化が予想され、コンパイラが不要なコードを生成すると混乱します。ここの場合と同じです。どんなレベルを選択しても、一般的に支店全体をカバーすることはできません。

gcovのドキュメントも、using gcov with GCC optimizationについて説明しています。 Gcovは、gcovrによって生のカバレッジデータを処理するために使用されるため、同じ制限があります。

しかし、gcovrは、ソースコードを持たない行の分岐を除外することができるいくつかの後処理を実行します。ここでは、--exclude-unreachable-branchesフラグが与えられたときに}行のブランチを無視します。

関連する問題