非void函数中的空返回,是未定义的行为?

Pap*_*ter 9 c standards

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

int return_integer() { return; }  // empty return in non-void function
Run Code Online (Sandbox Code Playgroud)

到目前为止我在C标准中发现的是:

6.8.6.4退货声明

约束

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

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

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
Run Code Online (Sandbox Code Playgroud)

UB(1)调用中函数1通过下面的return x;指令返回if (x); 在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
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,调用UB(1)不符合§6.9.1/12导致UB 的要求,因为函数在没有到达的情况下}结束,也没有返回任何值.

这种情况描述了C标准的哪一部分?

Lun*_*din 5

int UB(int x) { if (x) return; } 
Run Code Online (Sandbox Code Playgroud)

这甚至不是未定义的行为,而是违反约束。引用的文本

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

6.8.6.4 中的内容是规范性的,这意味着编译器不允许在不给出诊断消息的情况下让它溜走。如果编译时没有给出诊断,则编译器不是合格的实现(不遵循语言标准)。

用简单的英语来说,这意味着:该代码甚至不应该编译。

现在,如果编译器确实生成了二进制可执行文件,即使代码违反了约束,那么所有的赌注都将落空。它不再是一个 C 程序,而是某种非标准程序,任何语言标准都无法保证其行为。