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

时间:2016-10-07 09:34:41

标签: c standards

在阅读关于控制主题的答案到达非空函数的结尾之后,我没有看到任何答案,具体说明了使用空{退出非空函数的情况{1}}陈述:

return

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

  

6.8.6.4返回声明

     

约束

     
      
  1. 带有表达式的int return_integer() { return; } // empty return in non-void function 语句不应出现在返回类型为return的函数中。没有表达式的void语句只能出现在返回类型为return的函数中。
  2.   

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

  

6.9.1函数定义

     
      
  1. 如果到达了终止函数的void,并且调用者使用了函数调用的值,则行为未定义。
  2.   

之前的标准引用声明,如果我们使用函数的返回值,并且在到达结束花括号(})之后结束,则会发生UB,所以我们在下面的代码中有UB:

}

int UB(int x) { if (x) return x; } printf("%d", UB(1)); // Correct printf("%d", UB(0)); // Undefined behavior 调用中,函数通过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 不符合导致UB的UB(1)要求,因为该功能在没有到达§6.9.1/12 的情况下结束不回报任何价值。

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

1 个答案:

答案 0 :(得分:3)

int UB(int x) { if (x) return; } 

这甚至不是未定义的行为,它是约束违规。引用的文字

  

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

来自6.8.6.4的

是规范性的,这意味着不允许编译器在没有给出诊断消息的情况下让它滑动。如果在没有给出诊断的情况下进行编译,则编译器不是符合标准的实现(不符合语言标准)。

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

现在,如果编译器确实产生了二进制可执行文件,即使代码具有约束违规,所有的投注都会被关闭。它不再是C程序,而是一些非标准程序,没有任何语言标准的保证行为。