使用GCC 5.2.0构建Chromium: - strict-overflow=1警告
Building Chromium with GCC 5.2.0: -Wstrict-overflow=1 warning
我正在尝试用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编译器倾向于在问题的实际根源在
- 生成质数的程序,错误:"Stack overflow"
- 可以提升 asio 帖子"overflow"队列
- Ctypes: OSError: exception: stack overflow
- Overflow in C++
- 海湾合作委员会 7、aligned_storage 和 "dereferencing type-punned pointer will break strict-aliasing rules"
- C++20 是否为"overflow"的有符号整数很好地定义了左移?
- 使用 CFFI 释放内存时"MemoryError: Stack overflow"是什么意思?
- 尝试运行 NVIDIA FleX 时"buffer overflow detected"
- 如何"Overflow"超出特定范围(如 30 - 100)的值
- JNI 在使用 NewGlobalRef 时"local reference table overflow"
- 在 int 数组的情况下,新表达式可以"overflow"吗?
- c++ std chrono overflow
- boost::posix_time::time_duration overflow?
- 不明白"assuming signed overflow"警告
- /fp:strict 和 /fp:precise 之间的区别
- 正确实现 std::streambuf::overflow
- "recursive on all control paths, function will cause runtime stack overflow"超载<<运算符
- 使用GCC 5.2.0构建Chromium: - strict-overflow=1警告
- c++和strict-overflow的问题
- GCC strict-overflow