我有一个用 -O2 编译的简单程序。
编译器版本 : g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
#include <cstdlib>
constexpr size_t NUM_ELEMENTS = 10000;
void init(float *a) {
a[0] = 42;
size_t i;
for (i = 1; i < NUM_ELEMENTS - 2; i += 3) {
a[i] = a[i+1] = a[i+2] = 42;
}
while (i < NUM_ELEMENTS) {
a[i] = 42;
i++;
}
}
int main() {
float a[NUM_ELEMENTS];
init(a);
return 0;
}
而 g++ 给了我这个(对我来说莫名其妙)警告foo.cpp: In function ‘void init(float*)’:
foo.cpp:14:12: warning: iteration 4611686018427387903 invokes undefined behavior [-Waggressive-loop-optimizations]
14 | a[i] = 42;
| ^
foo.cpp:13:14: note: within this loop
13 | while (i < NUM_ELEMENTS) {
| ~~^~~~~~~~~~~~~~
如果我用等效的 for (; i < NUM_ELEMENTS; i++)
更改 while警告消失。如果我将数组更改为 global 并且我只是在 randomize 中访问它而不将它作为参数传递,警告就会消失。我已经阅读了我理解的类似 SO 问题,但这让我感到困惑。如果我不得不猜测,我会说 g++ 知道 while 循环永远不会运行(因为 i == 10000 在第一个循环结束时)并且它进行了某种导致此警告的激进转换?帮助!
最佳答案
这似乎是 a known bug 的拷贝在 gcc 中与 -Waggressive-loop-optimizations
有关.但是鉴于您的示例比我在 duplicates 中看到的示例要简单得多关于该错误,我建议您将示例报告给已确认的错误报告(请参阅链接)。
有趣的是,这个问题似乎只存在于 -O2
,不适用于 -O1
和 -O3
在现有报告中。
关于c++ - 有人可以向我解释这是未定义的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68899625/