欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種用于檢測(cè)與內(nèi)存空間釋放相關(guān)的缺陷的方法及系統(tǒng)與流程

文檔序號(hào):11133834閱讀:250來(lái)源:國(guó)知局
一種用于檢測(cè)與內(nèi)存空間釋放相關(guān)的缺陷的方法及系統(tǒng)與制造工藝

本發(fā)明涉及代碼檢測(cè)領(lǐng)域,并且更具體地,涉及一種用于檢測(cè)與內(nèi)存空間釋放相關(guān)的缺陷的方法及系統(tǒng)。



背景技術(shù):

隨著網(wǎng)絡(luò)技術(shù)和應(yīng)用的飛速發(fā)展,軟件系統(tǒng)安全正面臨著前所未有的挑戰(zhàn)。網(wǎng)絡(luò)化和互聯(lián)互通性已經(jīng)成為當(dāng)前軟件系統(tǒng)的發(fā)展方向。軟件系統(tǒng)與互聯(lián)網(wǎng)或其他網(wǎng)絡(luò)的互連,使軟件系統(tǒng)遭受攻擊的概率增大,也導(dǎo)致了軟件系統(tǒng)面臨的安全威脅空前地增加。另一方面,隨著構(gòu)建在軟件系統(tǒng)之上的各種業(yè)務(wù)應(yīng)用的不斷豐富,以及軟件程序復(fù)雜程度的不斷提高,軟件系統(tǒng)中隱藏的各種安全隱患也越來(lái)越多,并且通常難以被發(fā)現(xiàn)和消除。

目前,針對(duì)軟件中存在的安全問(wèn)題進(jìn)行檢測(cè)逐漸成為軟件系統(tǒng)領(lǐng)域的熱點(diǎn)?;谠创a的靜態(tài)分析方式是檢測(cè)軟件源代碼安全問(wèn)題的有效手段。靜態(tài)分析是在不執(zhí)行程序的情況下對(duì)軟件源代碼進(jìn)行分析的技術(shù),其通過(guò)對(duì)當(dāng)前狀態(tài)及趨勢(shì)的分析來(lái)預(yù)判所有軟件未來(lái)運(yùn)行的可能情況。源代碼靜態(tài)分析方法包括公理化語(yǔ)義、操作語(yǔ)義、抽象解釋理論等,并且常見(jiàn)的實(shí)現(xiàn)技術(shù)有模型檢驗(yàn)、數(shù)據(jù)流分析、抽象解釋、謂詞轉(zhuǎn)換、類型推導(dǎo)、符號(hào)執(zhí)行等。

符號(hào)執(zhí)行是指在不執(zhí)行程序的前提下,用符號(hào)值表示變量的值,然后模擬程序執(zhí)行來(lái)進(jìn)行相關(guān)分析的技術(shù)。符號(hào)執(zhí)行可以分析代碼的所有語(yǔ)義信息,也可以只分析部分語(yǔ)義信息。然而,目前的符號(hào)執(zhí)行技術(shù)并未針對(duì)與內(nèi)存空間釋放相關(guān)問(wèn)題的有效檢測(cè)手段,而內(nèi)存空間釋放問(wèn)題通常會(huì)造成軟件系統(tǒng)出現(xiàn)嚴(yán)重故障。



技術(shù)實(shí)現(xiàn)要素:

根據(jù)本發(fā)明的一個(gè)方面,提供一種用于檢測(cè)與內(nèi)存空間釋放相關(guān)的缺陷的方法,所述方法包括:

根據(jù)待檢測(cè)源代碼的編程語(yǔ)言的文法確定多個(gè)程序點(diǎn);

基于符號(hào)執(zhí)行的檢測(cè)邏輯從所述多個(gè)程序點(diǎn)中確定需要進(jìn)行檢測(cè)的多個(gè)檢測(cè)點(diǎn);

以所述多個(gè)檢測(cè)點(diǎn)中的函數(shù)調(diào)用檢測(cè)點(diǎn)作為檢測(cè)邏輯的起點(diǎn)進(jìn)行缺陷檢測(cè);

調(diào)用內(nèi)存釋放函數(shù)并且確定所述內(nèi)存釋放函數(shù)中的釋放參數(shù)是否是內(nèi)存地址;以及

在所述釋放參數(shù)是內(nèi)存地址的情況下,根據(jù)所述釋放參數(shù)的符號(hào)值來(lái)確定檢測(cè)結(jié)果。

優(yōu)選地,其中根據(jù)所述釋放參數(shù)的符號(hào)值來(lái)確定檢測(cè)結(jié)果包括:當(dāng)符號(hào)值的狀態(tài)為已釋放狀態(tài)時(shí),確定待檢測(cè)源代碼存在重復(fù)釋放缺陷。

優(yōu)選地,其中根據(jù)所述釋放參數(shù)的符號(hào)值來(lái)確定檢測(cè)結(jié)果包括:當(dāng)符號(hào)值所指示的釋放內(nèi)存類型與分配內(nèi)存類型不匹配時(shí),確定待檢測(cè)源代碼存在釋放類型不匹配缺陷。

優(yōu)選地,其中根據(jù)所述釋放參數(shù)的符號(hào)值來(lái)確定檢測(cè)結(jié)果包括:當(dāng)符號(hào)值所指示的釋放位置為所分配位置的偏移時(shí),確定待檢測(cè)源代碼存在釋放位置偏移缺陷。

