使用GCC 5.2.0构建Chromium: - strict-overflow=1警告

Building Chromium with GCC 5.2.0: -Wstrict-overflow=1 warning

本文关键字:strict-overflow 警告 Chromium GCC 构建 使用      更新时间:2023-10-16

我正在尝试用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_util.cc 50 #

我对这个警告的第一个问题是,它将您指向问题所在的函数,并使您去寻找问题。我知道这个警告很可能是在优化器失去了哪一行对应哪一段机器码的跟踪之后很久才在它内部的某个地方生成的,但是当面对跟踪问题时,这并不能给它带来任何安慰。通过一些实验(例如,删除-1),我能够验证我的怀疑,即第81行是导致问题的原因(除非我完全偏离轨道):

for (int x = bitmap.width() - 1; x > inner_min; --x) {

我的第二个问题是它说(X - c) <= X总是正确的。根据我的实验,它似乎在谈论第81行的比较,但我不明白它是如何得出这个结论的。

GCC在这里做什么?修复它的正确方法是什么?我不想为了避免未定义的有符号溢出行为而把整型改成无符号整型。

From GCC Manual -Wstrict-overflow=1:

对可疑且容易避免的情况进行警告。为示例:x + 1> x;使用- strict-overflow,编译器将简化这个是1。此级别的- strict-overflow由-Wall启用;更高的级别不是,必须明确请求。

我还认为这种情况不符合"容易避免"的标准;

这一行来自gcc:

ui/gfx/image/image_util.cc:50:6: error: ...

表示问题在文件image_util中。Cc,第50行,第6列

如果'50:6'是函数名的第一个字符,那么只有几种可能。

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编译器倾向于在问题的实际根源在

所指示的行或行之前发出大量警告/错误。