'noreturn'功能确实会回归

时间:2013-04-12 06:05:47

标签: c gcc compiler-errors warnings compiler-warnings

当我编译下面的C程序时,我收到此警告: ‘noreturn’ function does return。这是功能:

void hello(void){
  int i;
  i=1;
 }

为什么会发生这种情况? 对此函数的所有调用都是hello();

编辑: 完整的错误输出:

 home.c: In function ‘hello’:
 hhme.c:838:7: error: variable ‘i’ set but not used [-Werror=unused-but-set-variable]
 home.c:840:1: error: ‘noreturn’ function does return [-Werror]
 cc1: all warnings being treated as errors
 make: *** [home.o] Error 1

2 个答案:

答案 0 :(得分:26)

可以告诉gcc特定函数永远不会返回。这允许某些优化,并有助于避免未初始化变量的虚假警告。

这是使用noreturn attribute

完成的
void func() __attribute__ ((noreturn));

如果函数确实返回noreturn属性,则编译器会发出您正在看到的警告(在您的情况下会转换为错误)。

由于您不太可能在代码中使用noreturn,可能的解释是您有一个名称与标准noreturn函数冲突的函数,如下例所示:

#include <stdlib.h>

void exit(int) {
}                // warning: 'noreturn' function does return [enabled by default]

在这里,我的exitexit(3)冲突。

此类冲突的另一个显而易见的候选人是abort(3)

当然,如果你的函数实际上被称为hello(),那么罪魁祸首几乎肯定在你的代码库中。

答案 1 :(得分:4)

最有可能的是,该功能标有__attribute__((noreturn))。然而,它实际上确实返回(当控制到达irs体的末端时,因为它不进入无限循环,它不会调用其他“noreturn”函数等。)

我没有看到你的观点1.将函数标记为不返回,2。编写一个什么都不做的函数 - 可能你可以直接消除它们?