查看以下代码:
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
循环,因此;无效返回";无法执行。然而,许多(大多数)编译器不会将此作为不发出警告的理由。(当您有覆盖所有可能性的if
和else if
块,但仍然省略了"终端"else
块时,也会出现类似的情况。
如何修复此警告
只需在函数末尾添加一条return 42;
语句(整数文本的值可以是任何您喜欢的值)。
作为兴趣点;clang cl";代码分析工具给出了两个警告:一个是for
循环从未运行过其第一次迭代,另一个是关于控制到达非void函数的末尾(如GCC警告):
警告:非void函数不会在所有控件中返回值paths[-Wresturn-type]警告:循环最多运行一次(循环增量从未执行)[-Wunrachable代码循环增量]
这些都是你必须学会接受的东西:编译器不能总是可靠地预测所有可能的结果,即使人类读者可以看到真正发生的事情。