1

最近、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

4

1 に答える 1