2013-01-19 64 views
1

所以我的代碼是爲什麼64位ubuntu中的gcc沒有檢測到以下數組溢出?

#include <stdio.h> 
#include <string.h> 
int main() 
{ 
    const char *a="123456789abcdef"; 
    char b[10]; 
    int i=0; 
    while((b[i]=a[i])!='\0') 
     ++i; 
    printf("%s, %d\n",b,strlen(b)); 
    return 0; 
} 

的代碼存在與數組b中的一個陣列溢出,但是當我在我的系統(64位的Ubuntu 12.04 LTS)用gcc編譯(4.6.3版本),它成功。

該程序的輸出是123456789abcdef,15
返回0表示該程序正常退出。

我不知道這是我的編譯器的問題還是我的系統,有人可以告訴我嗎? P.S.它似乎只出現在使用gcc的64位linux中。這是一個錯誤?

+0

與Clang編譯返回'123456789ab @,13'。 – Blender

+1

我冒昧地更正了你的代碼。 1:main必須是int。 2:一定是const。 3:printf有一個缺失)。順便說一句,我得到一個段錯誤。 –

+0

謝謝,順便說一句c,函數默認設置爲int。它應該得到一個段錯誤,所以你使用什麼編譯器和系統! –

回答

7

在C中沒有檢查數組訪問。如果像這樣溢出緩衝區,結果是未定義的行爲。程序員有責任防範這一點,而不是編譯器。

雖然有工具可以幫助檢查無效的內存訪問。像Valgrind在運行時這樣做,Clang的靜態分析器用於編譯時檢查。

+0

首先,謝謝!我知道這是程序員的責任,以防止緩衝區溢出,我只是好奇這是否是一個bug。我問我的朋友在他的64位系統運行這個,結果 –

+0

結果是同樣,在32位系統中運行它時,它不會成功,所以我們可以說它是由gcc和64位linux的兼容性造成的? –

+0

@CocooWang這是你的代碼中的一個錯誤:-)當你寫內存時,你不應該,你會得到未定義的行爲。未定義的行爲意味着可能發生任何事情。該程序可能會崩潰,或者可能不會。這就是「未定義」的含義。 –

相關問題