首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >_Noreturn在C11中的应用

_Noreturn在C11中的应用
EN

Stack Overflow用户
提问于 2012-12-03 20:44:21
回答 3查看 8.3K关注 0票数 21

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

C11引入了回绝属性,以指示函数永远不会返回。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-03 20:48:54

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

  • 下面的代码是死代码,它允许优化(可以从生成的二进制文件中删除)和诊断-编译器将能够发出“不可访问的代码”警告;
  • 最重要的是,知道来自函数的正常流被中断,它将能够避免关于缺少返回值、未初始化变量等的虚假警告。 这对于静态代码分析器来说尤为重要--当我们将CLang函数(记录致命错误并终止应用程序)标记为noreturn时,我们的大型应用程序中的die静态分析器给出的假阳性数会显著下降。

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

票数 25
EN

Stack Overflow用户

发布于 2012-12-03 21:31:10

__attribute__((noreturn))_Noreturn对于像die()这样的函数很有用。

代码语言:javascript
复制
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");
}

也用于优化,如所述。

票数 6
EN

Stack Overflow用户

发布于 2012-12-03 20:49:55

它允许编译器进行额外的优化。看看这里现在支持的GCC的noreturn属性(语义可能相同)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13691361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档