非空函数中的空返回,是未定义的行为吗? [英] Empty return in non-void function, is undefined behaviour?
本文介绍了非空函数中的空返回,是未定义的行为吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在阅读了有关控制到达非空函数末尾这一主题的答案后,我没有看到任何答案特别提到使用空return
语句退出非空函数的情况:
int return_integer() { return; } // empty return in non-void function
到目前为止,我在C standard中找到的是:
6.8.6.4返回语句
约束
- 带表达式的
return
语句不应出现在返回类型为void
的函数中。不带表达式的return
语句只能出现在返回类型为void
的函数中。
标准引号说明我们应该处理void
和非void
函数的return
语句,当我们忽略约束时会发生什么,文档的其他部分提到了:
6.9.1函数定义
- 如果达到了终止函数的
}
,并且调用方使用了函数调用的值,则行为是未定义的。
前面的标准引号指出,如果我们使用到达右花括号(}
)后结束的函数的返回值,则会发生UB,因此我们在以下代码中使用了UB:
int UB(int x) { if (x) return x; }
printf("%d", UB(1)); // Correct
printf("%d", UB(0)); // Undefined behavior
在UB(1)
调用中,函数通过if (x)
下的return x;
指令返回1
;在UB(0)
调用中,没有传递if (x)
条件,所以函数结束时达到}
,此时使用的返回值是UB(但不在UB(1)
中)。但是,在这种情况下会发生什么呢?
int UB(int x) { if (x) return; } // empty return statement
printf("%d", UB(1)); // Undefined behavior?
printf("%d", UB(0)); // Undefined behavior
在上面的代码中,调用UB(1)
不符合通向UB的§6.9.1/12
要求,因为函数在结束时没有到达}
,也没有返回任何值。
在C标准的哪个部分描述了这种情况?
推荐答案
int UB(int x) { if (x) return; }
这甚至不是未定义的行为,而是违反约束。引用文本
不带表达式的RETURN语句只能出现在 返回类型为空的函数
从6.8.6.4开始是规范的,这意味着编译器不允许在没有给出诊断消息的情况下让它出错。如果编译时未给出诊断,则编译器不是符合标准的实现(不遵循语言标准)。
简单地说,这意味着:代码甚至不应该编译。
现在,如果编译器确实生成了一个二进制可执行文件,即使代码违反了约束,那么所有的赌注都将落空。它不再是C程序,而是某种非标准程序,任何语言标准都不能保证它的行为。这篇关于非空函数中的空返回,是未定义的行为吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文