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