優(yōu)選地,在以所述多個(gè)檢測(cè)點(diǎn)中的函數(shù)調(diào)用檢測(cè)點(diǎn)作為檢測(cè)邏輯的起點(diǎn)進(jìn)行缺陷檢測(cè)之后還包括:調(diào)用內(nèi)存分配函數(shù)并且設(shè)置符號(hào)值,將內(nèi)存分配所占用的內(nèi)存大小更新為相應(yīng)的尺寸參數(shù)。

優(yōu)選地,在內(nèi)存分配結(jié)束后,將符號(hào)值的狀態(tài)設(shè)置為已分配并且對(duì)分配內(nèi)存類型進(jìn)行記錄。

優(yōu)選地,所述內(nèi)存地址包括:基地址、??臻g地址或分配空間地址。

優(yōu)選地,當(dāng)所述釋放參數(shù)不是內(nèi)存地址時(shí),確定待檢測(cè)源代碼存在錯(cuò)誤釋放缺陷。

根據(jù)本發(fā)明的另一方面,提供一種用于檢測(cè)與內(nèi)存空間釋放相關(guān)的缺陷的系統(tǒng),所述系統(tǒng)包括:

初始化單元,根據(jù)待檢測(cè)源代碼的編程語(yǔ)言的文法確定多個(gè)程序點(diǎn);基于符號(hào)執(zhí)行的檢測(cè)邏輯從所述多個(gè)程序點(diǎn)中確定需要進(jìn)行檢測(cè)的多個(gè)檢測(cè)點(diǎn);以及

缺陷檢測(cè)單元,以所述多個(gè)檢測(cè)點(diǎn)中的函數(shù)調(diào)用檢測(cè)點(diǎn)作為檢測(cè)邏輯的起點(diǎn)進(jìn)行缺陷檢測(cè);調(diào)用內(nèi)存釋放函數(shù)并且確定所述內(nèi)存釋放函數(shù)中的釋放參數(shù)是否是內(nèi)存地址;在所述釋放參數(shù)是內(nèi)存地址的情況下,根據(jù)所述釋放參數(shù)的符號(hào)值來(lái)確定檢測(cè)結(jié)果。

優(yōu)選地,其中根據(jù)所述釋放參數(shù)的符號(hào)值來(lái)確定檢測(cè)結(jié)果包括:當(dāng)符號(hào)值的狀態(tài)為已釋放狀態(tài)時(shí),缺陷檢測(cè)單元確定待檢測(cè)源代碼存在重復(fù)釋放缺陷。

優(yōu)選地,其中根據(jù)所述釋放參數(shù)的符號(hào)值來(lái)確定檢測(cè)結(jié)果包括:當(dāng)符號(hào)值所指示的釋放內(nèi)存類型與分配內(nèi)存類型不匹配時(shí),缺陷檢測(cè)單元確定待檢測(cè)源代碼存在釋放類型不匹配缺陷。

優(yōu)選地,其中根據(jù)所述釋放參數(shù)的符號(hào)值來(lái)確定檢測(cè)結(jié)果包括:當(dāng)符號(hào)值所指示的釋放位置為所分配位置的偏移時(shí),缺陷檢測(cè)單元確定待檢測(cè)源代碼存在釋放位置偏移缺陷。

優(yōu)選地,缺陷檢測(cè)單元還能夠調(diào)用內(nèi)存分配函數(shù)并且設(shè)置符號(hào)值,將內(nèi)存分配所占用的內(nèi)存大小更新為相應(yīng)的尺寸參數(shù)。

優(yōu)選地,在內(nèi)存分配結(jié)束后,缺陷檢測(cè)單元將符號(hào)值的狀態(tài)設(shè)置為已分配并且對(duì)分配內(nèi)存類型進(jìn)行記錄。

優(yōu)選地,所述內(nèi)存地址包括:基地址、棧空間地址或分配空間地址。

優(yōu)選地,當(dāng)所述釋放參數(shù)不是內(nèi)存地址時(shí),缺陷檢測(cè)單元確定待檢測(cè)源代碼存在錯(cuò)誤釋放缺陷。

附圖說(shuō)明

通過(guò)參考下面的附圖,可以更為完整地理解本發(fā)明的示例性實(shí)施方式:

圖1為根據(jù)本發(fā)明實(shí)施方式的用于檢測(cè)與內(nèi)存空間釋放相關(guān)缺陷的方法的流程圖;

圖2為根據(jù)本發(fā)明實(shí)施方式的用于檢測(cè)與內(nèi)存空間釋放相關(guān)缺陷的系統(tǒng)的結(jié)構(gòu)示意圖;以及

圖3為根據(jù)本發(fā)明實(shí)施方式的在函數(shù)調(diào)用檢測(cè)點(diǎn)處執(zhí)行的檢測(cè)方法的流程圖。

具體實(shí)施方式

現(xiàn)在參考附圖介紹本發(fā)明的示例性實(shí)施方式,然而,本發(fā)明可以用許多不同的形式來(lái)實(shí)施,并且不局限于此處描述的實(shí)施例,提供這些實(shí)施例是為了詳盡地且完全地公開(kāi)本發(fā)明,并且向所屬技術(shù)領(lǐng)域的技術(shù)人員充分傳達(dá)本發(fā)明的范圍。對(duì)于表示在附圖中的示例性實(shí)施方式中的術(shù)語(yǔ)并不是對(duì)本發(fā)明的限定。在附圖中,相同的單元/元件使用相同的附圖標(biāo)記。

