【发布时间】:2017-05-15 13:19:25
【问题描述】:
在阅读this的时候看到了一个不明白的UB,希望你能澄清一下
size_t f(int x)
{
size_t a;
if(x) // either x nonzero or UB
a = 42;
return a;
}
我猜 UB 是由于 a 没有初始化值,但这不是定义的行为吗?意思是,f(0) 将返回变量a 保存的值,无论它是什么(我认为这类似于rand())。我们必须知道代码 sn-p 返回什么值才能使代码具有良好定义的行为?
【问题讨论】:
-
rand()的返回值是基于srand()定义的。您将无法知道a是什么,因此未定义 -
除了 Sourav 的回答:不要忘记编译器可以假设任何它想要的东西。而且它不会/不可能发生。在您的示例中,编译器可能会决定 UB 不可能发生,然后
x将始终为非零。您可能会将其解读为:如果x是0,那么我可以做任何我想做的事情,然后我的行为就像它是非零的并且(如在您的链接示例中)总是返回 42 (或格式化您的硬盘驱动器,如果生成代码稍微快一点...) -
Undefined 与 random 不同。
-
@ErikW "...因为它基于 srand()"?这完全无关紧要。
-
@ErikW 这是不正确的。
rand自己定义了行为;无需使用srand。
标签: c initialization undefined-behavior