为什么clang没有使用未初始化的阵列发出警告?

时间:2015-06-12 04:06:52

标签: c gcc clang

我正在阅读一本书中的一些代码,忘记初始化阵列弹珠。但是我没有得到clang的警告。 这是代码:

/* sum_arr2.c -- 对一个数组的所有元素求和 */
#include<stdio.h>
#define SIZE 10
int sump(int *start,int * end);

int main(void)
{
    int marbles[SIZE];
    long answer;

    answer = sump(marbles,marbles + SIZE);
    printf("The total number of marbles is %ld.\n",answer);
    return 0;
}

/* 使用指针算术 */
int sump(int * start,int * end)
{
    int total = 0;

    while(start < end)
    {
            total +=*start; /* 把值累加到total上*/
            start++;        /* 把指针向前推进到下一个元素 */
    }
    return total;
}

我用以下代码编译了代码:

gcc -Wall sum_arr2.c

并没有得到任何警告。    所以我试过

clang -Wall sum_arr2.c

仍然没有警告。 当我执行程序时

./a.out

输出是一些随机值。

所以我想问一下它是编译器的正确行为,还是一个bug?

似乎gcc只是一个名字而不是真正的gcc编译器:

gcc -v

Configured with: --     prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix

clang -v
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix

任何人都可以在gcc上测试吗?

1 个答案:

答案 0 :(得分:3)

大多数编译器只会在生成警告时一次查看一个函数,如果您不查看sump的实现,则无法知道{{1}内的调用1}}错了。如果main写入数组而不是从数组中读取怎么办?在这种情况下,传递未初始化的数组不会有问题。

sump