で奇妙な警告を生成++マイグラム:私はそれをこのようにコンパイルするとき私は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をデストラクタから来ていると仮定します。
は、コンパイラに私のエラーやエラーによる警告ですか?
なぜ多くの人が誤った警告をエラーとして誤解していますか?警告は、エラーがあることを知らせるものではなく、コードが正しいと仮定しているだけであり、間違っている可能性はほとんどありません。これはむしろ役に立たない警告です.Wstrict-overflowのほとんど(すべて?)で将来のバージョンで削除される可能性があります。 –
警告の一部は深刻で、実行時エラーをデバッグするのが難しい場合があるためです。時には、そのような誤りを訂正するより多くの時間よりも警告を分析するのに、より多くの時間を費やす方が良い場合もあります。特に重要な信頼性/セキュリティ要件を持つソフトウェアを作成する場合。 – ppk