本發(fā)明涉及軟件靜態(tài)分析技術(shù),尤其涉及基于靜態(tài)分析的缺陷檢測。
背景技術(shù):
靜態(tài)分析是軟件測試方法的一種類型,其目的是通過靜態(tài)的分析軟件是否遵守預(yù)定的要求,是保證軟件質(zhì)量的重要一環(huán)。靜態(tài)分析也被稱為靜態(tài)測試,不實際運行被測的軟件,而是通過掃描源程序,從中找出可能導(dǎo)致錯誤的結(jié)構(gòu)異常、控制流異常及數(shù)據(jù)流異常等情況。
缺陷檢測是一類靜態(tài)分析技術(shù),可以靜態(tài)的檢測出程序中不符合語法或語義要求的缺陷。其中代碼級內(nèi)存缺陷是一類違背對內(nèi)存讀寫正常語義的缺陷,不符合預(yù)定的內(nèi)存讀寫要求,常見的代碼級內(nèi)存缺陷有:空指針引用、非法計算、緩沖區(qū)溢出、數(shù)組越界、變量未初始化使用、內(nèi)存泄露、資源泄露等。
代碼級內(nèi)存缺陷的檢測依賴于對程序語義分析,通過檢測每個程序點上的存儲狀態(tài)是否符合正確的內(nèi)存讀寫語義要求進(jìn)行判定。但因為程序的復(fù)雜性,靜態(tài)分析只能獲得程序點上存儲狀態(tài)近似的結(jié)果,其結(jié)果不能是既是可靠的又是完備的,其中不可靠的結(jié)果會導(dǎo)致漏報;而且代碼級內(nèi)存缺陷檢測對象識別的不全面以及判定準(zhǔn)則的不準(zhǔn)確也會導(dǎo)致漏報。
技術(shù)實現(xiàn)要素:
有鑒于此,本發(fā)明的主要目的在于首先分析導(dǎo)致代碼級內(nèi)存缺陷漏報的因素,并針對漏報的因素提出了相應(yīng)的解決方法。
基于缺陷模式進(jìn)行缺陷檢測可能導(dǎo)致代碼級內(nèi)存缺陷漏報的因素有:
1、未定義相應(yīng)的代碼級內(nèi)存缺陷模式。未全面考慮所有可能的代碼級內(nèi)存缺陷。
2、代碼級內(nèi)存缺陷檢測對象識別不全面。雖然定義了相應(yīng)的代碼級內(nèi)存缺陷模式,但是未全面考慮該類代碼級內(nèi)存缺陷出現(xiàn)的情況。
3、對變量的存儲狀態(tài)描述不全面。代碼級內(nèi)存缺陷的產(chǎn)生大多是變量的存儲狀態(tài)或者訪問違背了正常語義或安全內(nèi)存訪問的要求,而變量間存在著各種關(guān)聯(lián)關(guān)系,如果對變量的存儲狀態(tài)以及變量間的關(guān)聯(lián)描述的不全面,將必然導(dǎo)致分析得到的變量存儲狀態(tài)的既不能滿足可靠性也不能滿足完備性,不能滿足可靠性將必然導(dǎo)致某些代碼級內(nèi)存缺陷漏報。
4、數(shù)據(jù)流分析不可靠。因為程序的復(fù)雜性,大多數(shù)數(shù)據(jù)流分析難以保證可靠性。程序的復(fù)雜性主要表現(xiàn)在:變量間存在各種關(guān)聯(lián)、復(fù)雜的控制結(jié)構(gòu)、函數(shù)調(diào)用。這些復(fù)雜特性將導(dǎo)致難以可靠的分析出在每個程序點上的變量存儲狀態(tài)。
5、代碼級內(nèi)存缺陷判定規(guī)則不正確?;跀?shù)據(jù)流分析的結(jié)果對識別的代碼級內(nèi)存缺陷檢測對象進(jìn)行檢測,可能因為語句副作用等因素導(dǎo)致不能獲得程序點上檢測對向的存儲狀態(tài),導(dǎo)致不能正確的判定是否產(chǎn)生了代碼級內(nèi)存缺陷。
針對上述導(dǎo)致代碼級內(nèi)存缺陷漏報的因素,本發(fā)明提出了具有針對性的解決辦法以實現(xiàn)代碼級內(nèi)存缺陷的零漏報,具體的技術(shù)方案是這樣實現(xiàn)的:
1、一種代碼級內(nèi)存缺陷漏報分析及解決方法,其特征在于,該解決方法包括以下幾個步驟:
A、總結(jié)程序中各類代碼級內(nèi)存缺陷,并歸納出相關(guān)的缺陷模式;
B、應(yīng)用抽象內(nèi)存模型描述內(nèi)存對象的存儲,并采用抽象域表示表達(dá)式的取值;
C、可靠的數(shù)據(jù)流分析,獲得每個程序點上每個內(nèi)存對象取值的上近似;
D、基于缺陷模式規(guī)則與數(shù)據(jù)流分析的結(jié)果,充分識別代碼級內(nèi)存缺陷檢測對象;
E、基于缺陷模式規(guī)則與數(shù)據(jù)流分析的結(jié)果,準(zhǔn)確的判定代碼級內(nèi)存缺陷檢測對象是否是缺陷。
2、根據(jù)權(quán)利要求1所述的代碼級內(nèi)存缺陷漏報分析及解決方法,其特征在于,所述步驟A中的總結(jié)程序中各類代碼級內(nèi)存缺陷,并歸納出相關(guān)的缺陷模式的具體過程如下:
A1、對程序中各種違背語義的情況進(jìn)行歸納,總結(jié)為各種缺陷模式;
A2、歸納匯總出每種缺陷模式可能導(dǎo)致代碼級內(nèi)存缺陷的因素;
A3、將缺陷模式進(jìn)行標(biāo)準(zhǔn)形式的封裝,以供后續(xù)缺陷檢測使用。
3、根據(jù)權(quán)利要求1所述的代碼級內(nèi)存缺陷漏報分析及解決方法,其特征在于,所述步驟B中的應(yīng)用抽象內(nèi)存模型描述內(nèi)存對象的存儲,并采用抽象域表示表達(dá)式的取值的具體過程如下:
B1、提出一種抽象內(nèi)存模型,能夠描述程序中出現(xiàn)的各種類型內(nèi)存對象以及表達(dá)式間的各種關(guān)聯(lián);
B2、應(yīng)用抽象域描述標(biāo)量表達(dá)式的取值;
4、根據(jù)權(quán)利要求1所述的代碼級內(nèi)存缺陷漏報分析及解決方法,其特征在于,所述步驟C中的可靠的數(shù)據(jù)流分析,獲得每個程序點上每個內(nèi)存對象取值的上近似的具體過程如下:
C1、應(yīng)用流敏感、域敏感的數(shù)據(jù)流迭代的分析策略,以每個函數(shù)為數(shù)據(jù)流分析的單元進(jìn)行分析;
C2、采用符號化函數(shù)摘要實現(xiàn)上下文敏感的過程間分析;
5、根據(jù)權(quán)利要求4所述的可靠的數(shù)據(jù)流分析,獲得每個程序點上每個內(nèi)存對象取值的上近似,其特征在于,所述步驟C2中的采用符號化函數(shù)摘要實現(xiàn)上下文敏感的過程間分析的具體過程如下:
C2.1、對每個函數(shù)進(jìn)行數(shù)據(jù)流分析后,生成符號化函數(shù)摘要;
C2.2、對每個函數(shù)調(diào)用,獲得被調(diào)用函數(shù)的符號化函數(shù)摘要,并根據(jù)調(diào)用點處的上下文環(huán)境進(jìn)行符號化函數(shù)摘要的實例化;
6、根據(jù)權(quán)利要求1所述的代碼級內(nèi)存缺陷漏報分析及解決方法,其特征在于,所述步驟D中的基于缺陷模式規(guī)則與數(shù)據(jù)流分析的結(jié)果,充分識別代碼級內(nèi)存缺陷檢測對象的具體過程如下:
D1、基于各種代碼級內(nèi)存缺陷呈現(xiàn)時所具有的語法特征,根據(jù)預(yù)處理后的程序識別出初始檢測對象;
D2、根據(jù)數(shù)據(jù)流分析的結(jié)果,分析出每個初始檢測對象對應(yīng)的代碼級內(nèi)存缺陷檢測對象及檢測點;
7、根據(jù)權(quán)利要求1所述的代碼級內(nèi)存缺陷漏報分析及解決方法,其特征在于,所述步驟E中的基于缺陷模式規(guī)則與數(shù)據(jù)流分析的結(jié)果,準(zhǔn)確的判定代碼級內(nèi)存缺陷檢測對象是否是缺陷的具體過程如下:
E1、對于代碼級內(nèi)存缺陷檢測點,基于數(shù)據(jù)流分析結(jié)果獲得代碼級內(nèi)存缺陷檢測對象的存儲狀態(tài);
E2、基于代碼級內(nèi)存缺陷模式,判定該代碼級內(nèi)存缺陷檢測對象的存儲狀態(tài)是否符合該類代碼級內(nèi)存缺陷模式。
本發(fā)明所提供的代碼級內(nèi)存缺陷漏報分析及解決方法,具有以下優(yōu)點:
應(yīng)用代碼級內(nèi)存缺陷檢測方法,能夠消除代碼級內(nèi)存缺陷的漏報,本發(fā)明能夠保證代碼級內(nèi)存缺陷檢測的充分性的原理在于:
1、代碼級內(nèi)存缺陷模式總結(jié)的充分性。充分的總結(jié)代碼級內(nèi)存缺陷模式,歸納總結(jié)出程序中各種可能的代碼級內(nèi)存缺陷及它們出現(xiàn)的可能情況。
2、表達(dá)式存儲狀態(tài)描述的全面性。全面的描述表達(dá)式存儲狀態(tài),采用抽象域描述表達(dá)式的取值,采用內(nèi)存模型表示表達(dá)式間的各種關(guān)聯(lián)。
3、數(shù)據(jù)流分析的可靠性。分析獲得每個程序點上每個內(nèi)存對象取值的上近似,以及表達(dá)式間的各種可能關(guān)聯(lián)。
4、代碼級內(nèi)存缺陷檢測對象識別的完全性。基于對被測程序的預(yù)處理以及數(shù)據(jù)流分析的結(jié)果,根據(jù)總結(jié)的代碼級內(nèi)存缺陷模式規(guī)則,識別出全部的代碼級內(nèi)存缺陷檢測對象。
5、代碼級內(nèi)存缺陷檢測標(biāo)準(zhǔn)的準(zhǔn)確性。根據(jù)總結(jié)的代碼級內(nèi)存缺陷模式規(guī)則以及數(shù)據(jù)流分析的結(jié)果,準(zhǔn)確的檢測每一個代碼級內(nèi)存缺陷檢測對象是否違背了對內(nèi)存讀寫的正確語義規(guī)則。
附圖說明
圖1、代碼級內(nèi)存缺陷檢測流程示意圖
圖2、可靠的數(shù)據(jù)流分析示意圖
圖3、對每個函數(shù)進(jìn)行流敏感、域敏感的數(shù)據(jù)流分析的過程示意圖
圖4、代碼級內(nèi)存缺陷檢測對象識別示意圖
圖5、代碼級內(nèi)存缺陷檢測對象判定示意圖
具體實施方式
本專利的方法進(jìn)行代碼級內(nèi)存缺陷檢測時首先對被測程序進(jìn)行預(yù)處理,得到抽象語法樹、符號表、定義使用鏈、控制流圖等程序的中間表示;然后基于控制流圖進(jìn)行可靠的數(shù)據(jù)流分析,得到每個程序點上用抽象內(nèi)存模性描述的內(nèi)存對象的存儲狀態(tài);再基于數(shù)據(jù)流分析的結(jié)果與代碼級內(nèi)存缺陷模式的規(guī)則,充分識別出代碼級內(nèi)存缺陷檢測對象;最后,基于數(shù)據(jù)流分析的結(jié)果與代碼級內(nèi)存缺陷模式的規(guī)則,準(zhǔn)確的判定識別出的代碼級內(nèi)存缺陷檢測對象是否是缺陷。
以上所述,僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護(hù)范圍。
圖1為本發(fā)明的代碼級內(nèi)存缺陷檢測流程示意圖,該方法包括如下步驟:
步驟A、對被測程序進(jìn)行預(yù)處理,得到抽象語法樹、符號表、定義使用鏈、控制流圖等中間表示;
步驟B、可靠的數(shù)據(jù)流分析,獲得每個程序點上每個內(nèi)存對象取值的上近似;
步驟C、基于缺陷模式規(guī)則與數(shù)據(jù)流分析的結(jié)果,充分識別代碼級內(nèi)存缺陷檢測對象;
步驟D、基于缺陷模式規(guī)則與數(shù)據(jù)流分析的結(jié)果,準(zhǔn)確的判定代碼級內(nèi)存缺陷檢測對象是否是缺陷。
其中所屬步驟B可靠的數(shù)據(jù)流分析的過程如圖2所示,具體分以下步驟:
步驟B.1、對每個函數(shù)進(jìn)行流敏感、域敏感的數(shù)據(jù)流分析,獲得該函數(shù)每個程序點上每個內(nèi)存對象由抽象內(nèi)存模性描述的存儲上近似;
步驟B.2、基于該函數(shù)數(shù)據(jù)流分析的結(jié)果,生成該函書的符號化函數(shù)摘要;
其中所屬步驟B.1對每個函數(shù)進(jìn)行流敏感、域敏感的數(shù)據(jù)流分析的過程如圖3所示,具體分以下步驟:
步驟B.1.1、取一個控制流圖節(jié)點作為待處理節(jié)點,
步驟B.1.2、如果該控制流圖節(jié)點有函數(shù)調(diào)用,轉(zhuǎn)步驟B.1.3,否則,轉(zhuǎn)步驟B.1.5;
步驟B.1.3、獲得被調(diào)用函數(shù)的符號化函數(shù)摘要,基于調(diào)用點的上下文環(huán)境對符號化函數(shù)摘要進(jìn)行實例化;
步驟B.1.4、基于實例化后的函數(shù)摘要對調(diào)用點處進(jìn)行數(shù)據(jù)流更新;
步驟B.1.5、對該節(jié)點的遷移操作進(jìn)行處理。
其中所屬步驟C充分識別代碼級內(nèi)存缺陷檢測對象的過程如圖4所示,具體分以下步驟:
步驟C.1、基于各種代碼級內(nèi)存缺陷呈現(xiàn)時所具有的語法特征,根據(jù)預(yù)處理后的程序識別出初始的代碼級內(nèi)存缺陷檢測對象;
步驟C.2、根據(jù)數(shù)據(jù)流分析的結(jié)果,分析出每個初始檢測對象對應(yīng)的代碼級內(nèi)存缺陷檢測對象及檢測點;
其中所屬步驟D準(zhǔn)確的判定代碼級內(nèi)存缺陷檢測對象是否是缺陷的過程如圖5所示,具體分以下步驟:
步驟D.1、對于代碼級內(nèi)存缺陷檢測點,基于數(shù)據(jù)流分析結(jié)果獲得代碼級內(nèi)存缺陷檢測對象的存儲狀態(tài);
步驟D.2、基于代碼級內(nèi)存缺陷模式,判定該代碼級內(nèi)存缺陷檢測對象的存儲狀態(tài)是否符合該類代碼級內(nèi)存缺陷模式。