內(nèi)存損壞
內(nèi)存損壞是最棘手的編程錯誤類別之一遗契,原因有兩個:
- 內(nèi)存損壞的來源及其表現(xiàn)可能相差甚遠,因此很難將原因與效果聯(lián)系起來沙廉。
- 癥狀出現(xiàn)在異常情況下嗓节,很難一致地重現(xiàn)錯誤。
內(nèi)存損壞錯誤大致可分為四類:
- 使用未初始化的內(nèi)存:未初始化的內(nèi)存的內(nèi)容被視為垃圾值帕膜。使用此類值可能會導(dǎo)致不可預(yù)測的程序行為枣氧。
- 使用非擁有內(nèi)存:通常使用指針來訪問和修改內(nèi)存。如果這樣的指針是空指針垮刹,懸空指針(指向已經(jīng)被釋放的存儲器)达吞,或者指向當前堆棧或堆邊界之外的存儲器位置荒典,則它指的是程序不具有的存儲器酪劫。使用這樣的指針是一個嚴重的編程缺陷。訪問此類內(nèi)存通常會導(dǎo)致操作系統(tǒng)異常寺董,這通常會導(dǎo)致程序崩潰(除非使用合適的內(nèi)存保護軟件)契耿。
- 使用超出分配的內(nèi)存的內(nèi)存(緩沖區(qū)溢出):如果在循環(huán)中使用數(shù)組,并且終止條件不正確螃征,則可能會意外地操作超出數(shù)組邊界的內(nèi)存。緩沖區(qū)溢出是計算機病毒利用的最常見的編程漏洞之一透敌,在廣泛使用的程序中導(dǎo)致嚴重的計算機安全問題(例如盯滚,返回libc攻擊,堆棧粉碎保護)酗电。在某些情況下魄藕,程序也可能在啟動緩沖區(qū)之前錯誤地訪問內(nèi)存。
- 堆內(nèi)存管理錯誤:內(nèi)存泄漏和釋放非堆或未分配的內(nèi)存是錯誤的堆內(nèi)存管理導(dǎo)致的最常見錯誤撵术。
許多內(nèi)存調(diào)試器(如Purify背率,Valgrind,Insure ++嫩与,Parasoft C / C ++測試寝姿,AddressSanitizer)可用于檢測內(nèi)存損壞錯誤。