c++ - 有人可以向我解释这是未定义的行为吗?

标签 c++ g++ undefined-behavior compiler-bug

我有一个用 -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/

相关文章:

C++:调用运算符和调用它的实现之间有区别吗

c++ - C++ 中的指针比较是未定义或未指定的行为吗?

c++ - OpenGL 使用 Visual Studio 2010 打开网格 (.m) 文件

c++ - union 可以包含具有用户定义构造函数的类的对象吗?

c++ - OpenCV程序中出现"xxx does not named a type"错误

c++ - 如何找到 "using namespace std"的违规用法?

c++ - 一个像素一个像素的 3d 图形程序 [通过拖动窗口更快地绘图]

c++ - 有符号字节和奇偶校验字节的区别

c++ - Eclipse C++ : "Program "g+ +"not found in PATH"

c - union 内存分配不足