內存重復釋放的檢測方法
【專利摘要】本發(fā)明提出了一種內存重復釋放的檢測方法,首先構建哈希桶;首次釋放內存時候,記錄被釋放內存的內存指針,將被釋放內存的內存指針存入哈希桶;下次釋放內存時,查找被釋放內存的內存指針是否在哈希桶中存在,如果不存在,再計算其哈希值,得到序列號,然后根據(jù)序列號,將該被釋放內存的內存指針存入哈希桶;如果存在,則表明產生了內存重復釋放的錯誤,則打印出錯誤信息。本發(fā)明能有效地檢測出內存重發(fā)釋放的錯誤情況,并且,簡單有效,效率高、實際操作也方便。
【專利說明】內存重復釋放的檢測方法
【技術領域】
[0001]本發(fā)明涉及一種內存錯誤檢測的方法,尤其是出現(xiàn)內存重復釋放錯誤的檢測方法。
【背景技術】
[0002]C語言和C++語言程序中的內存錯誤非常有害,它們很常見,并且可能導致嚴重的后果。來自計算機應急響應小組和供應商的許多最嚴重的安全公告都是由簡單的內存錯誤造成的。自從70年代末期以來,C語言程序員就一直討論此類錯誤,但其影響至今仍然很大。
[0003]此外,內存錯誤一旦發(fā)生,往往很難找出發(fā)生的原因,從而也無法去糾正。需要借助于一些強有力工具的支撐。
[0004]存在內存錯誤的C語言和C++語言程序會導致各種問題。如果它們泄漏內存,則運行速度會逐漸變慢,并最終停止運行;如果覆蓋內存,則會變得非常脆弱,很容易受到惡意用戶的攻擊。
[0005]在可以使用C語言或C++語言的地方,也廣泛支持使用其他許多通用語言(如Java?、Ruby、Haskell、C#、Perl、Smalltalk等),每種語言都有眾多的愛好者和各自的優(yōu)點。但是,從計算角度來看,每種編程語目優(yōu)于C語目或C++語目的主要優(yōu)點都與便于內存管理密切相關。與內存相關的編程是如此重要,而在實踐中正確應用又是如此困難,以致于它支配著面向對象編程語目、功能性編程語目、聞級編程語目、聲明性編程語目和另外一些編程語言的所有其他變量或理論。
[0006]與少數(shù)其他類型的常見錯誤一樣,內存錯誤還是一種隱性危害:它們很難再現(xiàn),癥狀通常不能在相應的源代碼中找到。
【發(fā)明內容】
[0007]本發(fā)明需解決的技術問題是提供一種簡單有效、檢測效果高的內存重復釋放的檢測方法。
[0008]為了解決上述的問題,本發(fā)明設計了一種內存重復釋放的檢測方法,其包括以下步驟:步驟1:首先構建哈希桶;步驟2:首次釋放內存時候,記錄被釋放內存的內存指針,將被釋放內存的內存指針存入哈希桶;步驟3:下次釋放內存時,查找被釋放內存的內存指針是否在哈希桶中存在,如果不存在,將該被釋放內存的內存指針存入哈希桶;如果存在,則表明產生了內存重復釋放的錯誤,則打印出錯誤信息。
[0009]作為本發(fā)明進一步改進,在所述步驟2中,還包括:通過哈希算法計算被釋放內存的內存指針以得到序列號,根據(jù)所述序列號,將被釋放內存的內存指針存入哈希桶對應的位置上。
[0010]作為本發(fā)明進一步改進,所述步驟3中,將被釋放內存的內存指針存入哈希桶時,如果出現(xiàn)沖突,則利用沖突鏈記錄。
[0011]作為本發(fā)明進一步改進,所述步驟3中,在打印出錯誤信息步驟之后,還將當前被釋放內存的應有程序的函數(shù)調用棧打出。
[0012]作為本發(fā)明進一步改進,在所述步驟3中,將該被釋放內存的內存指針存入哈希桶之前,先計算其哈希值以得到序列號,然后根據(jù)序列號,該被釋放內存的內存指針存入哈希桶。
[0013]本發(fā)明能有效地檢測出內存重發(fā)釋放的錯誤情況,并且,簡單有效,效率高、實際操作也方便。
【專利附圖】
【附圖說明】
[0014]圖1是本發(fā)明內存重復釋放的檢測方法的流程示意圖。
【具體實施方式】
[0015]為了使本領域相關技術人員更好地理解本發(fā)明的技術方案,下面將結合附圖和實施方式,對本發(fā)明實施方式中的技術方案進行清楚、完整地描述,顯然,所描述的實施方式僅僅是本發(fā)明一部分實施方式,而不是全部的實施方式。
[0016]本發(fā)明提供了一種內存重復釋放的檢測方法,能有效地檢測出內存重復釋放的問題,方便快速定位和修正。
[0017]如圖1所示,本發(fā)明內存重復釋放的檢測方法包括:
[0018]步驟1:首先構建哈希桶。哈希桶用于記錄被釋放內存的內存指針,這樣,就可知道哪些內存已經被釋放過一次了。如果下次再釋放內存時,被釋放內存的內存指針在哈希桶中找到,即表明,該內存又被釋放了,存在重復釋放的錯誤。
[0019]步驟2:首次釋放內存時候,記錄被釋放內存的內存指針,將被釋放內存的內存指針存入哈希桶。在本實施例中,將被釋放內存的內存指針存入哈希桶之前,還通過哈希算法計算被釋放內存的內存指針以得到序列號,根據(jù)所述序列號,再將被釋放內存的內存指針存入哈希桶對應的位置上。被釋放內存的內存指針存入到哈希桶中,意味著被釋放內存已經被釋放過一次,通過哈希桶記錄了其內存指針,相當于被釋放的依據(jù)記錄在哈希桶中。
[0020]步驟3:下次釋放內存時,查找被釋放內存的內存指針是否在哈希桶中存在,如果不存在,說明該被釋放內存之前沒有被釋放過,不存在重復釋放的問題,此時,可以將該被釋放內存的內存指針計算出哈希值,得到序列號,然后根據(jù)序列號,將該被釋放內存的內存指針存入哈希桶,在將被釋放內存的內存指針存入哈希桶時,如果出現(xiàn)沖突,則利用沖突鏈記錄;如果存在,則表明檢測出該被釋放內存之前被釋放過,產生了內存重復釋放的錯誤,打印出錯誤信息,以讓用戶知道檢測出內存重復釋放的問題,更進一步是,,在打印出錯誤信息步驟之后,還將當前被釋放內存的應有程序的函數(shù)調用棧打出,以方便后續(xù)問題的跟蹤和定位。
[0021]本發(fā)明能有效地檢測出內存重發(fā)釋放的錯誤情況,并且,簡單有效,效率高、實際操作也方便。
[0022]以上僅表達了本發(fā)明的一種實施方式,其描述較為具體和詳細,但并不能因此而理解為對本發(fā)明專利范圍的限制。應當指出的是,對于本領域的普通技術人員來說,在不脫離本發(fā)明構思的前提下,還可以做出若干變形和改進,這些都屬于本發(fā)明的保護范圍。因此,本發(fā)明專利的保護范圍應以所附權利要求為準。
【權利要求】
1.一種內存重復釋放的檢測方法,其特征在于,包括以下步驟: 步驟1:首先構建哈希桶; 步驟2:首次釋放內存時候,記錄被釋放內存的內存指針,將被釋放內存的內存指針存入哈希桶; 步驟3:下次釋放內存時,查找被釋放內存的內存指針是否在哈希桶中存在,如果不存在,將該被釋放內存的內存指針存入哈希桶;如果存在,則表明產生了內存重復釋放的錯誤,則打印出錯誤信息。
2.根據(jù)權利要求1所述內存重復釋放的檢測方法,其特征在于,在所述步驟2中,還包括: 通過哈希算法計算被釋放內存的內存指針以得到序列號,根據(jù)所述序列號,將被釋放內存的內存指針存入哈希桶對應的位置上。
3.根據(jù)權利要求1所述內存重復釋放的檢測方法,其特征在于,所述步驟3中,將被釋放內存的內存指針存入哈希桶時,如果出現(xiàn)沖突,則利用沖突鏈記錄。
4.根據(jù)權利要求1所述內存重復釋放的檢測方法,其特征在于,所述步驟3中,在打印出錯誤信息步驟之后,還將當前被釋放內存的應有程序的函數(shù)調用棧打出。
5.根據(jù)權利要求1所述內存重復釋放的檢測方法,其特征在于,在所述步驟3中,將該被釋放內存的內存指針存入哈希桶之前,先計算其哈希值以得到序列號,然后根據(jù)序列號,該被釋放內存的內存指針存入哈希桶。
【文檔編號】G06F11/36GK104239205SQ201410449677
【公開日】2014年12月24日 申請日期:2014年9月5日 優(yōu)先權日:2014年9月5日
【發(fā)明者】劉文勇, 劉馳 申請人:上海斐訊數(shù)據(jù)通信技術有限公司