2017-05-24 10 views
4

で奇妙な警告を生成++マイグラム:私はそれをこのようにコンパイルするとき私はC++コードに続いているベクトル<weak_ptr>消去()メソッド

#include <memory> 
#include <vector> 
#include <string> 
#include <unordered_map> 

void erase_from_vector(std::vector<std::weak_ptr<int>> &mvec) { 
    for (auto mvec_it = mvec.begin(); mvec_it != mvec.end();) 
     mvec_it = mvec.erase(mvec_it); 
} 

int main(void) { 
#if 0 
    std::vector<std::weak_ptr<int>> mvec; 
    for (auto mvec_it = mvec.begin(); mvec_it != mvec.end();) 
     mvec_it = mvec.erase(mvec_it); 
#endif 
} 

GCCは警告を生成します。

[email protected]:~$ g++ --version 
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 

[email protected]:~$ g++ -fstrict-overflow -Wstrict-overflow=5 -O2 -std=c++14 warn1.cc 
warn1.cc: In function ‘void erase_from_vector(std::vector<std::weak_ptr<int> >&)’: 
warn1.cc:6:6: warning: assuming signed overflow does not occur when changing X +- C1 cmp C2 to X cmp C2 -+ C1 [-Wstrict-overflow] 
void erase_from_vector(std::vector<std::weak_ptr<int>> &mvec) { 
    ^

しかし、私は変更を - O2フラグを-O1に設定すると、警告なしでコンパイルされます。フラグ-O2を保持し、main()のコードのコメントを外すと、警告なしでもコンパイルされます。 Clangコンパイラは警告も報告しません。

私はこの警告は、カウンタがデクリメントしますが、それは私のコードで表示される理由はわかりませんされてのstd :: weak_ptrをデストラクタから来ていると仮定します。

は、コンパイラに私のエラーやエラーによる警告ですか?

+2

なぜ多くの人が誤った警告をエラーとして誤解していますか?警告は、エラーがあることを知らせるものではなく、コードが正しいと仮定しているだけであり、間違っている可能性はほとんどありません。これはむしろ役に立たない警告です.Wstrict-overflowのほとんど(すべて?)で将来のバージョンで削除される可能性があります。 –

+0

警告の一部は深刻で、実行時エラーをデバッグするのが難しい場合があるためです。時には、そのような誤りを訂正するより多くの時間よりも警告を分析するのに、より多くの時間を費やす方が良い場合もあります。特に重要な信頼性/セキュリティ要件を持つソフトウェアを作成する場合。 – ppk

答えて

3

おそらくgcc 5.4の奇妙なものです。 gcc 6.1になるとすぐに消えてしまいました。それ以降のバージョンでは再び表示されません。

gcc 5.4(警告)

gcc 6.1(警告なし)

それはクランの動作を再現しないことを特に手厳しいです。

そのような挙動はdoc強調鉱山)によれば、正確にバグではないことに留意すべきである

値場合の符号付きオーバーフローが発生しないことを前提として最適化が完全に安全です関係する変数のうち、オーバーフローが実際に起こることはありません。したがって、この警告は、実際には問題ではないコードについての警告であるを誤って肯定する可能性があります。これは、独自の免責事項が付属して最高の警告レベルであるとして、あなたは-Wstrict-overflow=5を使用している

は、それがさらにそうなります:

この警告レベルは、偽陽性の非常に多くを与え

私の提案は、あなたのコンパイラをアップグレードするか、そのGCC 5.4は、ここにあなたの偽陽性を与えるために起こっている受け入れることのいずれかです。

+2

または、偽陽性を引き起こすことが記録されている警告を有効にしないでください。 – Oktalist

+0

@Oktalist:非常に良い点。更新された投稿。 – AndyG

関連する問題