【发布时间】:2021-08-29 23:51:49
【问题描述】:
所以,我尝试了一些事情,并决定有意从应该返回 int 的函数中删除 return 语句。
我的猜测是,函数会返回一个垃圾值,程序会正常终止。
但是,程序陷入了无限循环。这是一个错误吗?还是我错过了什么?
我使用的编译器是 G++,GCC 版本 9.3.0,带有 GNU-G++-17 和 GNU-G++-14
#pragma GCC optimize("O1")
#include <iostream>
int f(int* &a)
{
std::cout << *a;
// return 0;
}
void solve()
{
int *p = new int{7};
f(p);
delete p;
}
int main()
{
solve();
}
编译器输出
777777777777777777777777777777777...(until it crashes...)
上述代码的 ideone 链接:https://ideone.com/j9m24N
PS:- O1、O2、O3、Ofast 的编译指示会发生这种情况,但O0 不会发生这种情况
我知道我们应该提供一个 return 语句,但我有兴趣知道我们得到这个输出的原因。
【问题讨论】:
-
为什么问题在未定义行为的情况下毫无意义。 “这是虫子吗?”是的,这是程序中的一个错误。
-
尽管有 UB,但 GCC 如何选择优化它仍然很有趣。如果您在
switch-case语句中不使用break;,但在此处的两个函数之间,它基本上会产生相同的问题。虽然不是特别有用,因为 UB 仍然很有趣 -
@Lala5th 没有
return,没有asmret命令,f落入solve得到无限递归。 -
这似乎在
clang中处理得更好,而不是不编译(如 msvc),或者优化不产生返回(就像你在 gcc 中看到的那样,仍然不知道为什么只虽然打开了优化),它会生成ud2(undefined instruction),因此程序不会失败。 -
@S.M.奇怪的是,它只通过优化来做到这一点。不确定这是有意的还是只是优化器之间的一些奇怪的游戏以及在 gcc 中如何处理
void返回函数中的隐式返回语句