C++ 编译器是否有义务为没有 'return' 语句的函数生成 'ret' 指令?
Is C++ compiler obligated to generate 'ret' instruction for a function without 'return' statement?
最近我遇到了一个问题,我的程序中的一个线程不知何故停止了(GDB 指示线程的状态为 STOPPED)。我花了几天时间调试。几天前我更改了编译器的版本后发生了这个问题。最后我发现问题的发生是因为函数定义为 int
return 类型但没有 return
语句。所以函数的asm代码没有ret
指令。当它在运行时到达函数的末尾时,由于不存在 ret
指令,因此继续执行另一个函数中的下一条指令。这会导致线程停止。我查看了以前版本的编译器生成的asm代码,同样的函数确实有一条ret
指令。
根据我的经验,不建议在具有非 void return 类型的函数中缺少 return
语句,但不应导致 thead 停止。我想知道是我错了,还是编译器错了
我的问题是,对于具有非 void return 类型的正常结束(不是由异常、调用、jmp...结束)函数,编译器是否有义务生成 ret
指示与否。它是否有任何 C++ 标准或 C++ 规范说明编译器在这种情况下的行为?
我进行了一些搜索并在 this 中找到了 c# 的答案。 C++ 怎么样?
没有
对于除 main 之外的任何非 void 函数,如果函数中有任何路径不是 return
,如果在运行时采用该路径,您的程序将表现出未定义的行为。然后允许编译器做任何它想做的事情。通常这会导致缺少 ret 语句,但我看到了很多更奇怪的效果。
标准在 [stmt.return].2:
中对此进行了规定
[..] Flowing off the end of a constructor, a destructor, or a
non-coroutine function with a cv void return type is equivalent to a
return with no operand. Otherwise, flowing off the end of a function
other than main (6.9.3.1) or a coroutine (9.5.4) results in undefined
behavior.
(强调)
最近我遇到了一个问题,我的程序中的一个线程不知何故停止了(GDB 指示线程的状态为 STOPPED)。我花了几天时间调试。几天前我更改了编译器的版本后发生了这个问题。最后我发现问题的发生是因为函数定义为 int
return 类型但没有 return
语句。所以函数的asm代码没有ret
指令。当它在运行时到达函数的末尾时,由于不存在 ret
指令,因此继续执行另一个函数中的下一条指令。这会导致线程停止。我查看了以前版本的编译器生成的asm代码,同样的函数确实有一条ret
指令。
根据我的经验,不建议在具有非 void return 类型的函数中缺少 return
语句,但不应导致 thead 停止。我想知道是我错了,还是编译器错了
我的问题是,对于具有非 void return 类型的正常结束(不是由异常、调用、jmp...结束)函数,编译器是否有义务生成 ret
指示与否。它是否有任何 C++ 标准或 C++ 规范说明编译器在这种情况下的行为?
我进行了一些搜索并在 this 中找到了 c# 的答案。 C++ 怎么样?
没有
对于除 main 之外的任何非 void 函数,如果函数中有任何路径不是 return
,如果在运行时采用该路径,您的程序将表现出未定义的行为。然后允许编译器做任何它想做的事情。通常这会导致缺少 ret 语句,但我看到了很多更奇怪的效果。
标准在 [stmt.return].2:
中对此进行了规定[..] Flowing off the end of a constructor, a destructor, or a non-coroutine function with a cv void return type is equivalent to a return with no operand. Otherwise, flowing off the end of a function other than main (6.9.3.1) or a coroutine (9.5.4) results in undefined behavior.
(强调)