2016-09-10 20 views
0

最近では、大規模なコードベースで-Wstrict-overflow=5を有効にし、最適化が有効になっているとき〜500の警告を理解しようとしています。一部は合法的なようだが、その後、このようなものがあります:GCC strict-overflow

std::vector<std::string> files; 
... 
void Add (const std::string file) 
{ 
    if (std::find(files.begin(), files.end(), file) == files.end()) 
    { 
    files.push_back(file); 
    } 
} 

警告生成:私は比較はstd::find()であり、かつAdd()機能をインライン化によって公開されたと仮定し

example.cc: In member function ‘void Add(std::string)’: 
example.cc:465:8: error: assuming signed overflow does not occur when changing X +- C1 cmp C2 to X cmp C2 -+ C1 [-Werror=strict-overflow] 
void Add (const std::string file) 
    ^

が。

私はこれをどのように修正する必要がありますか? std::set

23020208std::find

はい、私は他のSOの質問、何も非常に役立つを読みました。回答:符号付き整数ではGCCのバグ、警告をオフにし

18521501リファクタリングの条件文

22798709エッジケース

+0

最初の質問への答えは、これが起こっている理由を説明し、それを回避する方法を提案する(serenity prayerが役立つ場合があります)。 – Barmar

+1

正しい正式な答えは「それほど役に立ちません」ですか?あなたが質問を再入力しただけで、あなたが魔法のように実現すると予想している新しい情報はわからない! –

+0

「どうすればこの問題を解決するのですか?」 - それはあなたがすでに問題を理解していることを前提としています。あなたはそうしない。あなたが修正しようとしている問題は、まったく問題とはみなされず、修正が必要ない問題です。あなたが実際に持っている問題は、コンパイラのフラグを使って、自分が何をしているのか、意図されている使い方を理解せずに、自分が何をしているのかを理解せずに、あなた自身の誤った仮定をして、彼らがいることを知る。これは私達が解決するのを手助けできる技術的な問題ではありません。 – hvd

答えて

1

は、どのように私はこの問題を解決することが出来るのですか?

、彼らはあなたが何のコントロールの上に持っていない何か(すなわちGCC)によって引き起こされる偽陽性なので、あなたがそれを調整する必要があります:

  1. は、なぜこれがある(それらを一つずつ取りますオーバーフローが発生する可能性がどこ権利、検出する?)コンパイラが右であるそれらの場所のための
  2. 、修正を適用する
  3. 、これは偽陽性である場所のため
  4. 、局部的に無効にする#pragmaを使用し、最初の場所でそれらを有効に警告 - その#pragmaの存在は、次のことを意味します: "Due dilligen私はチェックして、何かがここでオーバーフローすることはない」

+0

有用な返信をありがとう。はい、1、もちろん2です。しかし、3については、私の新しいコメント23020208を参照してください:警告は私のコードではなく、コールサイトのものに起因しています。だから私は、発信者がトリガするすべての場所でプリプロセッサの5行を捨てなければならないのですか?ヤック – pdbj

+0

@pdbj "Yuck"私は共感します。その他のオプションには、「リスクを受け入れる」、「警告をオフにする」、または「コードでオーバーフローが発生しないようにする別の方法を見つける - マクロ、テンプレートなどをコードに使用する - (したがってリスクを受け入れない)警告する "または"上司にそれを行うためのインターンを受け入れるよう説得し、警告をオフにしない " –