これは単なる一般的な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
フラグが与えられたときに}
行のブランチを無視します。