我正在尝试使用GCC 5.2.0构建Chromium 45.0.2454.85。它是用-Wall和-Werror构建的,我想保持这种方式(虽然GCC似乎在每个新版本中逐渐变得越来越困难)。我已经修复了几个警告(错误),但是这个问题的底部证明是非常棘手的:
ui/gfx/image/image_util.cc:50:6: error: assuming signed overflow does not occur when assuming that (X - c) <= X is always true [-Werror=strict-overflow]
以下是它所指的行: https://chromium.googlesource.com/chromium/src.git/+/45.0.2454.85/ui/gfx/image/image_util.cc#50
我对此警告的第一个问题是,它指出了问题所在的功能,并让您去寻找问题。我知道这个警告很可能是在优化器的内部产生的,因为它丢失了跟踪哪个机器代码对应于哪个确切线但是在面对跟踪问题时没有任何安慰。通过一些实验(例如删除-1),我能够证实我怀疑第81行导致问题(除非我完全偏离轨道):
for (int x = bitmap.width() - 1; x > inner_min; --x) {
我的第二个问题是它说(X - c) <= X
总是如此。根据我的实验,它似乎是在谈论第81行的比较,但我不知道它是如何得出这个结论的。
GCC在这里做什么以及解决它的正确方法是什么?我不想将int更改为unsigned int,以避免未定义的签名溢出行为,以便解决问题。
来自GCC手册-Wstrict-overflow = 1:
警告有疑问且容易避免的案件。对于 例如:x + 1&gt; X;使用-fstrict-overflow,编译器将简化 这个为-Wstrict-overflow的级别由-Wall启用;更高 等级不是,必须明确要求。
我还认为这种情况不符合“容易避免”的标准;如果我错了,请纠正我。
答案 0 :(得分:-2)
来自gcc的这一行:
ui/gfx/image/image_util.cc:50:6: error: ...
表示问题出在文件image_util.cc,第50行,第6列
中如果&#39; 50:6&#39;是函数名的第一个字符,只有几个可能性。
1) the function declaration (not something deep in the body) has a problem
(suggest checking the parameters and comparing to the function prototype)
2) the prior line of the source code contains the problem.
如果这只是列出的一系列问题之一,那么
修复列出的第一个问题,重新编译,重复直到没有列出问题
因为C编译器在问题的实际根位于指示的行之前或之前时会发出大量警告/错误