dhe*_*ein 8 c c99 alloca undefined-behavior
C标准禁止转入存在VLA的功能范围.
VLA和对alloca函数的调用应该在低级别上具有相同的结果.
(我可能是错的,因为我只是一个C,而不是一个低级程序员,但在我的想象中,似乎很机智)
那么下面的代码片段也会是未定义的行为吗?
int main()
{
char *p;
goto label1;
{
p = _alloca(1);
label1:
p = NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
当然我不能参考p,但是关于这种行为是什么?
实际上,规则 6.8.6.1 规定:
A goto statement is not allowed to jump past any declarations of objects
with variably modified types.
Run Code Online (Sandbox Code Playgroud)
在您的代码中,不存在具有可变修改类型的对象。alloca并没有声明一个对象(即编译器必须关心的)。因此,alloca在规则 6.8.6.1 的意义上,没有像 的范围,也没有未定义行为的理由。
编辑
稍微详细说明一下答案:在 VLA 的情况下,行为的“未定义”是由于承诺声明对象在其范围内(在语言级别)是“已知的”。通常,声明会为代码执行设置上下文。不需要在运行时执行。然而,在 VLA 的情况下,情况并非如此:这里这个承诺是在运行时部分实现的,打破了 C 的静态声明方法。为避免导致动态类型系统的进一步冲突,规则 6.8.6.1 避免了此类冲突。
相比之下,在语言层面alloca只是一个函数;它的调用不构成任何范围。它只对它的运行时行为做出承诺,以防被调用。如果它没有被调用,我们不会从函数中“期望”任何东西。因此,它的纯粹存在不会引起任何冲突:两种情况(绕过或非绕过)都有明确定义的语义。