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.1
和 clang++
版本 10.0.1
中是一致的。如果我添加 return 语句或将函数的 return 类型更改为 void
.
,则不会发生无限循环
我很好奇:这会被认为是编译器错误吗?或者这是可以接受的,因为缺少 return 语句是未定义的行为,因此我们失去了 all 对这个函数中发生的事情的保证?
您的函数声明为 bool test()
,但您的定义从未 returns 任何内容。这意味着您已经违反了与该语言的合同,并且在未定义的行为领域被暂停了。在那里,所有结果都是“正确的”。
您可以将未定义的行为视为:未定义编译器在被要求编译您的代码时产生的输出。
实际上,“未定义”指的是编译器根据您的代码创建的程序的可观察行为,但归结起来是一样的。
这不是编译器错误。
您要求编译器从一个函数 return 一个 bool
而没有从该函数 return 一个 bool
。编译器根本无法做到这一点,这不是编译器的错。
举下面的最小例子:
#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.1
和 clang++
版本 10.0.1
中是一致的。如果我添加 return 语句或将函数的 return 类型更改为 void
.
我很好奇:这会被认为是编译器错误吗?或者这是可以接受的,因为缺少 return 语句是未定义的行为,因此我们失去了 all 对这个函数中发生的事情的保证?
您的函数声明为 bool test()
,但您的定义从未 returns 任何内容。这意味着您已经违反了与该语言的合同,并且在未定义的行为领域被暂停了。在那里,所有结果都是“正确的”。
您可以将未定义的行为视为:未定义编译器在被要求编译您的代码时产生的输出。
实际上,“未定义”指的是编译器根据您的代码创建的程序的可观察行为,但归结起来是一样的。
这不是编译器错误。
您要求编译器从一个函数 return 一个 bool
而没有从该函数 return 一个 bool
。编译器根本无法做到这一点,这不是编译器的错。