是否必须对退出函数进行noreturn属性?

PSk*_*cik 12 c language-lawyer c11

noreturn永不归还函数的属性是否必要,或者这只是一个(可能是不成熟的? - 至少对于退出,我无法想象为什么要优化)优化?

向我解释说,在诸如此类的背景下

void myexit(int s) _Noreturn {
   exit(s);
}
// ...
if (!p) { myexit(1); } 
f(*p);
/// ...
Run Code Online (Sandbox Code Playgroud)

noreturn防止!p分支被优化.但是编译器是否真的允许优化该分支?我意识到优化它的基本原理是:"未定义的行为不会发生.如果p== NULL,则解除引用它是UB,因此p永远不会NULL在此上下文中,因此!p分支不会触发".但是编译器不能通过假设myexit可能是一个不返回的函数来解决问题(即使它没有明确标记为这样)?

Jen*_*edt 7

这允许进行多次优化.首先,对于调用本身,这可以允许简化的设置,不是所有寄存器都必须保存,jmp可以使用指令代替call或类似.然后调用后的代码也可以优化,因为没有分支回到正常流程.

所以是的,通常_Noreturn是编译器的有价值的信息.

但作为对您问题的直接回答,不,这是优化的属性,因此没有必要.

  • 谢谢,但这并不能回答这个问题. (2认同)