除非另有說(shuō)明,此處使用的術(shù)語(yǔ)(包括科技術(shù)語(yǔ))對(duì)所屬技術(shù)領(lǐng)域的技術(shù)人員具有通常的理解含義。另外,可以理解的是,以通常使用的詞典限定的術(shù)語(yǔ),應(yīng)當(dāng)被理解為與其相關(guān)領(lǐng)域的語(yǔ)境具有一致的含義,而不應(yīng)該被理解為理想化的或過(guò)于正式的意義。

圖1為根據(jù)本發(fā)明實(shí)施方式的用于檢測(cè)與內(nèi)存空間釋放相關(guān)缺陷的方法100的流程圖。在符號(hào)執(zhí)行的過(guò)程中,方法100首先根據(jù)待檢測(cè)源代碼的編程語(yǔ)言(例如,C/C++)的特性確定各種程序點(diǎn)(Program Point),然后再根據(jù)符號(hào)執(zhí)行的特性和檢測(cè)邏輯的需要,進(jìn)一步抽象出需要進(jìn)行檢測(cè)相關(guān)邏輯的檢測(cè)點(diǎn)(Check Point)。通常,一種具體的缺陷檢測(cè)需要在幾個(gè)檢測(cè)點(diǎn)上分別實(shí)現(xiàn)相應(yīng)的檢測(cè)邏輯。這樣,在符號(hào)執(zhí)行的過(guò)程中,每執(zhí)行到一個(gè)檢測(cè)點(diǎn),引擎會(huì)嘗試調(diào)用各個(gè)檢測(cè)器在當(dāng)前檢測(cè)點(diǎn)的檢測(cè)邏輯。除了主要檢測(cè)點(diǎn)之外的其他檢測(cè)點(diǎn)上的檢測(cè)邏輯通常是可以通過(guò)調(diào)用已知工具來(lái)實(shí)現(xiàn)。而一種具體的缺陷檢測(cè)的主要檢測(cè)邏輯需要在主要檢測(cè)點(diǎn)上執(zhí)行。因此,在確定了主要檢測(cè)點(diǎn)上的檢測(cè)邏輯后,即可完成對(duì)某一具體缺陷的檢測(cè)。此外,任何一種缺陷的檢測(cè)都不是完全獨(dú)立的,都依賴于引擎內(nèi)部或者其他檢測(cè)器的某些建模功能。

優(yōu)選地,方法100從步驟101處開(kāi)始。在步驟101處,根據(jù)待檢測(cè)源代碼的編程語(yǔ)言的文法確定多個(gè)程序點(diǎn)。通常,為了確定檢測(cè)點(diǎn),必須首先確定程序點(diǎn)。程序點(diǎn)的確定依賴于編程語(yǔ)言各自不同的文法。為了準(zhǔn)確地確定程序點(diǎn),通常要對(duì)待檢測(cè)源代碼進(jìn)行解釋和分析。這種分析和解釋包括:讀取程序源代碼并且提取程序中的信息要素。這主要是通過(guò)詞法分析、語(yǔ)法分析和抽象語(yǔ)法樹(shù)來(lái)實(shí)現(xiàn)。符號(hào)執(zhí)行的主要功能是借助于約束求解器對(duì)抽象語(yǔ)法樹(shù)進(jìn)行遍歷,完成對(duì)路徑的符號(hào)執(zhí)行,符號(hào)執(zhí)行階段由路徑條件的約束求解和路徑的符號(hào)執(zhí)行構(gòu)成。

優(yōu)選地,為了根據(jù)待檢測(cè)源代碼的編程語(yǔ)言的文法確定多個(gè)程序點(diǎn),通常要完成如下步驟:將被測(cè)代碼輸入測(cè)試工具中;根據(jù)待檢測(cè)源代碼的編程語(yǔ)言(例如,C/C++)的言文法自定義一個(gè)關(guān)鍵詞列表,并對(duì)照關(guān)鍵詞列表對(duì)被測(cè)試代碼進(jìn)行詞法分析;根據(jù)待檢測(cè)源代碼的編程語(yǔ)言的文法定義函數(shù)結(jié)構(gòu)模塊、構(gòu)造抽象語(yǔ)法樹(shù)的生成算法,并對(duì)照詞法分析的結(jié)果,利用“自下而上”的方法(即從語(yǔ)法樹(shù)的末端開(kāi)始,向上“歸約”)。對(duì)被測(cè)代碼進(jìn)行語(yǔ)法分析,最終得到程序靜態(tài)分析樹(shù)作為一個(gè)中間表示形式,并且利用文檔進(jìn)行存儲(chǔ);根據(jù)詞法分析結(jié)果,以特定結(jié)構(gòu)體的形式(包含變量名稱及變量的符號(hào)值)建立變量列表并且以鏈表的形式存儲(chǔ)當(dāng)前路徑條件;根據(jù)語(yǔ)法分析結(jié)果,對(duì)抽象語(yǔ)法樹(shù)進(jìn)行中序遍歷,從而確定多個(gè)程序點(diǎn)。

優(yōu)選地,在步驟102,基于符號(hào)執(zhí)行的檢測(cè)邏輯從所述多個(gè)程序點(diǎn)中確定需要進(jìn)行檢測(cè)的多個(gè)檢測(cè)點(diǎn)。通常,為了檢測(cè)數(shù)組越界缺陷,可能需要在多個(gè)檢測(cè)點(diǎn)處執(zhí)行檢測(cè)邏輯。并且,多個(gè)檢測(cè)點(diǎn)通常來(lái)自于上面確定的多個(gè)程序點(diǎn)。為了能夠準(zhǔn)確地確定檢測(cè)點(diǎn),本發(fā)明基于符號(hào)執(zhí)行的檢測(cè)邏輯來(lái)確定需要進(jìn)行檢測(cè)的多個(gè)檢測(cè)點(diǎn)。

