【问题标题】:‘noreturn’ function does return‘noreturn’ 函数确实返回
【发布时间】:2013-04-04 13:25:25
【问题描述】:

当我编译下面的 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

【问题讨论】:

  • 能否请您创建一个SSCCE 并向我们展示一个完整的示例?还请包括allcomplete 错误/警告消息。
  • 你用的是什么编译器?您使用了哪些编译器选项?

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


【解决方案1】:

可以告诉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(),那么罪魁祸首几乎肯定在你的代码库中。

【讨论】:

    【解决方案2】:

    很可能,该函数标有__attribute__((noreturn))。但是,它确实返回了(当控制到达irs body的末尾时,由于它没有进入无限循环,所以它没有调用其他“noreturn”函数等)

    我不明白你的意思是 1. 将函数标记为不返回,2. 编写一个什么都不做的函数 - 也许你可以同时消除两者?

    【讨论】:

    • 澄清这个答案:对于具有 __attribute__((noreturn)) 的函数,如果函数体没有以无限循环结束,或者对另一个 noreturn 函数的调用,您会收到此警告。换句话说,编译器进行“流分析”,可以确定函数是否真的可能返回。请记住,右大括号有一个隐式返回。
    • @bootchk,“无限循环”+1。 f() { } 生成警告/错误。 f() { while(1); } 没问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多