最近では、大規模なコードベースで-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エッジケース
最初の質問への答えは、これが起こっている理由を説明し、それを回避する方法を提案する(serenity prayerが役立つ場合があります)。 – Barmar
正しい正式な答えは「それほど役に立ちません」ですか?あなたが質問を再入力しただけで、あなたが魔法のように実現すると予想している新しい情報はわからない! –
「どうすればこの問題を解決するのですか?」 - それはあなたがすでに問題を理解していることを前提としています。あなたはそうしない。あなたが修正しようとしている問題は、まったく問題とはみなされず、修正が必要ない問題です。あなたが実際に持っている問題は、コンパイラのフラグを使って、自分が何をしているのか、意図されている使い方を理解せずに、自分が何をしているのかを理解せずに、あなた自身の誤った仮定をして、彼らがいることを知る。これは私達が解決するのを手助けできる技術的な問題ではありません。 – hvd