優(yōu)選地,在步驟103,以所述多個(gè)檢測(cè)點(diǎn)中的內(nèi)存讀寫檢測(cè)點(diǎn)作為檢測(cè)邏輯的起點(diǎn)進(jìn)行缺陷檢測(cè)。通常除了主要檢測(cè)點(diǎn)之外的其他檢測(cè)點(diǎn)上的檢測(cè)邏輯通常是可以通過(guò)調(diào)用已知工具來(lái)實(shí)現(xiàn)。而特定缺陷檢測(cè)的主要檢測(cè)邏輯需要在主要檢測(cè)點(diǎn)上執(zhí)行。因此,本發(fā)明以多個(gè)檢測(cè)點(diǎn)中的函數(shù)調(diào)用檢測(cè)點(diǎn)作為主要檢測(cè)點(diǎn)。并且,將主要檢測(cè)點(diǎn),即函數(shù)調(diào)用檢測(cè)點(diǎn),作為檢測(cè)邏輯的起點(diǎn)進(jìn)行缺陷檢測(cè)。

優(yōu)選地,在步驟104,調(diào)用內(nèi)存釋放函數(shù)并且確定所述內(nèi)存釋放函數(shù)中的釋放參數(shù)是否是內(nèi)存地址。本發(fā)明以函數(shù)調(diào)用檢測(cè)點(diǎn)作為起點(diǎn)進(jìn)行缺陷檢測(cè)(即執(zhí)行檢測(cè)邏輯),并且在函數(shù)調(diào)用檢測(cè)點(diǎn)之后根據(jù)函數(shù)類型的不同來(lái)執(zhí)行不同的邏輯。優(yōu)選地,函數(shù)類型包括:內(nèi)存分配函數(shù)、內(nèi)存重新分配函數(shù)以及內(nèi)存釋放函數(shù)。其中,內(nèi)存分配函數(shù)的作用是根據(jù)分配請(qǐng)求對(duì)內(nèi)存空間進(jìn)行分配,從而使得相應(yīng)的程序/應(yīng)用能夠得到用于執(zhí)行代碼的內(nèi)存空間。內(nèi)存重新分配函數(shù)用于對(duì)其他程序/應(yīng)用釋放的內(nèi)存空間進(jìn)行重新分配,從而實(shí)現(xiàn)內(nèi)存空間的有效利用。內(nèi)存釋放函數(shù)用于對(duì)特定程序/應(yīng)用不再需要使用的內(nèi)存空間進(jìn)行釋放,從而使得所釋放的內(nèi)存空間能夠被重新分配給其他程序/應(yīng)用。

優(yōu)選地,方法100進(jìn)行缺陷檢測(cè)時(shí)主要針對(duì)內(nèi)存釋放函數(shù)進(jìn)行,缺陷問(wèn)題出現(xiàn)在內(nèi)存釋放函數(shù)中。因此,在步驟104,調(diào)用內(nèi)存釋放函數(shù)以進(jìn)行缺陷檢測(cè)。在調(diào)用內(nèi)存釋放函數(shù)后,必須確定內(nèi)存釋放函數(shù)中的釋放參數(shù)是否是內(nèi)存地址。這是因?yàn)槿绻麅?nèi)存釋放函數(shù)中的釋放參數(shù)不是內(nèi)存地址,那么也就不存在對(duì)內(nèi)存空間進(jìn)行釋放的可能,可以將這種問(wèn)題直接確定為錯(cuò)誤的釋放。其中內(nèi)存地址包括:基地址、棧空間地址或分配空間地址等。內(nèi)存釋放函數(shù)中的釋放參數(shù)為基地址、棧空間地址或分配空間地址等時(shí),可以確定內(nèi)存釋放函數(shù)不存在錯(cuò)誤的釋放的缺陷。

優(yōu)選地,在步驟105,在所述釋放參數(shù)是內(nèi)存地址的情況下,根據(jù)所述釋放參數(shù)的符號(hào)值來(lái)確定檢測(cè)結(jié)果。其中根據(jù)所述釋放參數(shù)的符號(hào)值來(lái)確定檢測(cè)結(jié)果包括:當(dāng)符號(hào)值的狀態(tài)為已釋放狀態(tài)時(shí),確定待檢測(cè)源代碼存在重復(fù)釋放缺陷;當(dāng)符號(hào)值所指示的釋放內(nèi)存類型與分配內(nèi)存類型不匹配時(shí),確定待檢測(cè)源代碼存在釋放類型不匹配缺陷;以及當(dāng)符號(hào)值所指示的釋放位置為所分配位置的偏移時(shí),確定待檢測(cè)源代碼存在釋放位置偏移缺陷。

優(yōu)選地,在以所述多個(gè)檢測(cè)點(diǎn)中的函數(shù)調(diào)用檢測(cè)點(diǎn)作為檢測(cè)邏輯的起點(diǎn)進(jìn)行缺陷檢測(cè)之后還包括:調(diào)用內(nèi)存分配函數(shù)并且設(shè)置符號(hào)值,將內(nèi)存分配所占用的內(nèi)存大小更新為相應(yīng)的尺寸參數(shù)。優(yōu)選地,在內(nèi)存分配結(jié)束后,將符號(hào)值的狀態(tài)設(shè)置為已分配并且對(duì)分配內(nèi)存類型進(jìn)行記錄。

