【问题标题】:Why doesn't gcc o warn when size of array is uninitialized in this code?为什么在此代码中未初始化数组大小时 gcc o 不发出警告?
【发布时间】:2015-10-20 17:52:28
【问题描述】:

好的,这是我遇到的错误的精简变体。错误是我使用未初始化的变量初始化了一个数组。之前我使用函数来声明元素的数量,但是在清理之后我忘记了它并将所有声明都移到了函数的顶部。

我使用了标志-std=c99 -Wall -Wextra -pedantic -O,并且通常 gcc 在值未初始化之前会发出警告,但在这种特定情况下并没有。所以,我的问题是:

这是gcc 中的一个错误f(&n) 是否有可能以某种奇怪的方式对数组大小进行后初始化?

#include <stdio.h>

void f(int * x) {
  *x = 8;
}


int main(void) {

  int n;
  float a[n]; // Compiler should warn that n may contain garbage

  a[7] = 3.1415;
  printf("%f\n", a[7]);

  f(&n);  // Removing this causes the compiler warn as expected

  return 0;
}

编辑:可能是this gcc bug?

【问题讨论】:

  • 对我来说似乎是个错误

标签: c arrays gcc initialization compiler-warnings


【解决方案1】:

GCC 接受float a[n] 作为可变长度数组。但是,它应该警告您 n 在使用时包含垃圾。也许 VLA 初始化正在以一种使代码生成器不明显的方式重新排列?如果 n 在使用前被初始化,将调用移动到 f() 上面的 a 声明显然是错误的,但是这个程序会产生未定义的行为。

【讨论】:

  • 你是什么意思?我不清楚;从 main 中删除 f(&n) 会导致编译器捕获并警告 n 未初始化。
  • 是的,这听起来绝对像是一个编译器错误。假设你初始化了int n = 1; float a[n]; f(&amp;n);。在这种情况下,编译器显然需要在分配 VLA 后更新n。优化阶段的一些重构会让人感到困惑。
猜你喜欢
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 2013-06-19
相关资源
最近更新 更多