C语言中调用无返回语句的int型空函数并使用返回值是否为UB?
关于C函数无返回值却被调用作为条件的未定义行为分析
问题代码
#include <stdio.h> static int foo(){} int main(){ if (foo()) { printf("OK\n"); } return 0; }
问题描述
我对此并不确定,且尚未在*ISO/IEC 9899:1999 (E)*标准中找到相关解释,可能是我有所遗漏。那么此处的if(foo())是否属于未定义行为(UB)?
我使用gcc7.3 aarch64-linux环境进行了测试:
-O0:输出OK-O1至-O3:无输出
解答
这确实属于未定义行为。根据C99标准(ISO/IEC 9899:1999)6.9.1节第12条的明确规定:
如果函数的返回类型不是
void,那么其执行路径到达函数末尾时必须通过return语句返回一个值;否则,调用者使用该函数返回值的行为是未定义的。
你观察到不同优化等级下的不同输出,正是未定义行为的典型表现:
-O0模式下,编译器未做深度优化,可能会将栈上的随机残留值作为foo的返回值,恰好这个值非0,所以进入if分支输出OK;- 开启
-O1及以上优化后,编译器会分析到foo没有有效返回值,进而直接优化掉整个if分支,导致无输出。
内容的提问来源于stack exchange,提问作者wby
相关产品推荐
相关产品推荐