圖2為根據(jù)本發(fā)明實(shí)施方式的用于檢測(cè)與內(nèi)存空間釋放相關(guān)的缺陷的系統(tǒng)200的結(jié)構(gòu)示意圖。在符號(hào)執(zhí)行的過(guò)程中,系統(tǒng)200首先根據(jù)待檢測(cè)源代碼的編程語(yǔ)言(例如,C/C++)的特性確定各種程序點(diǎn),然后再根據(jù)符號(hào)執(zhí)行的特性和檢測(cè)邏輯的需要,進(jìn)一步抽象出需要進(jìn)行檢測(cè)相關(guān)邏輯的檢測(cè)點(diǎn)。通常,一種具體的缺陷檢測(cè)需要在幾個(gè)檢測(cè)點(diǎn)上分別實(shí)現(xiàn)相應(yīng)的檢測(cè)邏輯。這樣,在符號(hào)執(zhí)行的過(guò)程中,每執(zhí)行到一個(gè)檢測(cè)點(diǎn),引擎會(huì)嘗試調(diào)用各個(gè)檢測(cè)器在當(dāng)前檢測(cè)點(diǎn)的檢測(cè)邏輯。除了主要檢測(cè)點(diǎn)之外的其他檢測(cè)點(diǎn)上的檢測(cè)邏輯通常是可以通過(guò)調(diào)用已知工具來(lái)實(shí)現(xiàn)。而一種具體的缺陷檢測(cè)的主要檢測(cè)邏輯需要在主要檢測(cè)點(diǎn)上執(zhí)行。因此,在確定了主要檢測(cè)點(diǎn)上的檢測(cè)邏輯后,即可完成對(duì)某一具體缺陷的檢測(cè)。此外,任何一種缺陷的檢測(cè)都不是完全獨(dú)立的,都依賴于引擎內(nèi)部或者其他檢測(cè)器的某些建模功能。

優(yōu)選地,系統(tǒng)200包括初始化單元201和缺陷檢測(cè)單元202。優(yōu)選地,初始化單元201根據(jù)待檢測(cè)源代碼的編程語(yǔ)言的文法確定多個(gè)程序點(diǎn)。通常,為了確定檢測(cè)點(diǎn),必須首先確定程序點(diǎn)。程序點(diǎn)的確定依賴于編程語(yǔ)言各自不同的文法。為了準(zhǔn)確地確定程序點(diǎn),通常要對(duì)待檢測(cè)源代碼進(jìn)行解釋和分析。這種分析和解釋包括:讀取程序源代碼并且提取程序中的信息要素。這主要是通過(guò)詞法分析、語(yǔ)法分析和抽象語(yǔ)法樹(shù)來(lái)實(shí)現(xiàn)。符號(hào)執(zhí)行的主要功能是借助于約束求解器對(duì)抽象語(yǔ)法樹(shù)進(jìn)行遍歷,完成對(duì)路徑的符號(hào)執(zhí)行,符號(hào)執(zhí)行階段由路徑條件的約束求解和路徑的符號(hào)執(zhí)行構(gòu)成。

優(yōu)選地,初始化單元201為了根據(jù)待檢測(cè)源代碼的編程語(yǔ)言的文法確定多個(gè)程序點(diǎn),通常要完成如下步驟:將被測(cè)代碼輸入測(cè)試工具中;根據(jù)待檢測(cè)源代碼的編程語(yǔ)言(例如,C/C++)的言文法自定義一個(gè)關(guān)鍵詞列表,并對(duì)照關(guān)鍵詞列表對(duì)被測(cè)試代碼進(jìn)行詞法分析;根據(jù)待檢測(cè)源代碼的編程語(yǔ)言的文法定義函數(shù)結(jié)構(gòu)模塊、構(gòu)造抽象語(yǔ)法樹(shù)的生成算法,并對(duì)照詞法分析的結(jié)果,利用“自下而上”的方法(即從語(yǔ)法樹(shù)的末端開(kāi)始,向上“歸約”)。對(duì)被測(cè)代碼進(jìn)行語(yǔ)法分析,最終得到程序靜態(tài)分析樹(shù)作為一個(gè)中間表示形式,并且利用文檔進(jìn)行存儲(chǔ);根據(jù)詞法分析結(jié)果,以特定結(jié)構(gòu)體的形式(包含變量名稱及變量的符號(hào)值)建立變量列表并且以鏈表的形式存儲(chǔ)當(dāng)前路徑條件;根據(jù)語(yǔ)法分析結(jié)果,對(duì)抽象語(yǔ)法樹(shù)進(jìn)行中序遍歷,從而確定多個(gè)程序點(diǎn)。

優(yōu)選地,初始化單元201基于符號(hào)執(zhí)行的檢測(cè)邏輯從所述多個(gè)程序點(diǎn)中確定需要進(jìn)行檢測(cè)的多個(gè)檢測(cè)點(diǎn)。通常,為了檢測(cè)數(shù)組越界缺陷,可能需要在多個(gè)檢測(cè)點(diǎn)處執(zhí)行檢測(cè)邏輯。并且,多個(gè)檢測(cè)點(diǎn)通常來(lái)自于上面確定的多個(gè)程序點(diǎn)。為了能夠準(zhǔn)確地確定檢測(cè)點(diǎn),本發(fā)明基于符號(hào)執(zhí)行的檢測(cè)邏輯來(lái)確定需要進(jìn)行檢測(cè)的多個(gè)檢測(cè)點(diǎn)。

