c++ - 为什么 GCC 在将未初始化的 volatile 指针转换到 `void` 时发出警告?

标签 c++ c gcc warnings language-lawyer

考虑以下内容:

int *volatile x;
(void)x;

GCC(从 5.x 到 7.x)在启用 -Wall 时提示它:

warning: 'x' is used uninitialized in this function [-Wuninitialized]

clang 对此保持沉默。

出于某种原因,删除 volatile 会消除警告。

标准是否表示​​将 volatile 指针转换为 void 是未定义的,而转换普通指针就可以了?或者这是一个 GCC 错误?


免责声明:问题被故意标记为 C/C++。 GCC 对这两种语言给出了相同的警告,我很想知道它们之间有什么区别。

最佳答案

对于像 int * 这样的普通旧数据类型,volatile 的行为之一是防止编译器优化读取和写入变量。请注意,这里的 int * 可以是 floatint 之类的任何东西。

因此 (void)x 的意思是“读取 x 并且不对结果执行任何操作”,因为 xvolatile。如果您读取 x 并且它没有固定到内存中的固定位置(编译器可能不知道,只有链接器知道),那么您实际上是在使用它未初始化 .

如果它不是易变的,尽管编译器可能会读取 x,它可能会避免/优化它(因为它是一个空操作),并使警告静音。

clang 在这里选择了安全的道路,并且由于链接器指令可以将变量 x 固定到某个位置(clang 不知道它),认为在没有更多证据的情况下触发警告是不值得的。

关于c++ - 为什么 GCC 在将未初始化的 volatile 指针转换到 `void` 时发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42233379/

相关文章:

c++ - 通过将文本文件发送到标准输入来自动测试 Visual Studio 中的 C++ 控制台应用程序?

.net - 如何在 .Net (C IDE) 中使用 C 语言

c - 为什么我的代码中的 fork() 函数没有创建子进程?

c - C 中泛型函数与函数指针数组相比有何缺点?

c++ - NAN 差异 - std::nan 与 quiet_NaN() 与宏 NAN

c++ - C++ 中的分层枚举

c++ - 有什么简单的方法可以在 C/C++ 的 Linux 下获取夏令时转换时间

iphone - Objective C 方法和语法

c - 当将类型化指针传递给接收 void ** 的函数时,GCC 会发出警告

c++ - 我怎样才能让 C++0x 和 __STRICT_ANSI__ 相处融洽?