2015-10-20 61 views
2

好吧,所以这是一个我已经错误的精简版变体。这个错误是我用一个未初始化的变量初始化一个数组。早些时候,我用一个函数来声明使用函数的元素数量,但是在清理之后,我忘记了它,并将所有声明移到了函数的顶部。为什么gcc在这段代码中未初始化数组的大小时会发出警告?

我使用了标志-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

+0

看起来像我的一个bug – user3629249

回答

1

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

+0

你是什么意思?我不清楚;从主中删除f(&n)会导致编译器捕获并警告n未初始化。 – skogshjort

+0

是的,这绝对听起来像一个编译器错误。假设你初始化了'int n = 1; float a [n]; f(&n);''在这种情况下,编译器明确需要在分配VLA之后更新'n',在优化阶段进行一些重构会使其混淆。 – Davislor

相关问题