在C11中使用_Noreturn

use*_*770 17 c c11

可能重复:
Noreturn属性的重点是什么?

C11引入了_Noreturn属性来指示函数永远不会返回.

除了源代码中的文档值之外,该属性还提供了哪些其他好处,以及为什么要使用它?

Mat*_*lia 22

如果函数无条件地调用_Noreturn函数,编译器将能够理解:

  • 接下来的代码是死代码,它允许优化(可以从生成的二进制文件中删除)和诊断 - 编译器将能够发出"不可访问的代码"警告;
  • 最重要的是,知道来自函数的正常流量被中断,它将能够避免关于丢失返回值,未初始化变量等的虚假警告.

    这对于静态代码分析器尤其重要 - 一旦我们标记了我们的die函数(记录致命错误并终止应用程序),CLang静态分析器在我们的大型应用程序中给出的误报数量就会大大减少noreturn.

可能还有一些其他优化可用 - 因为函数永远不会返回,所以不需要在堆栈上推送返回地址,保存寄存器的状态等等,所需要的只是传递参数并执行a a jmpstart功能,无需担心退货和退货后清理.但是,当然,由于电话是一次性的,因此在这里挤压的表现几乎可以忽略不计.

  • @ user666412:这就是我所说的,运行时方面几乎可以忽略不计.重点是帮助编译器进行代码流分析,从而产生更好的警告; 例如:在我们的应用程序中,有一个`die`函数可以杀死应用程序记录出错的地方; 如果没有将它标记为"noreturn",我们就会发现一些关于丢失`return`s,未初始化变量等的虚假警告 - 一旦编译器理解'die`永不返回,所有这些东西都会消失. (2认同)

小智 6

__attribute__((noreturn))_Noreturn对以下功能有用die():

static __attribute__((noreturn)) void die(const char *fmt, ...) {
     /* print a formatted error message and exit  */
     exit(EXIT_FAILURE);
}
/* And let's say in main() you would want to exit because of an error but unforunately GCC complains about return value.  */
int main() 
{
    if (!whatever)
         die("a nasty error message goes here\n");
}
Run Code Online (Sandbox Code Playgroud)

并且还用于所述的优化.