一種內存錯誤檢測方法
2023-06-03 11:27:01
一種內存錯誤檢測方法
【專利摘要】本發明公開了一種內存錯誤檢測方法,應用於計算機應用程式的內存錯誤檢測。所述方法包括以下步驟:對應用程式進行靜態分析,完成對其的內存錯誤特徵建模;運行所述應用程式,利用內存錯誤特徵模型,創建並動態維護所述應用程式的合法地址庫;應用程式每次訪問內存地址前,計算出即將訪問的內存地址並與合法地址庫中的記錄進行匹配,若無法匹配上或程序運行結束前合法地址庫中仍有由內存分配函數創建的記錄,均說明該應用程式存在內存錯誤。本發明能夠有效地檢測出計算機應用程式中包括越界訪問、指針非法訪問、內存錯誤釋放和內存洩露等常見的四大類內存錯誤。
【專利說明】一種內存錯誤檢測方法
【技術領域】
[0001]本發明屬於計算機軟體安全與可靠性保障領域,尤其涉及計算機應用程式的內存錯誤檢測方法。
【背景技術】
[0002]C/C++語言中由於能夠直接對計算機內存地址空間進行操作,雖極大方便了程式設計師,但在具體操作過程中,由於程式設計師的疏忽或本身技術水平有限,程序中總是不可避免地出現包括數組越界、野指針訪問、空指針引用、內存釋放錯誤和內存洩露等內存錯誤。這些內存錯誤一般很難在調試過程中就被發現,即使找出來也是相當費時的,特別是發生在代碼量巨大或者模塊之間調用關係比較複雜的程序中。內存錯誤除了可能導致程序運行錯誤和系統崩潰,還可能導致緩衝區溢出等問題,從而影響系統安全性。所以,在對可靠性和安全性要求較為苛刻的系統部署前,非常有必要對計算機應用程式進行內存錯誤檢測。而現有內存錯誤檢測技術基本上都只能檢測上述內存錯誤的一種或幾種錯誤,沒有辦法從內存錯誤發生的根源上對上述所有內存錯誤進行檢測。
【發明內容】
[0003]本發明的技術解決問題:克服現有技術的不足,提供一種能夠從根源上檢測出計算機應用程式中包括越界訪問、指針非法引用、內存錯誤釋放和內存洩露等四大類常見內存錯誤的方法,保證了計算機軟體的安全性和可靠性。
[0004]本發明的核心思想是在應用程式訪問內存地址空間之前,就對其即將訪問的內存地址空間進行驗證。如果驗證不通過,說明存在內存錯誤問題;否則說明不存在內存錯誤問題,程序繼續運行。如此反覆,直至程序運行結束或被異常終止運行。
[0005]本發明提供的檢測方法包括以下步驟:如圖1所示:
[0006]步驟101,對應用程式進行靜態分析,完成對所述應用程式的內存錯誤特徵建模。
[0007]其中,對所述應用程式的內存錯誤特徵建模的過程是識別所述應用程式中所有可能出現內存錯誤的語句和位置信息識別和記錄的過程,該內存錯誤特徵模型包括所述應用程式中的數組、指針、不安全字符串操作函數、內存分配與釋放函數等關鍵錯誤節點的聲明、引用或調用語句所在的位置信息和引用或調用信息。
[0008]步驟102,運行所述應用程式,利用內存錯誤特徵模型,創建並動態維護一個全局的合法地址庫。
[0009]在運行所述應用程式的過程中,需要根據內存錯誤特徵模型及步驟(101)中得到的數據完成所述應用程式的合法地址庫的創建。
[0010]所述合法地址庫存儲了所述應用程式在運行時當前即時有效的所有內存地址空間的記錄,所述合法地址庫中的每一條記錄對應所述應用程式中一個對象。所述對象指的是所述應用程式在內存中可單獨存在的語法個體,即所述應用程式的一個變量或函數。
[0011]所述合法地址庫中的記錄會隨著所述應用程式的不斷運行,會因為變量的聲明、變量被賦值、函數調用以及內存的申請和釋放操作不斷更新。其中,變量聲明或新申請成功內存時,需要在合法地址庫中創建一條心的記錄;變量被賦值時,需要修改合法地址庫中關聯記錄的合法地址範圍;變量或函數脫離作用域或釋放成功內存時,需要刪除合法地址庫中關聯記錄。
[0012]步驟103,在所述應用程式運行完畢或被異常終止運行之前,所述應用程式每次訪問內存前均先計算即將訪問的地址範圍,並與合法地址庫中的記錄相匹配;若無法匹配上,則說明將發生內存錯誤,記錄下相關錯誤信息。
[0013]其中,若計算出的地址範圍與所述應用程式中發起訪問的語法對象在所述合法地址庫中關聯記錄中的地方範圍不是包含與被包含的關係,則說明當次訪問將出現內存錯誤。此時只需根據前述兩個地址範圍的實際包含關係和所述語法對象的類型、操作類型來判斷可能會出現的內存錯誤類型及其他相關信息。
[0014]步驟104,在所述應用程式運行完畢或被異常終止運行後檢查合法地址庫中是否存在由內存分配函數創建的記錄;若存在,說明發生了內存洩露錯誤,記錄下相關錯誤信肩、O
[0015]本發明與現有技術相比優點在於:本發明提供的內存錯誤檢測方法由於是從根源上對計算機應用程式進行內存錯誤檢測,所以能夠保證此方法的有效性遠超當前所有內存錯誤檢測方法,而且檢測出的內存錯誤的數量能夠涵蓋所有常見的內存錯誤。
【專利附圖】
【附圖說明】
[0016]圖1為本發明的內存錯誤檢測方法的流程圖;
[0017]圖2為本發明實施例中內存錯誤特徵建模流程圖;
[0018]圖3為本發明實施例中合法地址庫的動態維護流程圖;
[0019]圖4為本發明實施例中合法地址庫示意圖。
【具體實施方式】
[0020]以下結合本發明實施例附圖來對本發明實施例中的技術方案進行清除、完整地描述,顯然所描述的實施例僅僅是本申請一部分實施例,而不是全部的實施例。
[0021]如圖2為本發明實施例中內存錯誤特徵建模流程圖,所述方法步驟如下:
[0022]步驟201,對待測應用程式進行詞法分析,獲得所述應用程式的詞法單元序列。
[0023]步驟202,對所所述應用程式進行語法分析,生成抽象語法樹。
[0024]其中,步驟201和202可以藉助GNU GCC編譯器或開源詞法分析、語法分析生成器工具LEX/YACC完成。
[0025]步驟203,分析抽象語法樹,識別出所述應用程式中內存錯誤特徵節點,記錄下其相關信息。
[0026]所述的內存錯誤特徵節點指的是所有與內存操作相關的語句。C/C++語言中內存操作相關語句的一種歸類為:申請內存、釋放內存、寫內存和讀內存。所有的內存操作相關語句所在文件名、行號、作用域均需要被記錄,除此之外,不同操作語句還需要記錄的信息包括:在申請內存時,還需要記錄該申請操作的關聯指針名、申請的內存空間類型、申請操作函數和申請的內存大小表達式;釋放內存時,還需要記錄該釋放操作的釋放操作函數和關聯指針名;寫內存時,還需要記錄該寫內存操作的目標對象名、源對象名和寫入大小表達式;讀內存時,還需要記錄該讀內存操作的源對象名、讀入大小表達式。
[0027]步驟204,將上述記錄寫入內存錯誤特徵模型基礎數據文件。
[0028]其中,為便於後續檢測過程對所述內存錯誤特徵模型基礎數據文件的讀取,需要該文件存儲為XML格式。
[0029]如圖3為本發明實施例中合法地址庫的動態維護流程圖,具體包括以下步驟:
[0030]步驟301,讀取內存錯誤特徵模型基礎數據,在每一個內存錯誤特徵節點之前插樁。其中,插入的樁函數中包含:唯一的內存操作標識號、計算即將訪問地址空間的方法、檢索內存錯誤特徵模型的方法、記錄相關錯誤信息的方法。
[0031]步驟302,運行所述應用程式,創建用於存儲合法地址庫的數據容器。由於合法地址庫中記錄的更新和查詢非常頻繁,故要求合法地址庫的存儲容器的查找性能特別好,考慮到哈希表能夠將數據的存儲和查找消耗的時間大大降低,可以考慮使用哈希表來完成合法地址庫的存儲。
[0032]如圖4為本發明實施例中合法地址庫示意圖。該合法地址庫中包含欄位:哈希值、對象名、對象類型、合法地址範圍、步進值、同名對象、同名對象類型、作用域、文件名和行號。其中,步進值指的是指針每次移動所移動的字節數;同名對象指的是內存地址相同的變量。
[0033]步驟303,讀取每一個內存錯誤特徵節點所對應的語句,將該語句的行號作為參數去檢索內存錯誤特徵模型,確定該語句對應節點的類型。所述節點類型包括:變量申明節點、變量被賦值節點、變量或函數脫離作用域節點、內存申請節點和內存釋放節點。
[0034]步驟304,根據節點的類型,來剛更新合法地址庫的記錄。
[0035]其中,若節點類型為釋放內存且內存釋放成功,則刪除合法地址庫中對應記錄;
[0036]若節點類型為變量或函數脫離作用域,則刪除合法地址庫中對應記錄;
[0037]若節點類型為變量聲明,則向合法地址庫中創建一條記錄;
[0038]若節點類型為變量被賦值,則更新合法地址庫中對應記錄的合法地址範圍;若該變量存在同名變量,則需要同步更新該同名變量的合法地址範圍;
[0039]若節點類型為內存申請且內存申請成功,則向合法地址庫中添加一條記錄。
[0040]本發明的內存錯誤檢測是基於合法地址庫進行的,應用程式在對內存地址空間的訪問前均需事先計算即將訪問的內存地址空間是否與合法地址庫中對應記錄中的內存地址空間進行匹配,如果匹配不上或者在應用程式運行結束或應用程式被異常終止運行後合法地址庫中仍存在記錄,都說明了內存錯誤的發生。
[0041]應該指出的是,以上所述僅為本發明的較佳實施案例而已,並不能因此而認為是對本發明的專利保護範圍的限制,在不脫離本發明的核心思想的所有等效改進和潤飾,均屬於本發明的保護範圍。
【權利要求】
1.一種內存錯誤檢測方法,應用於對嵌入式系統的實時性能測試,其特徵在於:所述方法包括以下步驟: (1)對應用程式進行靜態分析,完成對所述應用程式的內存錯誤特徵建模; (2)運行所述應用程式,利用所述內存錯誤特徵模型,創建並動態維護所述應用程式的合法地址庫; (3)在所述應用程式運行完畢或被異常終止運行之前,所述應用程式每次訪問內存前均先計算即將訪問的地址範圍,並與合法地址庫中的記錄相匹配;若無法匹配上,則說明將發生內存錯誤,記錄下相關錯誤信息; (4)在所述應用程式運行完畢或被異常終止運行後檢查合法地址庫中是否存在由內存分配函數創建的記錄;若存在,說明發生了內存洩露錯誤,記錄下相關錯誤信息。
2.根據權利要求1所述的方法,其特徵在於:所述步驟(I)中對所述應用程式的內存錯誤特徵建模指的是將所述應用程式中所有可能出現內存錯誤的語句和位置信息進行識另O,並構建內存錯誤特徵模型。所述內存錯誤特徵模型包括所述應用程式中的數組、指針、不安全字符串操作函數、內存分配與釋放函數等關鍵錯誤節點的聲明、引用或調用語句所在的位置信息和引用或調用信息。
3.根據權利要求1所述的方法,其特徵在於:所述步驟(2)中,所述合法地址庫指的是包含了所述應用程式在運行時當前即時有效的所有內存地址空間的倉庫,倉庫中的每條記錄對應所述應用程式中的一個對象,所述對象指的是所述應用程式在內存中可單獨存在的語法個體,即所述應用程式的一個變量或函數。
4.根據權利要求1所述的方法,其特徵在於:所述步驟(2)中,動態維護所述應用程的規則是:所述應用程式剛開始運行時,就根據內存錯誤特徵模型初始化合法地址庫,創建用於合法地址庫記錄的數據容器;隨著所述應用程式的不斷運行,變量的聲明、變量被賦值、函數調用以及內存的申請和釋放都需要不斷增加、修改、刪除合法地址庫中的記錄;其中,變量聲明或新申請成功內存時,需要在合法地址庫中創建一條新的記錄;變量被賦值時,需要修改合法地址庫中關聯記錄的合法地址範圍;變量或函數脫離作用域或釋放成功內存時,需要刪除合法地址庫中關聯記錄。
5.根據權利要求1所述的方法,其特徵在於:所述步驟(3)中,所述應用程式每次訪問內存前均先計算即將訪問的地址範圍,若計算出的地址範圍與所述應用程式中發起訪問的語法對象在所述合法地址庫中關聯記錄中的地方範圍不是包含與被包含的關係,則說明當次訪問將出現內存錯誤,此時只需根據前述兩個地址範圍的實際包含關係和所述語法對象的類型、操作類型來判斷可能會出現的內存錯誤類型及其他相關信息。
【文檔編號】G06F11/07GK104133733SQ201410366790
【公開日】2014年11月5日 申請日期:2014年7月29日 優先權日:2014年7月29日
【發明者】康一梅, 張浩中 申請人:北京航空航天大學