【发布时间】:2021-11-18 20:18:57
【问题描述】:
最近我遇到了一个问题,我的程序中的一个线程以某种方式停止(GDB 指示线程的状态为 STOPPED)。我花了几天时间调试。几天前我更改了编译器的版本后发生了这个问题。最后我发现问题的发生是因为一个函数是用int 返回类型定义的,但没有return 语句。所以函数的asm代码没有ret指令。当它在运行时到达函数的末尾时,由于不存在ret 指令,因此继续执行另一个函数中的下一条指令。这会导致线程被停止。我查过之前版本编译器生成的asm代码,同样的函数确实有ret指令。
根据我的经验,不建议在具有非 void 返回类型的函数中缺少 return 语句,但不应导致提前停止。我想知道是我错了,还是编译器错了。
我的问题是,对于具有非 void 返回类型的正常结束(非异常、调用、jmp...)函数,编译器是否有义务生成 ret 指令。它是否有任何 C++ 标准或 C++ 规范说明这种情况下的编译器行为?
我进行了一些搜索,并在 this 中找到了 c# 的答案。 C++ 怎么样?
【问题讨论】:
-
一般来说,该标准并没有规定具体的 asm 指令。它只定义行为。
-
@HolyBlackCat 或者在这种情况下没有定义行为