一種內(nèi)存越界的檢測方法及裝置的制造方法
【專利摘要】本發(fā)明公開了一種內(nèi)存越界的檢測方法及裝置,其方法包括:獲取分配給待檢測程序的內(nèi)存塊的起始地址和內(nèi)存管理頭信息,內(nèi)存管理頭信息包括:內(nèi)存塊的容量以及釋放標記;檢測釋放標記,若釋放標記指示內(nèi)存塊已被釋放,則判斷待檢測程序發(fā)生內(nèi)存越界;若釋放標記指示內(nèi)存塊未被釋放,則獲取待檢測程序的第一偏向地址,第一偏向地址為距起始地址最遠的偏向地址;根據(jù)內(nèi)存塊的容量和起始地址,檢測第一偏向地址是否落在內(nèi)存塊的內(nèi)存范圍內(nèi);若第一偏向地址未落在內(nèi)存塊的內(nèi)存范圍內(nèi),則判斷待檢測程序發(fā)生內(nèi)存越界。本發(fā)明通過先檢測內(nèi)存塊的合法性,再檢測待檢測程序是否全部落在內(nèi)存塊的合法范圍內(nèi)來檢測是否發(fā)生內(nèi)存越界,實現(xiàn)內(nèi)存越界的快速定位。
【專利說明】
一種內(nèi)存越界的檢測方法及裝置
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及嵌入式系統(tǒng)內(nèi)存管理及內(nèi)存檢測領(lǐng)域,尤其涉及一種內(nèi)存越界的檢測方法及裝置。
【背景技術(shù)】
[0002]在嵌入式系統(tǒng)中,內(nèi)存訪問越界是一種常見錯誤,但在發(fā)生此類問題時,確認其源頭極其困難;現(xiàn)有技術(shù)中對于檢測內(nèi)存越界問題,通過在內(nèi)存尾部和頭部添加用于記錄內(nèi)存申請釋放情況的部分信息,在內(nèi)存越界寫到尾部或者頭部時,能夠通過檢測尾部和頭部的內(nèi)容能夠檢測內(nèi)存被越界訪問。但是此類技術(shù)的缺陷在于,當某個模塊使用的內(nèi)存被其他模塊改寫時,如野指針,此種方法無法檢測出。
【發(fā)明內(nèi)容】
[0003]為了解決上述技術(shù)問題,本發(fā)明提供了一種內(nèi)存越界的檢測方法及裝置,解決了內(nèi)存訪問越界難以定位的問題。
[0004]依據(jù)本發(fā)明的一個方面,提供了一種內(nèi)存越界的檢測方法,包括:
[0005]獲取分配給待檢測程序的內(nèi)存塊的起始地址和內(nèi)存管理頭信息,內(nèi)存管理頭信息包括:內(nèi)存塊的容量以及釋放標記;
[0006]檢測釋放標記,若釋放標記指示內(nèi)存塊已被釋放,則判斷待檢測程序發(fā)生內(nèi)存越界;
[0007]若釋放標記指示內(nèi)存塊未被釋放,則獲取待檢測程序的第一偏向地址,第一偏向地址為距起始地址最遠的偏向地址;
[0008]根據(jù)內(nèi)存塊的容量和起始地址,檢測第一偏向地址是否落在內(nèi)存塊的內(nèi)存范圍內(nèi);若第一偏向地址未落在內(nèi)存塊的內(nèi)存范圍內(nèi),則判斷待檢測程序發(fā)生內(nèi)存越界。
[0009]進一步地,在獲取分配給待檢測程序的內(nèi)存塊的起始地址和內(nèi)存管理頭信息的步驟之前,還包括:
[0010]根據(jù)待檢測程序所包含的操作信息申請一內(nèi)存塊。
[0011]進一步地,在獲取分配給待檢測程序的內(nèi)存塊的起始地址和內(nèi)存管理頭信息的步驟之后,還包括:
[0012]根據(jù)待檢測程序所包含的操作信息對內(nèi)存塊進行操作。
[0013]進一步地,在判斷待檢測程序發(fā)生內(nèi)存越界的步驟之后,還包括:
[0014]記錄發(fā)生內(nèi)存越界的待檢測程序,并掛起執(zhí)行待檢測程序的進程。
[0015]進一步地,在判斷待檢測程序發(fā)生內(nèi)存越界的步驟之后,還包括:
[0016]獲取輸入的處理策略,并根據(jù)處理策略對待檢測程序進行相應操作。
[0017]進一步地,獲取分配給待檢測程序的內(nèi)存塊的起始地址和內(nèi)存管理頭信息的步驟包括:
[0018]接收待檢測程序的內(nèi)存管理頭地址;
[0019]根據(jù)內(nèi)存管理頭地址查找內(nèi)存塊的起始地址,并讀取存儲在內(nèi)存塊管理頭地址上的內(nèi)存管理頭信息。
[0020]依據(jù)本發(fā)明的另一個方面,還提供了一種內(nèi)存越界的檢測裝置,包括:
[0021]第一獲取模塊,用于獲取分配給待檢測程序的內(nèi)存塊的起始地址和內(nèi)存管理頭信息,內(nèi)存管理頭信息包括:內(nèi)存塊的容量以及釋放標記;
[0022]第一檢測模塊,用于檢測釋放標記,若釋放標記指示內(nèi)存塊已被釋放,則判斷待檢測程序發(fā)生內(nèi)存越界;
[0023]第二獲取模塊,用于當釋放標記指示內(nèi)存塊未被釋放時,獲取待檢測程序的第一偏向地址,第一偏向地址為距起始地址最遠的偏向地址;
[0024]第二檢測模塊,用于根據(jù)內(nèi)存塊的容量和起始地址,檢測第一偏向地址是否落在內(nèi)存塊的內(nèi)存范圍內(nèi);若第一偏向地址未落在內(nèi)存塊的內(nèi)存范圍內(nèi),則判斷待檢測程序發(fā)生內(nèi)存越界。
[0025]進一步地,該內(nèi)存越界的檢測裝置還包括:
[0026]申請模塊,用于根據(jù)待檢測程序所包含的操作信息申請一內(nèi)存塊。
[0027]進一步地,該內(nèi)存越界的檢測裝置還包括:
[0028]操作模塊,用于根據(jù)待檢測程序所包含的操作信息對內(nèi)存塊進行操作。
[0029]進一步地,該內(nèi)存越界的檢測裝置還包括:
[0030]處理模塊,用于記錄發(fā)生內(nèi)存越界的待檢測程序,并掛起執(zhí)行待檢測程序的進程。
[0031]進一步地,該內(nèi)存越界的檢測裝置還包括:
[0032]擴展模塊,用于獲取輸入的處理策略,并根據(jù)處理策略對待檢測程序進行相應操作。
[0033]進一步地,第一獲取模塊包括:
[0034]接收單元,用于接收待檢測程序的內(nèi)存管理頭地址;
[0035]獲取單元,用于根據(jù)內(nèi)存管理頭地址查找內(nèi)存塊的起始地址,并讀取存儲在內(nèi)存塊管理頭地址上的內(nèi)存管理頭信息。
[0036]本發(fā)明的實施例的有益效果是:一種內(nèi)存越界的檢測方法及裝置,通過先檢測待檢測程序的內(nèi)存塊的合法性,再檢測待檢測程序是否全部落在內(nèi)存塊的合法范圍內(nèi),來檢測該待檢測程序是否發(fā)生內(nèi)存越界,實現(xiàn)了內(nèi)存越界的快速定位,提高了整個執(zhí)行該待檢測程序的系統(tǒng)的容錯性、可靠性和可用性。
【附圖說明】
[0037]圖1表示本發(fā)明內(nèi)存越界的檢測方法的流程示意圖一;
[0038]圖2表示本發(fā)明內(nèi)存越界的檢測方法的流程示意圖二 ;
[0039]圖3表示本發(fā)明內(nèi)存越界的檢測裝置的模塊示意圖。
[0040]其中圖中:101、第一獲取模塊,102、第二檢測模塊,103、第二獲取模塊,104、第二檢測模塊。
【具體實施方式】
[0041]下面將參照附圖更詳細地描述本發(fā)明的示例性實施例。雖然附圖中顯示了本發(fā)明的示例性實施例,然而應當理解,可以以各種形式實現(xiàn)本發(fā)明而不應被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本發(fā)明,并且能夠?qū)⒈景l(fā)明的范圍完整的傳達給本領(lǐng)域的技術(shù)人員。
[0042]實施例
[0043]為了解決嵌入式系統(tǒng)內(nèi)存越界難以定位的問題,如圖1所示,本發(fā)明的實施例提供了一種內(nèi)存越界的檢測方法,可在每一段程序執(zhí)行后檢測該程序是否發(fā)生內(nèi)存越界,并將發(fā)生內(nèi)存越界的程序記錄下來。該檢測方法包括:
[0044]步驟10:獲取分配給待檢測程序的內(nèi)存塊的起始地址和內(nèi)存管理頭信息,內(nèi)存管理頭信息包括:內(nèi)存塊的容量以及釋放標記。
[0045]當某一待檢測程序需要被檢測其是否發(fā)生內(nèi)存越界時,需要獲取系統(tǒng)分配給該待檢測程序的內(nèi)存塊的起始地址和該內(nèi)存塊的內(nèi)存管理頭信息。其中,當系統(tǒng)為該待檢測程序分配內(nèi)存塊時,會記錄該內(nèi)存塊的起始地址以及內(nèi)存管理頭地址,以便后續(xù)需要檢測該待檢測程序是否發(fā)生內(nèi)存越界問題。在該內(nèi)存管理頭信息中記錄有該內(nèi)存塊的容量以及釋放標記。其中,內(nèi)存塊容量即內(nèi)存塊大小,當知道內(nèi)存塊的起始地址時,根據(jù)內(nèi)存塊大小就可得到內(nèi)存塊的終止地址。釋放標記表示該內(nèi)存塊是否被釋放的標記,通??勺远x其代碼含義,例如:全“ I ”表示未被釋放,全“ O ”表示已被釋放。
[0046]步驟20:檢測釋放標記,若釋放標記指示內(nèi)存塊已被釋放,則判斷待檢測程序發(fā)生內(nèi)存越界。
[0047]當檢測該待檢測程序是否發(fā)生內(nèi)存越界問題時,首先需要對該待檢測程序?qū)膬?nèi)存塊的內(nèi)存管理頭信息中的釋放標記,若該釋放標記表示該內(nèi)存塊已被釋放,即該釋放標記為全“O”時,表示該內(nèi)存塊已被釋放,該內(nèi)存塊為非法的,但仍被待檢測程序占用,則說明該待檢測程序發(fā)生了內(nèi)存越界。
[0048]步驟30:若釋放標記指示內(nèi)存塊未被釋放,則獲取待檢測程序的第一偏向地址,第一偏向地址為距起始地址最遠的偏向地址。
[0049]若該釋放標記表示該內(nèi)存塊未被釋放,即該釋放標記為全“I”時,表示該內(nèi)存塊未被釋放,該內(nèi)存塊為合法區(qū)域,待檢測程序可對其占用或改寫。這時需要通過檢測待檢測程序執(zhí)行時的距起始地址最遠的第一偏向地址來進行判斷,在該待檢測程序執(zhí)行時,系統(tǒng)會記錄其每個偏向地址,故可篩選距起始地址最遠的偏向地址為第一偏向地址。
[0050]步驟40:根據(jù)內(nèi)存塊的容量和起始地址,檢測第一偏向地址是否落在內(nèi)存塊的內(nèi)存范圍內(nèi);若第一偏向地址未落在內(nèi)存塊的內(nèi)存范圍內(nèi),則判斷待檢測程序發(fā)生內(nèi)存越界。
[0051]步驟10已獲取到內(nèi)存塊的容量和起始地址,這樣可知內(nèi)存塊的內(nèi)存范圍,檢測步驟30獲取到的第一偏向地址是否落在該內(nèi)存塊的內(nèi)存范圍內(nèi),若第一偏向地址未落在內(nèi)存塊的內(nèi)存范圍內(nèi),即第一偏向地址不在起始地址和終止地址之間,則判斷該待檢測程序發(fā)生了內(nèi)存越界問題。若第一偏向地址落在內(nèi)存塊的內(nèi)存范圍內(nèi),即第一偏向地址在起始地址和終止地址之間,則判斷該待檢測程序未發(fā)生內(nèi)存越界問題,這時可根據(jù)系統(tǒng)指示做出相應動作。
[0052]進一步地,如圖2所示,在步驟10之前,該檢測方法還包括:
[0053]步驟01:根據(jù)待檢測程序所包含的操作信息申請一內(nèi)存塊。
[0054]待檢測程序所包含的操作信息指的是該待檢測程序的代碼信息,系統(tǒng)可根據(jù)代碼信息為其分配一合理的內(nèi)存塊。該申請過程可調(diào)用內(nèi)存申請函數(shù)進行,系統(tǒng)分配可以使用的內(nèi)存塊時,還會返回該內(nèi)存塊起始地址和內(nèi)存管理頭地址。
[0055]進一步地,如圖2所示,該檢測方法還包括:
[0056]步驟02:根據(jù)待檢測程序所包含的操作信息對內(nèi)存塊進行操作。
[0057]按照該待檢測程序的代碼信息對分得的內(nèi)存塊進行相應的操作,當每次操作完這塊內(nèi)存塊后,將調(diào)用步驟10、步驟20、步驟30和步驟40所描述的檢測過程,以完成對該待檢測程序內(nèi)存越界的檢測。
[0058]進一步地,當檢測到該待檢測程序發(fā)生了內(nèi)存越界問題,可根據(jù)預先設定的處理策略對該段程序進行處理,例如:將該待檢測程序記錄下來,并掛起執(zhí)行該待檢測程序的進程。
[0059]進一步地,當檢測到該待檢測程序發(fā)生了內(nèi)存越界問題,亦可自定義對該段程序進行何種處理的處理策略,在根據(jù)輸入的處理策略對該待檢測程序進行相應操作。具體地,為了易用性,可采用成熟的預留命令行的方式,當檢測到某一待檢測程序發(fā)生了內(nèi)存越界問題,用戶可在命令行輸入對應的處理策略,使得系統(tǒng)根據(jù)該處理策略做出相應處理。
[0060]進一步地,如圖1所示,步驟10中獲取分配給待檢測程序的內(nèi)存塊的起始地址和內(nèi)存管理頭信息的步驟包括:
[0061]接收待檢測程序的內(nèi)存管理頭地址,當為該待檢測程序分配內(nèi)存塊時,已記錄該內(nèi)存塊的內(nèi)存管理頭地址和內(nèi)存塊起始地址。
[0062]根據(jù)內(nèi)存管理頭地址查找內(nèi)存塊的起始地址,并讀取存儲在內(nèi)存塊管理頭地址上的內(nèi)存管理頭信息。一般內(nèi)存管理頭地址是內(nèi)存塊起始地址的前一個地址,當讀取了內(nèi)存管理頭地址時即可得到內(nèi)存塊的起始地址。當這兩個地址不是相鄰關(guān)系時,亦可直接讀取記錄在系統(tǒng)中的內(nèi)存管理頭地址和內(nèi)存塊起始地址。在內(nèi)存管理頭地址中記錄有內(nèi)存管理頭信息,該內(nèi)存管理頭信息中記錄有對應的內(nèi)存塊的大小,以及該內(nèi)存塊是否被釋放的釋放標記。
[0063]本發(fā)明的內(nèi)存越界檢測方法,通過先檢測待檢測程序的內(nèi)存塊的合法性,再檢測待檢測程序是否全部落在內(nèi)存塊的合法范圍內(nèi),來檢測該待檢測程序是否發(fā)生內(nèi)存越界,實現(xiàn)了內(nèi)存越界的快速定位,提高了整個執(zhí)行該待檢測程序的系統(tǒng)的容錯性、可靠性和可用性。
[0064]如圖3所示,依據(jù)本發(fā)明實施例的另一個方面,還提供了一種內(nèi)存越界的檢測裝置,包括:
[0065]第一獲取模塊101,用于獲取分配給待檢測程序的內(nèi)存塊的起始地址和內(nèi)存管理頭信息,內(nèi)存管理頭信息包括:內(nèi)存塊的容量以及釋放標記;
[0066]第一檢測模塊102,用于檢測釋放標記,若釋放標記指示內(nèi)存塊已被釋放,則判斷待檢測程序發(fā)生內(nèi)存越界;
[0067]第二獲取模塊103,用于當釋放標記指示內(nèi)存塊未被釋放時,獲取待檢測程序的第一偏向地址,第一偏向地址為距起始地址最遠的偏向地址;
[0068]第二檢測模塊104,用于根據(jù)內(nèi)存塊的容量和起始地址,檢測第一偏向地址是否落在內(nèi)存塊的內(nèi)存范圍內(nèi);若第一偏向地址未落在內(nèi)存塊的內(nèi)存范圍內(nèi),則判斷待檢測程序發(fā)生內(nèi)存越界。
[0069]進一步地,該內(nèi)存越界的檢測裝置還包括:
[0070]申請模塊,用于根據(jù)待檢測程序所包含的操作信息申請一內(nèi)存塊。
[0071]進一步地,該內(nèi)存越界的檢測裝置還包括:
[0072]操作模塊,用于根據(jù)待檢測程序所包含的操作信息對內(nèi)存塊進行操作。
[0073]進一步地,該內(nèi)存越界的檢測裝置還包括:
[0074]處理模塊,用于記錄發(fā)生內(nèi)存越界的待檢測程序,并掛起執(zhí)行待檢測程序的進程。
[0075]進一步地,該內(nèi)存越界的檢測裝置還包括:
[0076]擴展模塊,用于獲取輸入的處理策略,并根據(jù)處理策略對待檢測程序進行相應操作。
[0077]進一步地,第一獲取模塊包括:
[0078]接收單元,用于接收待檢測程序的內(nèi)存管理頭地址;
[0079]獲取單元,用于根據(jù)內(nèi)存管理頭地址查找內(nèi)存塊的起始地址,并讀取存儲在內(nèi)存塊管理頭地址上的內(nèi)存管理頭信息。
[0080]需要說明的是,該裝置是與上述內(nèi)存越界的檢測方法對應的裝置,上述方法實施例中所有實現(xiàn)方式均適用于該裝置的實施例中,也能達到相同的技術(shù)效果。
[0081]以上所述的是本發(fā)明的優(yōu)選實施方式,應當指出對于本技術(shù)領(lǐng)域的普通人員來說,在不脫離本發(fā)明所述的原理前提下還可以作出若干改進和潤飾,這些改進和潤飾也在本發(fā)明的保護范圍內(nèi)。
【主權(quán)項】
1.一種內(nèi)存越界的檢測方法,其特征在于,包括: 獲取分配給待檢測程序的內(nèi)存塊的起始地址和內(nèi)存管理頭信息,所述內(nèi)存管理頭信息包括:所述內(nèi)存塊的容量以及釋放標記; 檢測所述釋放標記,若所述釋放標記指示所述內(nèi)存塊已被釋放,則判斷所述待檢測程序發(fā)生內(nèi)存越界; 若所述釋放標記指示所述內(nèi)存塊未被釋放,則獲取所述待檢測程序的第一偏向地址,所述第一偏向地址為距所述起始地址最遠的偏向地址; 根據(jù)所述內(nèi)存塊的容量和起始地址,檢測所述第一偏向地址是否落在所述內(nèi)存塊的內(nèi)存范圍內(nèi);若所述第一偏向地址未落在所述內(nèi)存塊的內(nèi)存范圍內(nèi),則判斷所述待檢測程序發(fā)生內(nèi)存越界。2.根據(jù)權(quán)利要求1所述的內(nèi)存越界的檢測方法,其特征在于,在獲取分配給待檢測程序的內(nèi)存塊的起始地址和內(nèi)存管理頭信息的步驟之前,還包括: 根據(jù)所述待檢測程序所包含的操作信息申請一內(nèi)存塊。3.根據(jù)權(quán)利要求1或2所述的內(nèi)存越界的檢測方法,其特征在于,在獲取分配給待檢測程序的內(nèi)存塊的起始地址和內(nèi)存管理頭信息的步驟之后,還包括: 根據(jù)所述待檢測程序所包含的操作信息對所述內(nèi)存塊進行操作。4.根據(jù)權(quán)利要求1所述的內(nèi)存越界的檢測方法,其特征在于,在判斷所述待檢測程序發(fā)生內(nèi)存越界的步驟之后,還包括: 記錄發(fā)生內(nèi)存越界的所述待檢測程序,并掛起執(zhí)行所述待檢測程序的進程。5.根據(jù)權(quán)利要求1所述的內(nèi)存越界的檢測方法,其特征在于,在判斷所述待檢測程序發(fā)生內(nèi)存越界的步驟之后,還包括: 獲取輸入的處理策略,并根據(jù)所述處理策略對所述待檢測程序進行相應操作。6.根據(jù)權(quán)利要求1所述的內(nèi)存越界的檢測方法,其特征在于,獲取分配給待檢測程序的內(nèi)存塊的起始地址和內(nèi)存管理頭信息的步驟包括: 接收所述待檢測程序的內(nèi)存管理頭地址; 根據(jù)所述內(nèi)存管理頭地址查找所述內(nèi)存塊的起始地址,并讀取存儲在所述內(nèi)存塊管理頭地址上的內(nèi)存管理頭信息。7.一種內(nèi)存越界的檢測裝置,其特征在于,包括: 第一獲取模塊,用于獲取分配給待檢測程序的內(nèi)存塊的起始地址和內(nèi)存管理頭信息,所述內(nèi)存管理頭信息包括:所述內(nèi)存塊的容量以及釋放標記; 第一檢測模塊,用于檢測所述釋放標記,若所述釋放標記指示所述內(nèi)存塊已被釋放,則判斷所述待檢測程序發(fā)生內(nèi)存越界; 第二獲取模塊,用于當所述釋放標記指示所述內(nèi)存塊未被釋放時,獲取所述待檢測程序的第一偏向地址,所述第一偏向地址為距所述起始地址最遠的偏向地址; 第二檢測模塊,用于根據(jù)所述內(nèi)存塊的容量和起始地址,檢測所述第一偏向地址是否落在所述內(nèi)存塊的內(nèi)存范圍內(nèi);若所述第一偏向地址未落在所述內(nèi)存塊的內(nèi)存范圍內(nèi),則判斷所述待檢測程序發(fā)生內(nèi)存越界。8.根據(jù)權(quán)利要求7所述的內(nèi)存越界的檢測裝置,其特征在于,還包括: 申請模塊,用于根據(jù)所述待檢測程序所包含的操作信息申請一內(nèi)存塊。9.根據(jù)權(quán)利要求7或8所述的內(nèi)存越界的檢測裝置,其特征在于,還包括: 操作模塊,用于根據(jù)所述待檢測程序所包含的操作信息對所述內(nèi)存塊進行操作。10.根據(jù)權(quán)利要求7所述的內(nèi)存越界的檢測裝置,其特征在于,還包括: 處理模塊,用于記錄發(fā)生內(nèi)存越界的所述待檢測程序,并掛起執(zhí)行所述待檢測程序的進程。11.根據(jù)權(quán)利要求7所述的內(nèi)存越界的檢測裝置,其特征在于,還包括: 擴展模塊,用于獲取輸入的處理策略,并根據(jù)所述處理策略對所述待檢測程序進行相應操作。12.根據(jù)權(quán)利要求7所述的內(nèi)存越界的檢測裝置,其特征在于,所述第一獲取模塊包括: 接收單元,用于接收所述待檢測程序的內(nèi)存管理頭地址; 獲取單元,用于根據(jù)所述內(nèi)存管理頭地址查找所述內(nèi)存塊的起始地址,并讀取存儲在所述內(nèi)存塊管理頭地址上的內(nèi)存管理頭信息。
【文檔編號】G06F11/36GK105988921SQ201510063377
【公開日】2016年10月5日
【申請日】2015年2月6日
【發(fā)明人】趙東林
【申請人】中興通訊股份有限公司