優(yōu)選地,缺陷檢測(cè)單元202以所述多個(gè)檢測(cè)點(diǎn)中的內(nèi)存讀寫檢測(cè)點(diǎn)作為檢測(cè)邏輯的起點(diǎn)進(jìn)行缺陷檢測(cè)。通常除了主要檢測(cè)點(diǎn)之外的其他檢測(cè)點(diǎn)上的檢測(cè)邏輯通常是可以通過(guò)調(diào)用已知工具來(lái)實(shí)現(xiàn)。而特定缺陷檢測(cè)的主要檢測(cè)邏輯需要在主要檢測(cè)點(diǎn)上執(zhí)行。因此,本發(fā)明以多個(gè)檢測(cè)點(diǎn)中的函數(shù)調(diào)用檢測(cè)點(diǎn)作為主要檢測(cè)點(diǎn)。并且,將主要檢測(cè)點(diǎn),即函數(shù)調(diào)用檢測(cè)點(diǎn),作為檢測(cè)邏輯的起點(diǎn)進(jìn)行缺陷檢測(cè)。

優(yōu)選地,缺陷檢測(cè)單元202調(diào)用內(nèi)存釋放函數(shù)并且確定所述內(nèi)存釋放函數(shù)中的釋放參數(shù)是否是內(nèi)存地址。本發(fā)明以函數(shù)調(diào)用檢測(cè)點(diǎn)作為起點(diǎn)進(jìn)行缺陷檢測(cè)(即執(zhí)行檢測(cè)邏輯),并且在函數(shù)調(diào)用檢測(cè)點(diǎn)之后根據(jù)函數(shù)類型的不同來(lái)執(zhí)行不同的邏輯。優(yōu)選地,函數(shù)類型包括:內(nèi)存分配函數(shù)、內(nèi)存重新分配函數(shù)以及內(nèi)存釋放函數(shù)。其中,內(nèi)存分配函數(shù)的作用是根據(jù)分配請(qǐng)求對(duì)內(nèi)存空間進(jìn)行分配,從而使得相應(yīng)的程序/應(yīng)用能夠得到用于執(zhí)行代碼的內(nèi)存空間。內(nèi)存重新分配函數(shù)用于對(duì)其他程序/應(yīng)用釋放的內(nèi)存空間進(jìn)行重新分配,從而實(shí)現(xiàn)內(nèi)存空間的有效利用。內(nèi)存釋放函數(shù)用于對(duì)特定程序/應(yīng)用不再需要使用的內(nèi)存空間進(jìn)行釋放,從而使得所釋放的內(nèi)存空間能夠被重新分配給其他程序/應(yīng)用。

優(yōu)選地,系統(tǒng)200進(jìn)行缺陷檢測(cè)時(shí)主要針對(duì)內(nèi)存釋放函數(shù)進(jìn)行,缺陷問(wèn)題出現(xiàn)在內(nèi)存釋放函數(shù)中。因此,缺陷檢測(cè)單元202調(diào)用內(nèi)存釋放函數(shù)以進(jìn)行缺陷檢測(cè)。在調(diào)用內(nèi)存釋放函數(shù)后,必須確定內(nèi)存釋放函數(shù)中的釋放參數(shù)是否是內(nèi)存地址。這是因?yàn)槿绻麅?nèi)存釋放函數(shù)中的釋放參數(shù)不是內(nèi)存地址,那么也就不存在對(duì)內(nèi)存空間進(jìn)行釋放的可能,可以將這種問(wèn)題直接確定為錯(cuò)誤的釋放。其中內(nèi)存地址包括:基地址、??臻g地址或分配空間地址等。內(nèi)存釋放函數(shù)中的釋放參數(shù)為基地址、??臻g地址或分配空間地址等時(shí),可以確定內(nèi)存釋放函數(shù)不存在錯(cuò)誤的釋放的缺陷。

優(yōu)選地,缺陷檢測(cè)單元202在所述釋放參數(shù)是內(nèi)存地址的情況下,根據(jù)所述釋放參數(shù)的符號(hào)值來(lái)確定檢測(cè)結(jié)果。其中根據(jù)所述釋放參數(shù)的符號(hào)值來(lái)確定檢測(cè)結(jié)果包括:當(dāng)符號(hào)值的狀態(tài)為已釋放狀態(tài)時(shí),確定待檢測(cè)源代碼存在重復(fù)釋放缺陷;當(dāng)符號(hào)值所指示的釋放內(nèi)存類型與分配內(nèi)存類型不匹配時(shí),確定待檢測(cè)源代碼存在釋放類型不匹配缺陷;以及當(dāng)符號(hào)值所指示的釋放位置為所分配位置的偏移時(shí),確定待檢測(cè)源代碼存在釋放位置偏移缺陷。

優(yōu)選地,在以所述多個(gè)檢測(cè)點(diǎn)中的函數(shù)調(diào)用檢測(cè)點(diǎn)作為檢測(cè)邏輯的起點(diǎn)進(jìn)行缺陷檢測(cè)之后還包括:調(diào)用內(nèi)存分配函數(shù)并且設(shè)置符號(hào)值,將內(nèi)存分配所占用的內(nèi)存大小更新為相應(yīng)的尺寸參數(shù)。優(yōu)選地,在內(nèi)存分配結(jié)束后,將符號(hào)值的狀態(tài)設(shè)置為已分配并且對(duì)分配內(nèi)存類型進(jìn)行記錄。

