在C11中使用_Noreturn

时间:2012-12-03 20:44:22

标签: c c11

  

可能重复:
  What is the point of the Noreturn attribute?

C11引入了_Noreturn属性,表明函数永远不会返回。

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

3 个答案:

答案 0 :(得分:19)

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

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

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

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

答案 1 :(得分:6)

__attribute__((noreturn))_Noreturndie()等函数非常有用:

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");
}

并且还用于所述的优化。

答案 2 :(得分:0)

它允许编译器进行其他优化。在GCC的noreturn属性中查看here,它现在支持它一段时间(语义可能是相同的)