C++:如果缺少函数 return 语句,for 循环被优化为无限循环 - 编译器错误?

C++: for-loop is optimized into endless loop if function return statement is missing - compiler bug?

举下面的最小例子:

#include <stdio.h>

bool test(){
    for (int i = 0; i < 1024; i++)
    {
        printf("i=%d\n", i);
    }
}
int main(){
    test();
    return 0;
}

test 函数中的 return 语句缺失。如果我 运行 示例如下:

g++  main.cpp -o main && ./main

然后循环在 1024 次迭代后中止。但是,如果我 运行 打开优化的示例:

g++  -O3 main.cpp -o main && ./main

然后这是优化,我得到一个无限循环。

此行为在 g++ 版本 10.3.1clang++ 版本 10.0.1 中是一致的。如果我添加 return 语句或将函数的 return 类型更改为 void.

,则不会发生无限循环

我很好奇:这会被认为是编译器错误吗?或者这是可以接受的,因为缺少 return 语句是未定义的行为,因此我们失去了 all 对这个函数中发生的事情的保证?

您的函数声明为 bool test(),但您的定义从未 returns 任何内容。这意味着您已经违反了与该语言的合同,并且在未定义的行为领域被暂停了。在那里,所有结果都是“正确的”。

您可以将未定义的行为视为:未定义编译器在被要求编译您的代码时产生的输出。

实际上,“未定义”指的是编译器根据您的代码创建的程序的可观察行为,但归结起来是一样的。

这不是编译器错误。

您要求编译器从一个函数 return 一个 bool 而没有从该函数 return 一个 bool。编译器根本无法做到这一点,这不是编译器的错。