举一个最小的例子:
#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++
version10.3.1
和clang++
version之间是一致的10.0.1
。如果我添加 return 语句或将函数的返回类型更改为void
.
我很好奇:这是一个会被认为是编译器错误的东西吗?或者这是可以接受的,因为缺少 return 语句是未定义的行为,因此我们失去了关于这个函数中发生了什么的所有保证?