gpt4 book ai didi

c - 将变量初始化为它自己的未定义值

转载 作者:太空狗 更新时间:2023-10-29 16:27:10 24 4
gpt4 key购买 nike

在 C 中,将变量初始化为它自己的值是否有意义?如果是,为什么?

请允许我详细说明。在 Git 源代码中有一些将变量初始化为它自己的未定义值的示例,如 transport.c 中所示。或 wt-status.c .我从这些声明中删除了分配并运行测试。看到没有回归,我认为这些分配是多余的。

另一方面,我用 GCC 4.6 和 Clang 2.9 做了一些简单的测试。

#include <stdio.h>
int main() {
printf("print to increase probability of registers being non-zero\n");
int status = status;
return printf("%i\n", status);
}

使用 -Wall -std=c99 和各种 -O 级别进行编译不会打印任何警告并显示 status == 0。具有非零优化级别的 Clang 会打印一些垃圾值。这让我推断此类表达式的结果是未定义的。

我可以想象这样的赋值可以抑制未初始化的变量警告,但从 Git 中获取的示例并非如此。删除分配不会引入任何警告。

这样的分配是未定义的行为吗?如果不是,你用它们做什么?


我已经在 Git 邮件列表上提出了更改建议。 Here's what I've learned .

最佳答案

之所以编译,是因为标准 C99 §6.2.1/7 说:

Any identifier that is not a structure, union, or enumeration tag "has scope that begins just after the completion of its declarator." The declarator is followed by the initializer.

但是,status 的值是Indeterminate。你不能指望它被初始化为有意义的东西。

它是如何工作的?
int status 为变量创建一个空间存在于堆栈(本地存储)上,然后进一步读取以执行 status = status, status可能会初始化为堆栈帧中存在的任何值。

如何防止这种自初始化?
gcc 提供了一个特定的设置来检测自初始化并将它们报告为错误:

-Werror=uninitialized -Winit-self

为什么在这段代码中使用它?
我认为在上述代码中使用它的唯一原因是抑制 ex 的未使用变量警告:在 transport.c 中,如果控件永远不会进入 while 循环,然后在该控制流中 cmp 将未被使用,编译器必须为其生成警告。 wt-status.c

中的 status 变量似乎是相同的情况

关于c - 将变量初始化为它自己的未定义值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8284309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com