圖3為根據(jù)本發(fā)明實(shí)施方式的在函數(shù)調(diào)用檢測(cè)點(diǎn)處執(zhí)行的檢測(cè)方法300的流程圖。檢測(cè)方法300是實(shí)現(xiàn)與內(nèi)存空間釋放相關(guān)缺陷的檢測(cè)的檢測(cè)邏輯,其以所述多個(gè)檢測(cè)點(diǎn)中的函數(shù)調(diào)用檢測(cè)點(diǎn)作為檢測(cè)邏輯的起點(diǎn)進(jìn)行缺陷檢測(cè);調(diào)用內(nèi)存釋放函數(shù)并且確定所述內(nèi)存釋放函數(shù)中的釋放參數(shù)是否是內(nèi)存地址;以及在所述釋放參數(shù)是內(nèi)存地址的情況下,根據(jù)所述釋放參數(shù)的符號(hào)值來(lái)確定檢測(cè)結(jié)果

如圖3所示,方法300從步驟301處開(kāi)始。在步驟301,進(jìn)入函數(shù)調(diào)用檢測(cè)點(diǎn),從而開(kāi)始與內(nèi)存空間釋放相關(guān)的缺陷的檢測(cè)。其中函數(shù)調(diào)用檢測(cè)點(diǎn)是由如上所述的初始化單元從多個(gè)檢測(cè)點(diǎn)中選取的用于檢測(cè)與內(nèi)存空間釋放相關(guān)的缺陷的主要檢測(cè)點(diǎn)。

在步驟302,確定函數(shù)類型。由于方法300以函數(shù)調(diào)用檢測(cè)點(diǎn)作為起點(diǎn)進(jìn)行缺陷檢測(cè)(即執(zhí)行檢測(cè)邏輯),并且在函數(shù)調(diào)用檢測(cè)點(diǎn)之后根據(jù)函數(shù)類型的不同來(lái)執(zhí)行不同的邏輯。優(yōu)選地,函數(shù)類型包括:內(nèi)存分配函數(shù)、內(nèi)存重新分配函數(shù)以及內(nèi)存釋放函數(shù)。其中,內(nèi)存分配函數(shù)的作用是根據(jù)分配請(qǐng)求對(duì)內(nèi)存空間進(jìn)行分配,從而使得相應(yīng)的程序/應(yīng)用能夠得到用于執(zhí)行代碼的內(nèi)存空間。內(nèi)存重新分配函數(shù)用于對(duì)其他程序/應(yīng)用釋放的內(nèi)存空間進(jìn)行重新分配,從而實(shí)現(xiàn)內(nèi)存空間的有效利用。內(nèi)存釋放函數(shù)用于對(duì)特定程序/應(yīng)用不再需要使用的內(nèi)存空間進(jìn)行釋放,從而使得所釋放的內(nèi)存空間能夠被重新分配給其他程序/應(yīng)用。

當(dāng)在步驟302處確定函數(shù)類型為內(nèi)存重新分配函數(shù)時(shí),方法300進(jìn)行到步驟303。在步驟303,判斷重新分配的內(nèi)存地址的初始值是否為空。因?yàn)橐M(jìn)行內(nèi)存空間的重新分配,因此必須首先確定要被重新分配的內(nèi)存空間是可用的,即確定要被重新分配的內(nèi)存空間的地址初始值是否為空。當(dāng)在步驟303處確定要被重新分配的內(nèi)存空間的地址初始值為空時(shí),進(jìn)行步驟305。在步驟305,進(jìn)行內(nèi)存分配函數(shù)(下面將會(huì)介紹)的處理。由于已經(jīng)確定了要被重新分配的內(nèi)存空間是可用的,因此可以執(zhí)行內(nèi)存分配函數(shù)以進(jìn)行內(nèi)存的重新分配。

當(dāng)在步驟303處確定要被重新分配的內(nèi)存空間的地址初始值不為空時(shí),方法300進(jìn)行到步驟304以釋放相關(guān)的內(nèi)存空間。在步驟304,進(jìn)行內(nèi)存釋放函數(shù)(下面將會(huì)介紹)的處理。內(nèi)存釋放函數(shù)能夠?qū)⒅匦路峙涞膬?nèi)存空間進(jìn)行釋放,從而滿足內(nèi)存重新分配的要求。然后,在步驟305,進(jìn)行內(nèi)存分配函數(shù)(下面將會(huì)介紹)的處理。由于已經(jīng)確定了要被重新分配的內(nèi)存空間是可用的,因此可以執(zhí)行內(nèi)存分配函數(shù)以進(jìn)行內(nèi)存的重新分配。

當(dāng)在步驟302處確定函數(shù)類型為內(nèi)存分配函數(shù)時(shí),方法300進(jìn)行到步驟306。在步驟306,為函數(shù)返回值創(chuàng)建符號(hào),并且其占用的內(nèi)存大小更新為相應(yīng)的size參數(shù)。接著,在步驟307,將符號(hào)的狀態(tài)標(biāo)記為已分配并且記錄分配內(nèi)存類型。優(yōu)選地,在內(nèi)存釋放,將分配內(nèi)存類型與釋放內(nèi)存類型進(jìn)行匹配,從而確定這種釋放是否為缺陷。

然后,在步驟308處,更新符號(hào)執(zhí)行的狀態(tài)。由于在步驟307處將符號(hào)的狀態(tài)標(biāo)記為已分配,因此在步驟308處必須對(duì)符號(hào)執(zhí)行的狀態(tài)進(jìn)行更新。在這種情況下,進(jìn)行步驟321,退出當(dāng)前的缺陷檢測(cè)邏輯并且可以繼續(xù)進(jìn)行其他的符號(hào)執(zhí)行。

