汪明曄
摘要:內(nèi)存泄漏是一個長期困擾軟件開發(fā)人員的問題,學術界針對該問題進行了長期的研究和討論。當前定位內(nèi)存泄漏位置的方法主要有靜態(tài)檢測、動態(tài)檢測、靜態(tài)檢測和動態(tài)檢測相結合的三種方法。本文將介紹內(nèi)存泄漏的原因,分別闡述上述三種內(nèi)存泄漏檢測的原理和方法,分析它們各自的優(yōu)勢和不足,最后指明內(nèi)存泄漏檢測技術未來的發(fā)展方向。
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2018)28-0276-01
內(nèi)存泄漏問題的產(chǎn)生一般是由于軟件開發(fā)設計過程留下的代碼缺陷,導致程序向系統(tǒng)申請的堆區(qū)內(nèi)存沒有被回收或者沒有被及時回收。內(nèi)存泄漏的不斷積累通常會使程序的可用內(nèi)存空間減少,執(zhí)行速度減慢,甚至發(fā)生無法挽回的系統(tǒng)故障[1]。同時,內(nèi)存泄漏缺陷的存在還可能被一些針對軟件系統(tǒng)的攻擊行為(比如拒絕服務Denial of Service)所利用和放大,對軟件安全性產(chǎn)生十分不良的影響[2]。
為了解決內(nèi)存泄漏問題,靜態(tài)檢測、動態(tài)檢測、靜態(tài)檢測和動態(tài)檢測相結合等方法被提出。通過這些檢測方法,軟件開發(fā)人員可以找到造成內(nèi)存泄漏的代碼位置,修復造成內(nèi)存泄漏的軟件缺陷。
本文將重點介紹內(nèi)存泄漏檢測原理和方法,圍繞它們各自的優(yōu)勢和不足,分析每種方法的優(yōu)缺點,科學預測內(nèi)存泄漏檢測技術未來的發(fā)展方向。
1 內(nèi)存泄漏檢測原理和方法
靜態(tài)檢測方法是在目標程序運行前對程序源碼或目標代碼進行靜態(tài)分析,發(fā)現(xiàn)潛在的內(nèi)存泄漏代碼缺陷;動態(tài)檢測方法是當目標程序運行時,收集程序內(nèi)存操作信息,判斷是否發(fā)生內(nèi)存泄漏;為了提高動態(tài)檢測方法的效率,也為了減少對目標程序運行的干擾,可以先對程序的源碼做靜態(tài)分析或者目標機器代碼反匯編并做靜態(tài)分析,預測可能發(fā)生泄漏的代碼段,當程序運行時,只在這些代碼段被執(zhí)行時跟蹤收集程序的內(nèi)存操作信息,這便是靜態(tài)檢測和動態(tài)檢測相結合的方法。
1.1 內(nèi)存泄漏靜態(tài)檢測
靜態(tài)檢測原理是通過對目標程序的源碼或者目標代碼進行詞法語法分析或解析,發(fā)現(xiàn)潛在的代碼缺陷,報告給軟件開發(fā)人員,其一般流程如圖1所示:
靜態(tài)檢測方法一般采用模式匹配預測可能發(fā)生內(nèi)存泄漏的位置,具體使用哪種模式因程序的高級語言或者匯編指令而異,通過判斷堆指針是否被正確釋放檢測是否發(fā)生內(nèi)存泄漏。
1.2 內(nèi)存泄漏動態(tài)檢測
動態(tài)檢測原理一般是通過截獲目標程序的內(nèi)存操作函數(shù)(如malloc、free等)獲取所申請的內(nèi)存的信息,通過判斷動態(tài)申請的內(nèi)存是否被釋放或者在預定時間內(nèi)被釋放檢測是否發(fā)生內(nèi)存泄漏。動態(tài)檢測方法的一般步驟如圖2所示:
1.3 內(nèi)存泄漏靜態(tài)檢測和動態(tài)檢測相結合的方法
靜態(tài)檢測和動態(tài)檢測相結合的方法綜合了靜態(tài)檢測和動態(tài)檢測兩種方法,該方法首先使用靜態(tài)檢測方法確定程序可能發(fā)生內(nèi)存泄漏的位置,當程序運行時,通過對這些潛在內(nèi)存泄漏位置進行動態(tài)跟蹤檢測,該方法的一般步驟如圖3所示:
2 三種內(nèi)存泄漏方法的比較結論
靜態(tài)檢測方法對程序的運行沒有影響,但是僅通過對程序靜態(tài)分析產(chǎn)生內(nèi)存泄漏警報存在誤報的情況;動態(tài)檢測方法通過跟蹤進程的內(nèi)存操作確認內(nèi)存泄漏的結果是否準確,但是會影響到程序的運行,而且存在漏報情況;靜態(tài)和動態(tài)檢測相結合的方法,通過靜態(tài)檢測減少了漏報的情況和對程序運行的干擾,通過動態(tài)檢測使檢測的結果更加可靠,是一種折中的方法,也是未來內(nèi)存泄漏檢測技術研究的發(fā)展趨勢。
參考文獻:
[1] 王喆. C/C++代碼內(nèi)存泄漏缺陷檢測方法研究[D].大連理工大學, 2012.
[2] 李孟宸. 面向C語言程序內(nèi)存泄漏的動態(tài)確認技術[D].南京大學, 2014.
【通聯(lián)編輯:梁書】