專利名稱:一種高可擴(kuò)展性和可維護(hù)性的源代碼缺陷檢測(cè)方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種在軟件源代碼中檢測(cè)缺陷的技術(shù),屬于計(jì)算機(jī)信息安全技術(shù)領(lǐng) 域。
背景技術(shù):
源代碼缺陷檢測(cè)工具是相當(dāng)復(fù)雜的軟件系統(tǒng),其復(fù)雜度不亞于一個(gè)產(chǎn)品級(jí)的C/ C++編譯器。在大型軟件系統(tǒng)中,系統(tǒng)架構(gòu)的設(shè)計(jì)直接決定系統(tǒng)的質(zhì)量和可持續(xù)開(kāi)發(fā)能力。 現(xiàn)有的一些開(kāi)源檢測(cè)工具,我們發(fā)現(xiàn)多數(shù)工具都將語(yǔ)法處理,檢測(cè),和錯(cuò)誤報(bào)告等功能混合 在一起。這樣的一體化結(jié)構(gòu)雖然在開(kāi)發(fā)時(shí)難度較低,但可擴(kuò)展性和可維護(hù)性都不好。建立 執(zhí)行狀態(tài)圖時(shí),相關(guān)檢測(cè)工具都會(huì)遇到狀態(tài)過(guò)多導(dǎo)致存儲(chǔ)爆炸的問(wèn)題,此問(wèn)題是相關(guān)的檢 測(cè)工具共同遇到的問(wèn)題。
發(fā)明內(nèi)容
本發(fā)明的目的提供了一種源代碼缺陷檢測(cè)方法及裝置具有高度的可擴(kuò)展性、可維 護(hù)性強(qiáng)和模塊化等特點(diǎn)。為實(shí)現(xiàn)上述發(fā)明目的,本發(fā)明所提供的技術(shù)方案的基本構(gòu)思如下IV09-175本發(fā)明提供一種高可擴(kuò)展性和可維護(hù)性的源代碼缺陷檢測(cè)方法,其特殊之處在 于包括下列操作步驟(1)將用戶配置好的需要進(jìn)行檢測(cè)的源代碼轉(zhuǎn)化成抽象語(yǔ)法樹(shù)以及控制流圖,送 入分析引擎,該分析引擎開(kāi)始工作;(2)根據(jù)抽象語(yǔ)法樹(shù)以及控制流圖,對(duì)源代碼進(jìn)行流不敏感的分析,把分析結(jié)果提 交給缺陷報(bào)告模塊,然后進(jìn)入步驟3,進(jìn)行路徑敏感的分析;(3)根據(jù)抽象語(yǔ)法樹(shù)以及控制流圖對(duì)源代碼進(jìn)行各種路徑敏感的建模和分析,生 成缺陷原始信息;(4)根據(jù)缺陷原始信息,對(duì)缺陷路徑進(jìn)行還原、精簡(jiǎn)、報(bào)告給用戶。所述步驟(3)對(duì)源代碼進(jìn)行各種路徑敏感的建模和分析由循環(huán)的工作隊(duì)列算法 執(zhí)行,所述循環(huán)的工作隊(duì)列算法由控制要素控制。所述工作隊(duì)列算法的操作如下(31)根據(jù)不同的語(yǔ)句類別,調(diào)用傳輸函數(shù)中相應(yīng) 的訪問(wèn)函數(shù)對(duì)語(yǔ)句進(jìn)行處理和求值;(32)處理分支語(yǔ)句判斷當(dāng)前分支上的約束條件是否 可以滿足,如果可滿足則執(zhí)行當(dāng)前分支,如果不可滿足則不執(zhí)行當(dāng)前分支;處理賦值語(yǔ)句 更新賦值語(yǔ)句中被賦值變量的值;處理函數(shù)調(diào)用語(yǔ)句語(yǔ)句計(jì)算被調(diào)用函數(shù)的副作用和返 回值;(33)對(duì)每一個(gè)執(zhí)行狀態(tài)用hash算法計(jì)算該執(zhí)行狀態(tài)的hash值,hash值對(duì)每一個(gè)不 同的執(zhí)行狀態(tài)都是唯一的;如果一個(gè)執(zhí)行狀態(tài)的hash值跟已有的執(zhí)行狀態(tài)的hash值相等, 則表明該執(zhí)行狀態(tài)是一個(gè)重復(fù)出現(xiàn)的狀態(tài),則不再存儲(chǔ)狀態(tài),如果hash值不相等,則順序 執(zhí)行后續(xù)操作;(34)存儲(chǔ)所有的執(zhí)行狀態(tài);(35)對(duì)存儲(chǔ)的執(zhí)行狀態(tài)進(jìn)行建模;(36)對(duì)執(zhí)行 狀態(tài)進(jìn)行各種檢測(cè),生成缺陷原始信息。
所述控制要素包括根據(jù)抽象語(yǔ)法樹(shù)以及控制流圖對(duì)源代碼建立所有執(zhí)行路徑的 執(zhí)行狀態(tài)圖,并驅(qū)動(dòng)檢測(cè)器對(duì)執(zhí)行狀態(tài)圖進(jìn)行遍歷;對(duì)源程序的每個(gè)分支進(jìn)行遍歷;控制 源程序的循環(huán)語(yǔ)句的循環(huán)執(zhí)行的最大次數(shù);所述執(zhí)行狀態(tài)圖為一個(gè)基于函數(shù)控制流圖的程序執(zhí)行圖,記錄函數(shù)每條可能執(zhí)行 路徑上的執(zhí)行情況。所述步驟(33) —個(gè)執(zhí)行狀態(tài)包括所有已求值的表達(dá)式的值,所有變量和動(dòng)態(tài)分 配的內(nèi)存塊的值,所有符號(hào)的相關(guān)約束信息,所有檢查器所需要的信息。所述步驟(36)中各種檢測(cè)的內(nèi)容包括變量的值是否有定義,除數(shù)是否為0,被解 引用的指針是否為空,整數(shù)運(yùn)算是否溢出,數(shù)組下標(biāo)是否越界,指針?biāo)阈g(shù)是否合法;在路徑 結(jié)束時(shí)還要檢測(cè)動(dòng)態(tài)分配的內(nèi)存是否有泄漏,獲得的鎖是否釋放。一種高可擴(kuò)展性和可維護(hù)性的源代碼缺陷檢測(cè)裝置,其特殊之處在于所述源代 碼缺陷檢測(cè)器包括有下述三個(gè)功能模塊編譯器前端,負(fù)責(zé)將程序源代碼轉(zhuǎn)化成抽象語(yǔ)法樹(shù)以及控制流圖,然后送入分析 引擎,為后續(xù)分析提供便利;分析引擎,由分別完成各自功能的六個(gè)子功能模塊執(zhí)行引擎、狀態(tài)管理器、存儲(chǔ) 管理器、約束管理器、檢測(cè)器及傳輸函數(shù)組成,對(duì)源代碼進(jìn)行各種建模和分析,生成缺陷的 原始信息;缺陷報(bào)告模塊,根據(jù)缺陷原始信息,對(duì)缺陷路徑進(jìn)行還原,精簡(jiǎn),報(bào)告給用戶。所述分析引擎中六個(gè)子模塊的功能是執(zhí)行引擎,對(duì)程序進(jìn)行各種分析,根據(jù)需求調(diào)用相應(yīng)的其它五個(gè)子模塊完成相應(yīng) 的功能;狀態(tài)管理器,存儲(chǔ)和管理所有的執(zhí)行狀態(tài)。存儲(chǔ)管理器,負(fù)責(zé)對(duì)程序的存儲(chǔ)狀態(tài)進(jìn)行建模,約束管理器,負(fù)責(zé)存儲(chǔ)和求解程序路徑中出現(xiàn)的各種約束條件。檢測(cè)器,對(duì)執(zhí)行狀態(tài)進(jìn)行各種檢測(cè),生成缺陷原始信息。傳輸函數(shù),對(duì)程序中的各種語(yǔ)句進(jìn)行處理和求值,傳播執(zhí)行狀態(tài)。所述執(zhí)行引擎對(duì)程序進(jìn)行各種分析包括對(duì)源代碼建立所有執(zhí)行路徑的執(zhí)行狀態(tài) 圖,并驅(qū)動(dòng)檢測(cè)引擎對(duì)執(zhí)行狀態(tài)圖進(jìn)行遍歷;對(duì)程序的每個(gè)分支進(jìn)行遍歷;控制循環(huán)執(zhí)行 的最大次數(shù);根據(jù)不同的語(yǔ)句類型,調(diào)用相應(yīng)的訪問(wèn)函數(shù)對(duì)語(yǔ)句進(jìn)行處理和求值;調(diào)用約 束管理器判斷當(dāng)前分支上的約束條件是否滿足;所述狀態(tài)管理器利用hash算法計(jì)算每一個(gè)執(zhí)行狀態(tài)的hash值,并檢測(cè)執(zhí)行狀態(tài) 的hash值是否重復(fù);所述存儲(chǔ)管理器存儲(chǔ)執(zhí)行狀態(tài)的信息包括保存每一塊模擬的內(nèi)存塊到其當(dāng)前值 的映射,以及每個(gè)內(nèi)存塊的大小,分配釋放信息。與現(xiàn)有的技術(shù)相比,本發(fā)明具有以下優(yōu)點(diǎn)及有益效果1、本發(fā)明的源代碼缺陷檢測(cè)方法及裝置具有高度的可擴(kuò)展性、可維護(hù)性強(qiáng)和模塊 化等特點(diǎn)。2、本發(fā)明的各個(gè)部分被劃分為相互獨(dú)立的模塊。模塊與模塊之間的交互只通過(guò)良 好定義的接口進(jìn)行。這意味著可以在不改變其他模塊的條件下,對(duì)某一模塊進(jìn)行替換,試驗(yàn)不同的實(shí)現(xiàn)。并且可以隔離bug,方便調(diào)試。3、可擴(kuò)展性好意味著可以方便的對(duì)一個(gè)模塊進(jìn)行功能的增加,比如利用良好的接 口可以方便的增加檢測(cè)器的個(gè)數(shù)。4、在核心分析引擎中,可以進(jìn)行多種不同復(fù)雜度和精確度的分析,包括從流不敏 感的抽象語(yǔ)法樹(shù)的線性遍歷,到對(duì)程序路徑的執(zhí)行進(jìn)行完整建模的符號(hào)模擬分析。5、狀態(tài)管理器在存儲(chǔ)每一個(gè)狀態(tài)前,都用hash算法計(jì)算該狀態(tài)的hash值,這個(gè)值 對(duì)每一個(gè)不同的狀態(tài)都是唯一的。如果一個(gè)狀態(tài)的hash值跟已有的狀態(tài)hash值相等,則 表明該狀態(tài)是一個(gè)重復(fù)出現(xiàn)的狀態(tài),則不再次存儲(chǔ)該狀態(tài)。這樣積極的檢測(cè)重復(fù)狀態(tài)的出 現(xiàn)不僅能夠減少存儲(chǔ)消耗,更重要的是對(duì)狀態(tài)空間進(jìn)行消減,降低檢測(cè)的時(shí)間消耗。6、本發(fā)明使用計(jì)算狀態(tài)hash值的方法消除重復(fù)狀態(tài),解決了建立執(zhí)行狀態(tài)圖時(shí) 遇到狀態(tài)過(guò)多導(dǎo)致存儲(chǔ)爆炸的問(wèn)題。7、傳輸函數(shù)對(duì)程序中的各種語(yǔ)句進(jìn)行求值,傳播執(zhí)行狀態(tài)。根據(jù)檢測(cè)要求的不同, 工具需要對(duì)語(yǔ)句進(jìn)行不同的處理,有的要求對(duì)語(yǔ)句進(jìn)行完整的模擬執(zhí)行,有的則只需要粗 略的模擬,有的甚至可以直接忽略。把它們放在單獨(dú)的模塊中,由執(zhí)行引擎根據(jù)配置需求來(lái) 調(diào)用,則大大提高了檢測(cè)工具的靈活度。8、將檢測(cè)工具進(jìn)行模塊化劃分,使得工具的開(kāi)發(fā)變得相對(duì)簡(jiǎn)單,不易出錯(cuò)。增強(qiáng)了 工具的靈活性,可以非常方便的對(duì)工具進(jìn)行各種配置和調(diào)整。
圖1 是本發(fā)明中源代碼缺陷檢測(cè)方法的基本構(gòu)架圖;圖2 是本發(fā)明中分析引擎的結(jié)構(gòu)示意圖;圖3 是本發(fā)明中工作隊(duì)列算法的操作流程圖。
具體實(shí)施例方式下面結(jié)合附圖,對(duì)本發(fā)明作進(jìn)一步說(shuō)明。參見(jiàn)圖1至圖3 本發(fā)明提供一種高可擴(kuò)展性和可維護(hù)性的源代碼缺陷檢測(cè)方法,其特殊之處在 于包括下列操作步驟(1)將用戶配置好的需要進(jìn)行檢測(cè)的源代碼轉(zhuǎn)化成抽象語(yǔ)法樹(shù)以及控制流圖,送 入分析引擎,該分析引擎開(kāi)始工作;(2)根據(jù)抽象語(yǔ)法樹(shù)以及控制流圖,對(duì)源代碼進(jìn)行流不敏感的分析,把分析結(jié)果提 交給缺陷報(bào)告模塊,然后進(jìn)入步驟3,進(jìn)行路徑敏感的分析;(3)根據(jù)抽象語(yǔ)法樹(shù)以及控制流圖對(duì)源代碼進(jìn)行各種路徑敏感的建模和分析,生 成缺陷原始信息;所述步驟(3)對(duì)源代碼進(jìn)行各種路徑敏感的建模和分析由循環(huán)的工作隊(duì)列算法 執(zhí)行,所述循環(huán)的工作隊(duì)列算法由控制要素控制,所述工作隊(duì)列算法的操作如下(31)根 據(jù)不同的語(yǔ)句類別,調(diào)用傳輸函數(shù)中相應(yīng)的訪問(wèn)函數(shù)對(duì)語(yǔ)句進(jìn)行處理和求值;(32)處理分 支語(yǔ)句判斷當(dāng)前分支上的約束條件是否可以滿足,如果可滿足則執(zhí)行當(dāng)前分支,如果不可 滿足則不執(zhí)行當(dāng)前分支;處理賦值語(yǔ)句更新賦值語(yǔ)句中被賦值變量的值;處理函數(shù)調(diào)用
6語(yǔ)句語(yǔ)句計(jì)算被調(diào)用函數(shù)的副作用和返回值;(33)對(duì)每一個(gè)執(zhí)行狀態(tài)用hash算法計(jì)算該 執(zhí)行狀態(tài)的hash值,hash值對(duì)每一個(gè)不同的執(zhí)行狀態(tài)都是唯一的;如果一個(gè)執(zhí)行狀態(tài)的 hash值跟已有的執(zhí)行狀態(tài)的hash值相等,則表明該執(zhí)行狀態(tài)是一個(gè)重復(fù)出現(xiàn)的狀態(tài),則不 再存儲(chǔ)狀態(tài),如果hash值不相等,則順序執(zhí)行后續(xù)操作;一個(gè)執(zhí)行狀態(tài)包括所有已求值的 表達(dá)式的值,所有變量和動(dòng)態(tài)分配的內(nèi)存塊的值,所有符號(hào)的相關(guān)約束信息,所有檢查器所 需要的信息;(34)存儲(chǔ)所有的執(zhí)行狀態(tài);(35)對(duì)存儲(chǔ)的執(zhí)行狀態(tài)進(jìn)行建模;(36)對(duì)執(zhí)行狀 態(tài)進(jìn)行各種檢測(cè),生成缺陷原始信息;所述控制要素包括根據(jù)抽象語(yǔ)法樹(shù)以及控制流圖對(duì)源代碼建立所有執(zhí)行路徑的 執(zhí)行狀態(tài)圖,并驅(qū)動(dòng)檢測(cè)器對(duì)執(zhí)行狀態(tài)圖進(jìn)行遍歷;執(zhí)行狀態(tài)圖為一個(gè)基于函數(shù)控制流圖 的程序執(zhí)行圖,記錄函數(shù)每條可能執(zhí)行路徑上的執(zhí)行情況;對(duì)源程序的每個(gè)分支進(jìn)行遍歷; 控制源程序的循環(huán)語(yǔ)句的循環(huán)執(zhí)行的最大次數(shù);(4)根據(jù)缺陷原始信息,對(duì)缺陷路徑進(jìn)行還原、精簡(jiǎn)、報(bào)告給用戶。所述步驟(36)中各種檢測(cè)的內(nèi)容包括變量的值是否有定義,除數(shù)是否為0,被解 引用的指針是否為空,整數(shù)運(yùn)算是否溢出,數(shù)組下標(biāo)是否越界,指針?biāo)阈g(shù)是否合法;在路徑 結(jié)束時(shí)還要檢測(cè)動(dòng)態(tài)分配的內(nèi)存是否有泄漏,獲得的鎖是否釋放。一種高可擴(kuò)展性和可維護(hù)性的源代碼缺陷檢測(cè)裝置,將檢測(cè)工具進(jìn)行模塊化劃 分,使得工具的開(kāi)發(fā)變得相對(duì)簡(jiǎn)單,不易出錯(cuò)。增強(qiáng)了工具的靈活性,可以非常方便的對(duì)工 具進(jìn)行各種配置和調(diào)整,包括有下述三個(gè)功能模塊編譯器前端,負(fù)責(zé)將程序源代碼轉(zhuǎn)化成抽象語(yǔ)法樹(shù)以及控制流圖,然后送入分析 引擎,為后續(xù)分析提供便利。缺陷報(bào)告模塊,根據(jù)缺陷原始信息,對(duì)缺陷路徑進(jìn)行還原,精簡(jiǎn),報(bào)告給用戶。所述 缺陷原始信息往往只是一個(gè)數(shù)據(jù)結(jié)構(gòu),其中包含缺陷在源代碼中的位置,缺陷的類別,缺陷 的觸發(fā)路徑和狀態(tài)信息,缺陷報(bào)告模塊需要根據(jù)這些信息,將缺陷在源程序的代碼中顯示 出來(lái),并提供相關(guān)用戶。分析引擎,對(duì)源代碼進(jìn)行各種建模和分析,生成缺陷的原始信息;所述執(zhí)行引擎對(duì) 程序進(jìn)行各種分析包括對(duì)源代碼建立所有執(zhí)行路徑的執(zhí)行狀態(tài)圖,并驅(qū)動(dòng)檢測(cè)引擎對(duì)執(zhí) 行狀態(tài)圖進(jìn)行遍歷;對(duì)程序的每個(gè)分支進(jìn)行遍歷;控制循環(huán)執(zhí)行的最大次數(shù);根據(jù)不同的 語(yǔ)句類型,調(diào)用相應(yīng)的訪問(wèn)函數(shù)對(duì)語(yǔ)句進(jìn)行處理和求值;調(diào)用約束管理器判斷當(dāng)前分支上 的約束條件是否滿足。分析引擎由分別完成各自功能的六個(gè)子功能模塊組成執(zhí)行引擎其功能是對(duì)源程序進(jìn)行各種分析,根據(jù)需求調(diào)用相應(yīng)的其它五個(gè)子模 塊完成相應(yīng)的功能。狀態(tài)管理器其功能是存儲(chǔ)和管理所有的執(zhí)行狀態(tài),存儲(chǔ)執(zhí)行狀態(tài)的信息包括 保存每一塊模擬的內(nèi)存塊到其當(dāng)前值的映射,以及每個(gè)內(nèi)存塊的大小,分配釋放信息,利用 hash算法計(jì)算每一個(gè)執(zhí)行狀態(tài)的hash值,并檢測(cè)執(zhí)行狀態(tài)的hash值是否重復(fù);具體的說(shuō) 狀態(tài)管理器在存儲(chǔ)每一個(gè)狀態(tài)前,都用hash算法計(jì)算該狀態(tài)的hash值,這個(gè)值對(duì)每一個(gè)不 同的狀態(tài)都是唯一的。如果一個(gè)狀態(tài)的hash值跟已有的狀態(tài)hash值相等,則表明該狀態(tài) 是一個(gè)重復(fù)出現(xiàn)的狀態(tài),則不再次存儲(chǔ)該狀態(tài)。這樣積極的檢測(cè)重復(fù)狀態(tài)的出現(xiàn)不僅能夠 減少存儲(chǔ)消耗,更重要的是對(duì)狀態(tài)空間進(jìn)行消減,降低檢測(cè)的時(shí)間消耗。
存儲(chǔ)管理器其功能是負(fù)責(zé)對(duì)程序的存儲(chǔ)狀態(tài)進(jìn)行建模;約束管理器其功能是 負(fù)責(zé)存儲(chǔ)和求解程序路徑中出現(xiàn)的各種約束條件;檢測(cè)器其功能是對(duì)執(zhí)行狀態(tài)進(jìn)行各種 檢測(cè),生成缺陷原始信息。傳輸函數(shù)其功能是對(duì)程序中的各種語(yǔ)句進(jìn)行處理和求值,傳播執(zhí)行狀態(tài);在核 心分析引擎中,可以進(jìn)行多種不同復(fù)雜度和精確度的分析,包括從流不敏感的抽象語(yǔ)法樹(shù) 的線性遍歷,到對(duì)程序路徑的執(zhí)行進(jìn)行完整建模的符號(hào)模擬分析;傳輸函數(shù)根據(jù)檢測(cè)要求 的不同,工具需要對(duì)語(yǔ)句進(jìn)行不同的處理,有的要求對(duì)語(yǔ)句進(jìn)行完整的模擬執(zhí)行,有的則只 需要粗略的模擬,有的甚至可以直接忽略。把它們放在單獨(dú)的模塊中,由執(zhí)行引擎根據(jù)配置 需求來(lái)調(diào)用,則大大提高了檢測(cè)工具的靈活度。分析引擎各個(gè)部分被劃分為相互獨(dú)立的模塊,模塊與模塊之間的交互只通過(guò)良好 定義的接口進(jìn)行,這意味著可以在不改變其他模塊的條件下,對(duì)某一模塊進(jìn)行替換;可以方 便的對(duì)一個(gè)模塊進(jìn)行功能的增加,比如利用良好的接口可以方便的增加檢測(cè)器的個(gè)數(shù)。所述源代碼缺陷檢測(cè)器能夠檢測(cè)出來(lái)的軟件缺陷包括以下類型返回堆棧地址、返回未定義的變量、使用未定義的值作為分支判定條件、向未定義 的地址賦值、使用未定義的值作為函數(shù)參數(shù)、使用NULL指針作為指定了 normull屬性的函 數(shù)參數(shù)、解引用未定義的指針、解引用NULL指針、通過(guò)未定義或?yàn)镹ULL的函數(shù)指針調(diào)用函 數(shù)、聲明長(zhǎng)度可能為0的可變長(zhǎng)度數(shù)組、使用值為0的表達(dá)式作為除數(shù)、非法的指針?biāo)阈g(shù)、內(nèi) 存泄漏、數(shù)組下標(biāo)越界、非法字符串操作。最后應(yīng)當(dāng)說(shuō)明的是以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案而非對(duì)其限制,盡 管參照上述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明,所屬領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解依然 可以對(duì)本發(fā)明的具體實(shí)施方式
進(jìn)行修改或者等同替換,而未脫離本發(fā)明精神和范圍的任何 修改或者等同替換,其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求范圍當(dāng)中。
權(quán)利要求
一種高可擴(kuò)展性和可維護(hù)性的源代碼缺陷檢測(cè)方法,其特征在于包括下列操作步驟(1)將用戶配置好的需要進(jìn)行檢測(cè)的源代碼轉(zhuǎn)化成抽象語(yǔ)法樹(shù)以及控制流圖,送入分析引擎,該分析引擎開(kāi)始工作;(2)根據(jù)抽象語(yǔ)法樹(shù)以及控制流圖,對(duì)源代碼進(jìn)行流不敏感的分析,把分析結(jié)果提交給缺陷報(bào)告模塊,然后進(jìn)入步驟3,進(jìn)行路徑敏感的分析;(3)根據(jù)抽象語(yǔ)法樹(shù)以及控制流圖對(duì)源代碼進(jìn)行各種路徑敏感的建模和分析,生成缺陷原始信息;(4)根據(jù)缺陷原始信息,對(duì)缺陷路徑進(jìn)行還原、精簡(jiǎn)、報(bào)告給用戶。
2.根據(jù)權(quán)利要求1所述的源代碼缺陷檢測(cè)方法,其特征在于,所述步驟(3)對(duì)源代碼進(jìn) 行各種路徑敏感的建模和分析由循環(huán)的工作隊(duì)列算法執(zhí)行,所述循環(huán)的工作隊(duì)列算法由控 制要素控制。
3.根據(jù)權(quán)利要求2所述的源代碼缺陷檢測(cè)方法,其特征在于,所述工作隊(duì)列算法的操 作如下(31)根據(jù)不同的語(yǔ)句類別,調(diào)用傳輸函數(shù)中相應(yīng)的訪問(wèn)函數(shù)對(duì)語(yǔ)句進(jìn)行處理和求值;(32)處理分支語(yǔ)句判斷當(dāng)前分支上的約束條件是否可以滿足,如果可滿足則執(zhí)行當(dāng) 前分支,如果不可滿足則不執(zhí)行當(dāng)前分支;處理賦值語(yǔ)句更新賦值語(yǔ)句中被賦值變量的值;處理函數(shù)調(diào)用語(yǔ)句語(yǔ)句計(jì)算被調(diào)用函數(shù)的副作用和返回值;(33)對(duì)每一個(gè)執(zhí)行狀態(tài)用hash算法計(jì)算該執(zhí)行狀態(tài)的hash值,hash值對(duì)每一個(gè)不同 的執(zhí)行狀態(tài)都是唯一的;如果一個(gè)執(zhí)行狀態(tài)的hash值跟已有的執(zhí)行狀態(tài)的hash值相等,則 表明該執(zhí)行狀態(tài)是一個(gè)重復(fù)出現(xiàn)的狀態(tài),則不再存儲(chǔ)狀態(tài),如果hash值不相等,則順序執(zhí) 行后續(xù)操作;(34)存儲(chǔ)所有的執(zhí)行狀態(tài);(35)對(duì)存儲(chǔ)的執(zhí)行狀態(tài)進(jìn)行建模;(36)對(duì)執(zhí)行狀態(tài)進(jìn)行各種檢測(cè),生成缺陷原始信息。
4.根據(jù)權(quán)利要求2所述的源代碼缺陷檢測(cè)方法,其特征在于,所述控制要素包括根據(jù)抽象語(yǔ)法樹(shù)以及控制流圖對(duì)源代碼建立所有執(zhí)行路徑的執(zhí)行狀態(tài)圖,并驅(qū)動(dòng)檢測(cè) 器對(duì)執(zhí)行狀態(tài)圖進(jìn)行遍歷;對(duì)源程序的每個(gè)分支進(jìn)行遍歷;控制源程序的循環(huán)語(yǔ)句的循環(huán)執(zhí)行的最大次數(shù);
5.根據(jù)權(quán)利要求4所述的源代碼缺陷檢測(cè)方法,其特征在于,所述執(zhí)行狀態(tài)圖為一個(gè) 基于函數(shù)控制流圖的程序執(zhí)行圖,記錄函數(shù)每條可能執(zhí)行路徑上的執(zhí)行情況。
6.根據(jù)權(quán)利要求3所述的源代碼缺陷檢測(cè)方法,其特征在于,所述步驟(33)—個(gè)執(zhí)行 狀態(tài)包括所有已求值的表達(dá)式的值,所有變量和動(dòng)態(tài)分配的內(nèi)存塊的值,所有符號(hào)的相關(guān) 約束信息,所有檢查器所需要的信息。
7.根據(jù)權(quán)利要求3所述的源代碼缺陷檢測(cè)方法,其特征在于,所述步驟(36)中各種檢 測(cè)的內(nèi)容包括變量的值是否有定義,除數(shù)是否為0,被解引用的指針是否為空,整數(shù)運(yùn)算 是否溢出,數(shù)組下標(biāo)是否越界,指針?biāo)阈g(shù)是否合法;在路徑結(jié)束時(shí)還要檢測(cè)動(dòng)態(tài)分配的內(nèi)存是否有泄漏,獲得的鎖是否釋放。
8.一種高可擴(kuò)展性和可維護(hù)性的源代碼缺陷檢測(cè)裝置,其特征在于所述源代碼缺陷 檢測(cè)裝置包括有下述三個(gè)功能模塊編譯器前端,負(fù)責(zé)將程序源代碼轉(zhuǎn)化成抽象語(yǔ)法樹(shù)以及控制流圖,然后送入分析引擎, 為后續(xù)分析提供便利;分析引擎,由分別完成各自功能的六個(gè)子功能模塊執(zhí)行引擎、狀態(tài)管理器、存儲(chǔ)管理 器、約束管理器、檢測(cè)器及傳輸函數(shù)組成,對(duì)源代碼進(jìn)行各種建模和分析,生成缺陷的原始 fn息;缺陷報(bào)告模塊,根據(jù)缺陷原始信息,對(duì)缺陷路徑進(jìn)行還原,精簡(jiǎn),報(bào)告給用戶。
9.根據(jù)權(quán)利要求8所述的源代碼缺陷檢測(cè)裝置,其特征在于所述分析引擎中六個(gè)子 模塊的功能是執(zhí)行引擎,對(duì)程序進(jìn)行各種分析,根據(jù)需求調(diào)用相應(yīng)的其它五個(gè)子模塊完成相應(yīng)的功能;狀態(tài)管理器,存儲(chǔ)和管理所有的執(zhí)行狀態(tài)。存儲(chǔ)管理器,負(fù)責(zé)對(duì)程序的存儲(chǔ)狀態(tài)進(jìn)行建模,約束管理器,負(fù)責(zé)存儲(chǔ)和求解程序路徑中出現(xiàn)的各種約束條件。檢測(cè)器,對(duì)執(zhí)行狀態(tài)進(jìn)行各種檢測(cè),生成缺陷原始信息。傳輸函數(shù),對(duì)程序中的各種語(yǔ)句進(jìn)行處理和求值,傳播執(zhí)行狀態(tài)。
10.根據(jù)權(quán)利要求9所述的源代碼缺陷檢測(cè)裝置,其特征在于所述執(zhí)行引擎對(duì)程序進(jìn)行各種分析包括對(duì)源代碼建立所有執(zhí)行路徑的執(zhí)行狀態(tài)圖, 并驅(qū)動(dòng)檢測(cè)引擎對(duì)執(zhí)行狀態(tài)圖進(jìn)行遍歷;對(duì)程序的每個(gè)分支進(jìn)行遍歷;控制循環(huán)執(zhí)行的最 大次數(shù);根據(jù)不同的語(yǔ)句類型,調(diào)用相應(yīng)的訪問(wèn)函數(shù)對(duì)語(yǔ)句進(jìn)行處理和求值;調(diào)用約束管 理器判斷當(dāng)前分支上的約束條件是否滿足;所述狀態(tài)管理器利用hash算法計(jì)算每一個(gè)執(zhí)行狀態(tài)的hash值,并檢測(cè)執(zhí)行狀態(tài)的 hash值是否重復(fù);所述存儲(chǔ)管理器存儲(chǔ)執(zhí)行狀態(tài)的信息包括保存每一塊模擬的內(nèi)存塊到其當(dāng)前值的映 射,以及每個(gè)內(nèi)存塊的大小,分配釋放信息。
全文摘要
本發(fā)明提供一種高可擴(kuò)展性和可維護(hù)性的源代碼缺陷檢測(cè)方法及裝置,包括下列步驟(1)將用戶配置好的需要進(jìn)行檢測(cè)的源代碼轉(zhuǎn)化成抽象語(yǔ)法樹(shù)以及控制流圖,送入分析引擎;(2)根據(jù)抽象語(yǔ)法樹(shù)以及控制流圖,對(duì)源代碼進(jìn)行流不敏感的分析,把分析結(jié)果提交給缺陷報(bào)告模塊,然后進(jìn)入步驟3,進(jìn)行路徑敏感的分析;(3)根據(jù)抽象語(yǔ)法樹(shù)以及控制流圖對(duì)源代碼進(jìn)行各種路徑敏感的建模和分析,生成缺陷原始信息;(4)根據(jù)缺陷原始信息,對(duì)缺陷路徑進(jìn)行還原、精簡(jiǎn)、報(bào)告給用戶。裝置包括三個(gè)功能模塊編譯器前端、分析引擎、缺陷報(bào)告模塊。本發(fā)明的目的提供了一種源代碼缺陷檢測(cè)方法及裝置具有高度的可擴(kuò)展性、可維護(hù)性強(qiáng)和模塊化等特點(diǎn)。
文檔編號(hào)G06F11/36GK101937388SQ20091025925
公開(kāi)日2011年1月5日 申請(qǐng)日期2009年12月17日 優(yōu)先權(quán)日2009年12月17日
發(fā)明者張*, 許中興 申請(qǐng)人:北京測(cè)騰信息技術(shù)有限公司