當(dāng)在步驟302處確定函數(shù)類型為內(nèi)存釋放函數(shù)時(shí),方法300進(jìn)行到步驟309。在步驟309,方法300判斷釋放參數(shù)是否為空。如果釋放參數(shù)為空,即存在不需要釋放任何空間的內(nèi)存釋放,因此不需要進(jìn)行內(nèi)存釋放。在這種情況下,進(jìn)行步驟321,退出當(dāng)前的缺陷檢測(cè)邏輯并且可以繼續(xù)進(jìn)行其他的符號(hào)執(zhí)行。

如果在步驟309,確定釋放參數(shù)不為空,那么可以進(jìn)行到步驟310。在步驟310,判斷釋放參數(shù)是否為非內(nèi)存地址。在調(diào)用內(nèi)存釋放函數(shù)后,必須確定內(nèi)存釋放函數(shù)中的釋放參數(shù)是否是內(nèi)存地址。這是因?yàn)槿绻麅?nèi)存釋放函數(shù)中的釋放參數(shù)不是內(nèi)存地址,那么也就不存在對(duì)內(nèi)存空間進(jìn)行釋放的可能,可以將這種問(wèn)題直接確定為錯(cuò)誤的釋放。其中內(nèi)存地址包括:基地址、??臻g地址或分配空間地址等。即如果釋放參數(shù)為非內(nèi)存地址,方法300進(jìn)行到步驟311。在步驟311,確定檢測(cè)到缺陷的類型為錯(cuò)誤的釋放。

如果內(nèi)存釋放函數(shù)中的釋放參數(shù)為基地址、??臻g地址或分配空間地址等時(shí),可以確定內(nèi)存釋放函數(shù)不存在錯(cuò)誤的釋放的缺陷并且進(jìn)行到步驟312。

在步驟312,確定釋放參數(shù)是否為符號(hào)值。如果釋放參數(shù)不是符號(hào)值,則方法300進(jìn)行步驟321,退出當(dāng)前的缺陷檢測(cè)邏輯并且可以繼續(xù)進(jìn)行其他的符號(hào)執(zhí)行。

如果在步驟312處確定釋放參數(shù)為符號(hào)值,那么進(jìn)行到步驟313。

在步驟313,獲取符號(hào)值的狀態(tài),并且然后進(jìn)行到步驟314。

在步驟314,判斷符號(hào)值的狀態(tài)是否為已釋放狀態(tài)。如果符號(hào)值的狀態(tài)為已釋放狀態(tài),那么進(jìn)行步驟315。在步驟315,確定待檢測(cè)源代碼存在重復(fù)釋放缺陷。也就是說(shuō),釋放參數(shù)所涉及的內(nèi)存空間已經(jīng)被釋放了。

如果符號(hào)值的狀態(tài)不是已釋放狀態(tài),那么進(jìn)行步驟316。在步驟316,判斷符號(hào)值所指示的釋放內(nèi)存類型與分配內(nèi)存類型是否匹配。如果符號(hào)值所指示的釋放內(nèi)存類型與分配內(nèi)存類型不匹配時(shí),進(jìn)行步驟317。在步驟317,確定待檢測(cè)源代碼存在釋放類型不匹配缺陷。也就是說(shuō),同一內(nèi)存空間的內(nèi)存分配類型和內(nèi)存釋放類型不同。

如果符號(hào)值所指示的釋放內(nèi)存類型與分配內(nèi)存類型匹配時(shí),進(jìn)行步驟318。在步驟318,確定符號(hào)值所指示的釋放位置是否為所分配位置的偏移。如果符號(hào)值所指示的釋放位置為所分配位置的偏移時(shí),進(jìn)行步驟319。在步驟319,確定待檢測(cè)源代碼存在釋放位置偏移缺陷。

如果符號(hào)值所指示的釋放位置不是所分配位置的偏移時(shí),進(jìn)行步驟320。在步驟320,完成內(nèi)存空間釋放并且將該符號(hào)值的狀態(tài)標(biāo)記為已釋放。

然后,在步驟308處,更新符號(hào)執(zhí)行的狀態(tài)。隨后,進(jìn)行步驟321,退出當(dāng)前的缺陷檢測(cè)邏輯并且可以繼續(xù)進(jìn)行其他的符號(hào)執(zhí)行。

已經(jīng)通過(guò)參考少量實(shí)施方式描述了本發(fā)明。然而,本領(lǐng)域技術(shù)人員所公知的,正如附帶的專利權(quán)利要求所限定的,除了本發(fā)明以上公開(kāi)的其他的實(shí)施例等同地落在本發(fā)明的范圍內(nèi)。

通常地,在權(quán)利要求中使用的所有術(shù)語(yǔ)都根據(jù)他們?cè)诩夹g(shù)領(lǐng)域的通常含義被解釋,除非在其中被另外明確地定義。所有的參考“一個(gè)/所述/該[裝置、組件等]”都被開(kāi)放地解釋為所述裝置、組件等中的至少一個(gè)實(shí)例,除非另外明確地說(shuō)明。這里公開(kāi)的任何方法的步驟都沒(méi)必要以公開(kāi)的準(zhǔn)確的順序運(yùn)行,除非明確地說(shuō)明。

當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
保德县| 大理市| 萍乡市| 台中县| 中西区| 高安市| 巴塘县| 甘南县| 儋州市| 新晃| 杭锦旗| 顺昌县| 星座| 苏尼特左旗| 绥中县| 五河县| 梅河口市| 潼南县| 凭祥市| 石首市| 遂昌县| 扶余县| 什邡市| 贡山| 新邵县| 石泉县| 砚山县| 陵川县| 兴安县| 韶山市| 凤山县| 尉氏县| 安仁县| 含山县| 澄迈县| 木兰县| 临清市| 土默特左旗| 巴楚县| 盘山县| 安福县|