非空函数中的空返回,是未定义的行为吗? [英] Empty return in non-void function, is undefined behaviour?

查看:16
本文介绍了非空函数中的空返回,是未定义的行为吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在阅读了有关控制到达非空函数末尾这一主题的答案后,我没有看到任何答案特别提到使用空return语句退出非空函数的情况:

int return_integer() { return; }  // empty return in non-void function

到目前为止,我在C standard中找到的是:

6.8.6.4返回语句

约束

  1. 带表达式的return语句不应出现在返回类型为void的函数中。不带表达式的return语句只能出现在返回类型为void的函数中。

标准引号说明我们应该处理void和非void函数的return语句,当我们忽略约束时会发生什么,文档的其他部分提到了:

6.9.1函数定义

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