簡體   English   中英

為什么clang沒有使用未初始化的數組發出警告?

[英]Why clang doesn't issued a warning with using uninitialized array?

我正在閱讀一本書中的一些代碼,忘記初始化陣列彈珠。但我沒有得到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上測試它嗎?

大多數編譯器將只考慮一個功能,而當時他們正在生成警告,如果你不看里面執行不sump你可以不知道這里面的通話main是錯誤的。 如果sump寫入數組而不是從它讀取怎么辦? 在這種情況下,傳遞未初始化的數組不會有問題。

int sump(int * start,int * end)
{
    while(start < end)
    {
        *start = 42;
        start++;
    }
    return 17;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM