【发布时间】:2016-09-10 00:40:34
【问题描述】:
我们最近为大型代码库启用了-Wstrict-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() 函数公开。
我应该如何解决这个问题?
是的,我已经阅读了其他 SO 问题,没有什么帮助:
23020208 std::find 在std::set 上。答:GCC bug,关闭警告
18521501重构条件
22798709 有符号整数的边缘情况
【问题讨论】:
-
第一个问题的答案解释了为什么会发生这种情况,并建议如何解决它。
-
正确权威的答案是“不是很有帮助”?仅仅因为您重新提出了问题,您不确定您期望哪些新信息会神奇地实现!
-
“我应该如何解决这个问题?” ——假设你已经理解了这个问题。你没有。您要解决的问题根本不应该被视为问题并且不需要解决。您实际遇到的问题是使用编译器标志而不了解它们的作用和预期用途,不了解它们的用途,对它们做出错误的假设,并且不愿意接受这些假设是错误的发现他们是。这不是我们可以帮助您解决的技术问题。
-
“关闭警告”并不能帮助我使用警告来发现真正的问题,所以不,不是很有帮助。 @hvd:呃,如果我理解了,我就不会问这个问题了。请指出我的错误假设;这将是对对话的技术贡献,而不仅仅是对缺乏经验的尖刻抨击。
-
@pdbj 没有真正的问题。此警告选项并非旨在仅指出实际问题。由于没有真正的问题,关闭警告是正确的做法。错误的假设在于此警告选项的用途。现在您可能仍想检查其余的数百个警告,以找出其他一些警告是否确实指向真正的问题,但这需要一段时间...
标签: c++ g++ gcc-warning