最近、gcc/g++/gcov の新しいバージョンにアップグレードしたところ、gcov の動作がおかしくなりました。新しいバージョンでは、古いバージョンではカバーされていると見なされていた一部のコード行がカバーされていないと主張しています。コードをこの最小限の例に減らすことができました。
#include <memory>
using namespace std;
struct S {};
int main() {
unique_ptr<S> s;
s = make_unique<S>();
}
次に、 を使用してこのファイルをコンパイルしg++ -O0 -Wall -Wextra -Werror --std=c++17 --coverage
、結果を実行してからa.out
を実行しますgcov
。
結果の.gcov
ファイルには次が含まれます。
-: 0:Runs:1
-: 1:#include <memory>
-: 2:using namespace std;
-: 3:struct S {};
-: 4:
1: 5:int main() {
#####: 6: unique_ptr<S> s;
1: 7: s = make_unique<S>();
1: 8:}
これは、行 6 が 2 回ヒットしたと主張する古いバージョンの gcov とは異なります。
gcov が 6 行目がカバーされていないと考えるのはなぜですか? 私は何か間違ったことをしていますか?
gcc8、gcc9、および gcc10 でこの動作を再現できます。gcc7 は期待どおりに動作します。
gcc7/8 を比較するコンパイラ エクスプローラ: https://godbolt.org/z/Te57s4WK8