简单 for 循环 (GCC) 中的"warning: control reaches end of non-void function"



查看以下代码:

int foo(void) {
for (int i = 0; i != 1; i = 1) {
return i;
}
}

带有-Wall -Wextra -pedantic -std=c99的GCC 10.2发出以下警告:

warning: control reaches end of non-void function [-Wreturn-type]

如果我没有遗漏什么,那么foo显然终止了——它将始终返回0。

如何修复此警告?我不能使用GCC诊断杂注,因为上面的for循环实际上是由宏生成的,该宏必须是语句前缀,所以我不能只在用户提供的语句之后使用_Pragma("GCC diagnostic pop")(上例中为{ return i; })。

Godbolt

您的假设是正确的,即您所展示的函数中的代码永远不会超出for循环,因此;无效返回";无法执行。然而,许多(大多数)编译器不会将此作为不发出警告的理由。(当您有覆盖所有可能性的ifelse if块,但仍然省略了"终端"else块时,也会出现类似的情况。

如何修复此警告

只需在函数末尾添加一条return 42;语句(整数文本的值可以是任何您喜欢的值)。

作为兴趣点;clang cl";代码分析工具给出了两个警告:一个是for循环从未运行过其第一次迭代,另一个是关于控制到达非void函数的末尾(如GCC警告):

警告:非void函数不会在所有控件中返回值paths[-Wresturn-type]警告:循环最多运行一次(循环增量从未执行)[-Wunrachable代码循环增量]

这些都是你必须学会接受的东西:编译器不能总是可靠地预测所有可能的结果,即使人类读者可以看到真正发生的事情。

相关内容

最新更新