3

举一个最小的例子:

#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.1clang++version之间是一致的10.0.1。如果我添加 return 语句或将函数的返回类型更改为void.

我很好奇:这是一个会被认为是编译器错误的东西吗?或者这是可以接受的,因为缺少 return 语句是未定义的行为,因此我们失去了关于这个函数中发生了什么的所有保证?

4

2 回答 2

8

您的函数被声明为bool test(),但您的定义永远不会返回任何内容。这意味着您已经违反了该语言的合同,并且已经在未定义的行为领域中处于超时状态。在那里,所有结果都是“正确的”。

于 2021-07-30T12:48:57.603 回答
1

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

实际上,“未定义”是指编译器从您的代码创建的程序的可观察行为,但归结为相同。

这不是编译器错误。

您要求编译器从函数中返回 a 而不是从bool函数中返回 a bool。编译器根本不可能做到这一点,这不是编译器的错。

于 2021-07-30T12:51:42.253 回答