簡體   English   中英

警告:使用 -O3 標志編譯時,數組下標高於數組邊界 [-Warray-bounds]

[英]warning: array subscript is above array bounds [-Warray-bounds] when compiling using -O3 flag

我仍然不明白為什么我得到這個警告array subscript is above array bounds [-Warray-bounds]對於一個小的 C 代碼,如下所示:

#include <stdio.h>
#include <string.h>

static int _memcmp( const void *x, const void *y, size_t size ){
    const char *s1 = (char*)x, *s2 = (char*)y;

    int ret;
    ret = s1[0] - s2[0];
    if ( size == 1 || ret != 0 )
        return ret;

    ret = s1[1] - s2[1];
    if ( size == 2 || ret != 0 )
        return ret;

    ret = s1[2] - s2[2];
    if ( size == 3 || ret != 0 )
        return ret;

    ret = s1[3] - s2[3];
    if ( size == 4 || ret != 0 )
        return ret;

    ret = s1[4] - s2[4];
    if ( size == 5 || ret != 0 )
        return ret;

    ret = s1[5] - s2[5];
    if ( size == 6 || ret != 0 )
        return ret;

    ret = s1[6] - s2[6];
    if ( size == 7 || ret != 0 )
        return ret;

    ret = s1[7] - s2[7];
    if ( size == 8 || ret != 0 )
        return ret;

    ret = s1[8] - s2[8];
    if ( size == 9 || ret != 0 )
        return ret;

    ret = s1[9] - s2[9];
    if ( size == 10 || ret != 0 )
        return ret;

//0-20
    ret = s1[10] - s2[10];
    if ( size == 11 || ret != 0 )
        return ret;

    ret = s1[11] - s2[11];
    if ( size == 12 || ret != 0 )
        return ret;

    ret = s1[12] - s2[12];
    if ( size == 13 || ret != 0 )
        return ret;

    ret = s1[13] - s2[13];
    if ( size == 14 || ret != 0 )
        return ret;

    ret = s1[14] - s2[14];
    if ( size == 15 || ret != 0 )
        return ret;

    ret = s1[15] - s2[15];
    if ( size == 16 || ret != 0 )
        return ret;

    ret = s1[16] - s2[16];
    if ( size == 17 || ret != 0 )
        return ret;

    ret = s1[17] - s2[17];
    if ( size == 18 || ret != 0 )
        return ret;

    ret = s1[18] - s2[18];
    if ( size == 19 || ret != 0 )
        return ret;

    ret = s1[19] - s2[19];
    if ( size == 20 || ret != 0 )
        return ret;

    return memcmp( s1 + 20, s2 + 20, size - 20 );
}

void t1(){
    char *x = "hihihaha";
    printf("%d\n", _memcmp( x, "ha", 2 ));
}

void t2(){
    char *x = "hihihaha";
    printf("%d\n", _memcmp( x, "hi", 2 ));
}
int main(){
    return 0;
}

當我用03標志編譯時,我收到了這條消息:

gcc-7 -O3 -Wall -o mem_cmp mem_cmp.c
mem_cmp.c: In function ‘_memcmp.part.0.constprop’:
mem_cmp.c:89:23: warning: array subscript is above array bounds [-Warray-bounds]
     return memcmp( s1 + 20, s2 + 20, size - 20 );

我試過gcc-4.9gcc-5但沒有運氣。

編輯

我很想知道為什么會出現警告而不是代碼風格。 (我很了解memcmp 。當然_memcmp可以通過for重新實現for但我想獲得一些循環。)

您的memcmp假定內存s1+20位於數組s1 - 而事實並非如此。 即使編譯器沒有抱怨這一點 - 您也會進入未定義的行為(這可能從程序崩潰到正確執行。這不是您應該回復的內容。)。 主要是從編譯 tile 中已知的字符串文字大小中推斷出這一點。

正確的一個是

return memcmp( s1, s2, min(strlen(s1),strlen(s2)));

其中min(x,y)返回xy最小值。

首先檢查大小,然后訪問數組。 首先進行大小檢查,然后索引到數組中。 使用for循環可以減少這里的重復代碼。 我的意思是,無論您為if語句中的不同索引做什么,都可以將其打包到單個塊中,以便它可以與 for 循環一起使用(索引變量表示每次迭代中更改的值)。

另請注意,如果您最后使用的是memcmp ,則不要單獨檢查字符 - 不需要。 您可以使用memcmp直接檢查它,然后輸出結果。

暫無
暫無

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

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