一種靜態(tài)缺陷檢測方法及其系統(tǒng)的制作方法
【技術領域】
[0001]本發(fā)明涉及軟件測試技術,尤其涉及一種靜態(tài)缺陷檢測方法及其系統(tǒng)。
【背景技術】
[0002]靜態(tài)缺陷檢測是指在不執(zhí)行程序的情況下對代碼進行分析,通過程序語法及程序抽象語義計算來判斷所有可能的程序運行時屬性違反。靜態(tài)缺陷檢測的基本特征是在對軟件進行分析、檢查和測試時,被測試的程序沒有被實際運行,它可以對各種文檔進行測試,是軟件開發(fā)過程中十分有效的質量控制方法之一。
[0003]靜態(tài)缺陷檢測的對象一般是程序源碼或者二進制的可執(zhí)行程序。由于靜態(tài)缺陷檢測技術可以針對源代碼部分內容進行分析,無需編譯運行整個程序。對于那些很難檢測的小概率缺陷,靜態(tài)缺陷檢測技術能夠取得較好的測試效果,因此成為構建可信軟件的重要手段。
[0004]現(xiàn)有的靜態(tài)檢測技術在進行路徑遍歷時常采用變量矛盾取值來判斷是否可達,但是此種判斷路徑是否可達的方法是不完備的,在遍歷過程中可能會存在大量誤報,從而不能精確排除不可達路徑,影響了缺陷檢測的精度。
【發(fā)明內容】
[0005]本發(fā)明提供一種靜態(tài)缺陷檢測方法及其系統(tǒng),通過綜合采用矛盾的變量取值判斷和條件約束驗證方法判斷程序中的不可達路徑,從而提高了缺陷檢測的精確性。
[0006]根據上述目的,本發(fā)明提供了一種靜態(tài)缺陷檢測方法,其特征在于,所述方法包括:
[0007]S1、構造被測程序的抽象語法樹和控制流圖;
[0008]S2、根據預設的缺陷模式,建立所述缺陷模式的狀態(tài)機實例,并將所述狀態(tài)機實例置于待測程序的控制流入口;
[0009]S3、依路徑遍歷控制流圖,并計算在遍歷過程中每個控制流節(jié)點的變量的區(qū)間信息;
[0010]S4、根據每個所述控制流節(jié)點的變量的區(qū)間取值信息,實時地更新所述狀態(tài)機實例的狀態(tài),直至檢測到所述狀態(tài)機實例的缺陷或遍歷完成所有路徑上的控制流節(jié)點。
[0011 ] 其中,所述步驟S3具體包括:
[0012]S31,在所述控制流入口處將輸入值生成初始符號,取區(qū)間理論中的上界作為初始區(qū)間;
[0013]S32、在數據流迭代過程中根據當前控制流節(jié)點的語義信息對各類程序語句中的變量進行符號表示,生成符號表達式;
[0014]S33、通過對所述符號表達式進行區(qū)間運算得到所述當前控制流節(jié)點的每個變量的區(qū)間信息。
[0015]其中,所述步驟S4具體包括:
[0016]S41,根據當前控制流節(jié)點的變量的區(qū)間取值信息,實時地更新當前控制流節(jié)點的狀態(tài)機實例的狀態(tài)和路徑條件,依據路徑條件中變量取值是否矛盾,判斷是否為不可達路徑,如果變量取值矛盾,則為不可達路徑,將當前狀態(tài)機實例銷毀,結束檢測過程,否則,進入下一步;
[0017]S42,讀取當前狀態(tài)機實例狀態(tài)的條件約束,如果該狀態(tài)的路徑條件中的變量取值滿足條件約束,則路徑可達,繼續(xù)執(zhí)行下一個控制流節(jié)點;否則為不可達路徑,將當前狀態(tài)機實例銷毀,結束檢測過程;
[0018]S43,重復步驟S41和S42,直至檢測到所述狀態(tài)機實例的缺陷或遍歷完成所有路徑上的控制流節(jié)點。
[0019]其中,所述方法還包括:
[0020]提取檢測到的所述狀態(tài)機實例的缺陷發(fā)生的條件約束;將所述缺陷和所述約束條件作為約束求解器的輸入進行求解,如果求解失敗,表示檢測到的所述狀態(tài)機實例的缺陷的語義程序不可行,檢測到的所述狀態(tài)機實例的缺陷判定為誤報。
[0021]根據本發(fā)明的另一個方面,提供一種靜態(tài)缺陷檢測系統(tǒng),其特征在于,所述系統(tǒng)包括:
[0022]模型構造單元,用于構造被測程序的抽象語法樹和控制流圖;
[0023]狀態(tài)機實例構造單元,用于根據預設的缺陷模式,建立所述缺陷模式的狀態(tài)機實例,并將所述狀態(tài)機實例置于待測程序的控制流入口 ;
[0024]分析計算單元,用于依路徑遍歷控制流圖,并計算在遍歷過程中每個控制流節(jié)點的變量的區(qū)間信息;
[0025]缺陷檢測單元,用于根據每個所述控制流節(jié)點的變量的區(qū)間取值信息,實時地更新狀態(tài)機實例的狀態(tài),直至檢測到所述狀態(tài)機實例的缺陷或遍歷完成所有路徑上的控制流節(jié)點。
[0026]其中,所述系統(tǒng)還包括:
[0027]缺陷判斷單元,用于提取檢測到的所述狀態(tài)機實例的缺陷發(fā)生的條件約束;將所述缺陷和所述約束條件作為約束求解器的輸入進行求解,如果求解失敗,表示檢測到的所述狀態(tài)機實例的缺陷的語義程序不可行,檢測到的所述狀態(tài)機實例的缺陷判定為誤報。
[0028]本發(fā)明的靜態(tài)缺陷檢測方法,依被測程序的控制流圖對每一條潛在路徑進行遍歷,基于符號化的區(qū)間分析技術,對變量和表達式進行區(qū)間運算,同時,通過綜合采用矛盾的變量取值判斷和條件約束驗證方法判斷程序中的不可達路徑,從而提高了缺陷檢測的精確性;另外,通過約束求解器對檢測到的缺陷進行判斷,對檢測到的結果進行了求精,從而可以消除缺陷的誤報。
【附圖說明】
[0029]通過參考附圖會更加清楚的理解本發(fā)明的特征和優(yōu)點,附圖是示意性的而不應理解為對本發(fā)明進行任何限制,在附圖中:
[0030]圖1示出了本發(fā)明的靜態(tài)缺陷檢測方法的流程圖;
[0031]圖2示出了本發(fā)明的靜態(tài)缺陷檢測方法過程中的符號執(zhí)行與體執(zhí)行、區(qū)間分析的關系圖;
[0032]圖3示出了本發(fā)明的靜態(tài)缺陷檢測系統(tǒng)的結構框圖。
【具體實施方式】
[0033]下面將結合附圖對本發(fā)明的實施例進行詳細描述。
[0034]圖1示出了本發(fā)明的靜態(tài)缺陷檢測方法的流程圖。
[0035]參照圖1,本發(fā)明的靜態(tài)缺陷檢測方法具體包括:
[0036]S1、構造被測程序的抽象語法樹和控制流圖;
[0037]首先通過程序的源代碼或二進制文件構建待測程序的抽象語法樹,進而將缺陷檢測問題轉化為抽象程序分析及模式識別問題。通過對源代碼解析,可以構建數種抽象程序模型,進而可以描述程序各個方面的表現(xiàn)行為。
[0038]抽象語法樹(Abstract Syntax Tree,AST)在更多情況下是首先創(chuàng)建的程序模型。抽象語法樹的節(jié)點對應于解析樹上的源代碼。抽象語法樹是創(chuàng)建更復雜的圖結構(模型)的基礎,這些圖用于不同類型(不同復雜程度)的分析算法,例如控制流圖(Control FlowGraph, CFG) ο控制流圖代表了所有程序執(zhí)行可能被遍歷到的部分,每個節(jié)點代表程序的一個基本語句塊,指向邊代表程序的可能執(zhí)行路徑。
[0039]程序的控制流圖可以表示為一個有向圖G = (N,E,%,nf),其中:N代表節(jié)點的集合,每個節(jié)點IiiG N反映程序中的順序執(zhí)行語句CommonStmt、條件判斷語句Select1nStmt、循環(huán)語句LoopStmt等,與節(jié)點Iii關聯(lián)的程序語句塊表示為Stmt (η );E e NXN代表有向邊的集合,反映程序中語句間的控制流關系,eh和ej別表示有向邊e的頭節(jié)點和尾節(jié)點:?為函數的唯一入口節(jié)點,n f為函數的唯一退出節(jié)點。
[0040]S2、根據預設的缺陷模式,建立所述缺陷模式的狀態(tài)機實例,并將所述狀態(tài)機實例置于待測程序的控制流入口;
[0041]缺陷模式是指程序中經常發(fā)生的缺陷所呈現(xiàn)出的語法或語義特征。缺陷模式是對程序屬性的一種描述,若違反該屬性則造成一個缺陷。對于時序安全類型的缺陷模式,例如資源泄露缺陷(Resource Leak, RL)、空指針解引用缺陷(Null Pointer Dereference, NPD)等,有限狀態(tài)自動機是一種常用和易于理解的抽象表示,因此缺陷模式也可以用缺陷模式狀態(tài)機來表示。
[0042]缺陷模式狀態(tài)機用于描述缺陷模式的有限狀態(tài)機(Finite State Machine,F(xiàn)SM),包括狀態(tài)集合、狀態(tài)迀移集合、及迀移條件集合,其中D = {$start,$error}UDother,T:DXCondit1ns — D。$start和$error分別表示起始狀態(tài)和錯誤狀態(tài),Dtrthw表示其他中間狀態(tài)的集合。
[0043]缺陷模式描述了程序代碼中常見的含有缺陷的編程實踐。缺陷模式必須滿足以下幾個條件:
[0044]I)該模式下的缺陷是符合實際的。就是說,該模式下所定義的缺陷在實際工程中是實際存在的。
[0045]2)基于該模式的缺陷數目是可以容忍的。通常來講,缺陷個數與系統(tǒng)規(guī)模呈線性關系O
[0046]3)該模式下的缺陷是可以測試的。應存在一個算法可以檢查出這個缺陷。
[0047]S3、依路徑遍歷控制流圖,并計算在遍歷過程中每個控制流節(jié)點的變量的區(qū)間信息;
[0048]所述步驟S3具體包括:
[0049]S31,在所述控制流入口處將輸入值生成初始符號,取區(qū)間理論中的上界作為初始區(qū)間;
[0050]S32、在數據流迭代過程中根據當前控制流節(jié)點的語義信息對各類程序語句中的變量進行符號表示,生成符號表達式;
[0051]如果是變量聲明語句則為其生成符號并取上界作為其區(qū)間;如果是變量定義語句則將定義處右值表達式的符號執(zhí)行結果作為變量的符號表達式。
[0052]S33、通過對所述符號表達式進行區(qū)間運算得到所述當前控制流節(jié)點的每個變量的區(qū)間信息。
[0053]圖2示出了本發(fā)明的靜態(tài)缺陷檢測方法過程中的符號執(zhí)行與體執(zhí)行、區(qū)間分析的關系圖;
[0054]參照圖2,符號化的區(qū)間分析采用符號表達式表示變量的取值信息,將程序中變量間的運算映射為符號表達式之間的運算,其中,具體執(zhí)行語義下的程序變量Cvm、程序表達式(^_首先經過程序轉換技術,轉換為形式化的抽象語法樹結構,然后符號執(zhí)行語義通過符號生成器訪問程序變量相關的AST節(jié)點(一般為PrimaryExpress1n或PostfixExpress1n類型的節(jié)點)生成原子符號Svar,通過符號表達式生成器訪問表達式相關的 AST