答案 0 :(得分:19)
如果函数无条件地调用_Noreturn
函数,编译器将能够理解:
最重要的是,知道来自函数的正常流量被中断后,它将能够避免关于丢失返回值,未初始化变量等的虚假警告。
这对于静态代码分析器尤其重要 - 一旦我们标记了die
函数(记录致命错误并终止应用程序),CLang静态分析器在我们的大型应用程序中给出的误报数量大大减少了为noreturn
。
可能还有一些其他优化可用 - 因为函数永远不会返回,所以不需要在堆栈上推送返回地址,保存寄存器的状态等等,所需要的只是传递参数并执行jmp
到函数的开头,不用担心返回和返回后的清理。但是当然,由于这个电话是一次性的,所以在这里挤压的表现几乎可以忽略不计。
答案 1 :(得分: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");
}
并且还用于所述的优化。
答案 2 :(得分:0)
它允许编译器进行其他优化。在GCC的noreturn
属性中查看here,它现在支持它一段时间(语义可能是相同的)