就ISO C標準(語言的官方定義)而言,訪問超出其界限的數組有“未定義行為“.這句話的字面意思是:
使用不可移植或錯誤的程序結構或錯誤數據的行為,而本國際標準對此沒有任何要求
一份非規(guī)范性說明對此作了進一步闡述:
可能的未定義行為包括:完全忽略具有不可預知結果的情況;在翻譯或程序執(zhí)行過程中以具有環(huán)境特征的記錄方式(有或不發(fā)布診斷消息);終止翻譯或執(zhí)行(通過發(fā)布診斷消息)。
這就是理論?,F實是什么?
在“最好”的情況下,您將訪問一些內存,這些內存要么是當前運行的程序擁有的(這可能導致程序不正常),要么是不屬于當前運行的程序(這可能會導致程序崩潰,比如分段錯誤)?;蛘撸赡車L試將程序所擁有的內存寫入內存,但這是標記為只讀的;這可能還會導致程序崩潰。
這是假設您的程序運行在一個試圖保護并發(fā)運行的進程來自彼此的操作系統(tǒng)下。如果您的代碼運行在“裸金屬”上,比如如果它是OS內核或嵌入式系統(tǒng)的一部分,那么就沒有這樣的保護;您的行為不當的代碼應該提供這種保護。在這種情況下,造成損害的可能性要大得多,在某些情況下,包括對硬件(或附近的物品或人員)的物理損壞。
即使在受保護的操作系統(tǒng)環(huán)境中,保護也并不總是100%。例如,存在允許非特權程序獲得根(管理)訪問的操作系統(tǒng)錯誤。即使具有普通用戶權限,故障程序也會消耗過多的資源(CPU、內存、磁盤),可能會導致整個系統(tǒng)癱瘓。許多惡意軟件(病毒等)利用緩沖區(qū)溢出獲取對系統(tǒng)的未經授權的訪問。
(一個歷史上的例子:我聽說在一些舊系統(tǒng)中核心存儲器,重復訪問緊循環(huán)中的單個內存位置實際上會導致內存塊融化。其他可能性包括破壞CRT顯示器,以及移動磁盤驅動器的讀/寫頭與驅動器柜的諧波頻率,導致它走過一張桌子并跌倒在地板上。)
總有一天天網擔心。
底線是:如果你能寫一個程序來做一些不好的事情。故意,至少從理論上講,一個bug程序可以做同樣的事情。不慎.
實際上,這是非常在MacOSX系統(tǒng)上運行的bug程序不太可能做比崩潰更嚴重的事情。但不可能完全地防止錯誤代碼做非常糟糕的事情。