You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:07:06