gpt4 book ai didi

c - 为什么 "noreturn"函数返回?

转载 作者:太空狗 更新时间:2023-10-29 16:16:07 25 4
gpt4 key购买 nike

我读了this关于 noreturn 属性的问题,该属性用于不返回给调用者的函数。

然后我用C写了一个程序。

#include <stdio.h>
#include <stdnoreturn.h>

noreturn void func()
{
printf("noreturn func\n");
}

int main()
{
func();
}

并使用 this 生成代码汇编:

.LC0:
.string "func"
func:
pushq %rbp
movq %rsp, %rbp
movl $.LC0, %edi
call puts
nop
popq %rbp
ret // ==> Here function return value.
main:
pushq %rbp
movq %rsp, %rbp
movl $0, %eax
call func

为什么函数 func() 在提供 noreturn 属性后返回?

最佳答案

C 中的函数说明符是对编译器的提示,接受程度由实现定义。

首先,_Noreturn函数说明符(或 noreturn,使用 <stdnoreturn.h>)是对编译器的提示,理论上 promise 程序员做出此函数永远不会返回。基于这个 promise ,编译器可以做出某些决定,对代码生成进行一些优化。

IIRC,如果用 noreturn 指定的函数函数说明符最终返回给它的调用者,或者

  • 通过使用和显式 return声明
  • 到达函数体的末尾

behaviour is undefined .您不得从该函数返回。

为了清楚起见,使用 noreturn函数说明符不停止函数形式返回给它的调用者。这是程序员向编译器做出的 promise ,允许它有更大的自由度来生成优化的代码。

现在,万一你早晚做出了 promise ,选择违背这个,结果就是UB。鼓励但不要求编译器在出现 _Noreturn 时发出警告。函数似乎能够返回其调用者。

根据章节 §6.7.4,C11 , 第 8 段

A function declared with a _Noreturn function specifier shall not return to its caller.

还有第 12 段,(注意评论!!)

EXAMPLE 2
_Noreturn void f () {
abort(); // ok
}
_Noreturn void g (int i) { // causes undefined behavior if i <= 0
if (i > 0) abort();
}

对于 C++ ,行为非常相似。引自第 §7.6.4 章,C++14 , 第 2 段(强调我的)

If a function f is called where f was previously declared with the noreturn attribute and f eventually returns, the behavior is undefined. [ Note: The function may terminate by throwing an exception. —end note ]

[ Note: Implementations are encouraged to issue a warning if a function marked [[noreturn]] might return. —end note ]

3 [ Example:

[[ noreturn ]] void f() {
throw "error"; // OK
}
[[ noreturn ]] void q(int i) { // behavior is undefined if called with an argument <= 0
if (i > 0)
throw "positive";
}

—end example ]

关于c - 为什么 "noreturn"函数返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45981545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com