GCC strict-overflow

GCC strict-overflow

本文关键字:strict-overflow GCC      更新时间:2023-10-16

我们最近为一个大型代码库打开了- strict-overflow=5,并试图理解当优化打开时的~500个警告。有些似乎是合法的,但还有这样的事情:

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);
  }
}

产生警告:

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::find()中,并通过内联Add()函数暴露。

我该如何解决这个问题?

是的,我读过其他的堆栈溢出问题,但没有什么很有用的:

23020208 std::findstd::set上。答案:GCC bug,关闭警告

重构条件

我该如何解决这个问题?

由于它们是由您无法控制的东西(即GCC)引起的假阳性,因此您需要调整它:

  1. 一个接一个地处理它们(这就是为什么您首先启用它们,以检测可能发生溢出的地方,对吗?)
  2. 对于那些编译器正确的地方,应用更正
  3. 对于假阳性的地方,使用#pragma在本地禁用警告- #pragma的存在将意味着:"尽职调查已支付,我检查过了,这里没有任何可能溢出的东西"

(宁静的祈祷可能有帮助)