一種程序不可達路徑的自動檢測方法
【技術(shù)領(lǐng)域】
[0001 ]本發(fā)明屬于軟件測試領(lǐng)域,具體地,本發(fā)明設及一種程序不可達路徑的自動檢測 方法。
【背景技術(shù)】
[0002] 術(shù)語解釋:
[0003] 控制流圖:控制流圖(Con化〇1FlowGraph)是程序語句邏輯執(zhí)行順序的圖形化表 達方式,簡稱為CFGXFG包括節(jié)點和有向邊兩類元素:節(jié)點表示程序中的語句,并且有唯一 的入口節(jié)點與出口節(jié)點;邊表示節(jié)點之間的順序關(guān)系。
[0004]程序路徑:是指由CFG中的節(jié)點構(gòu)成的一個序列,若該序列的首節(jié)點為入口節(jié)點, 末節(jié)點為出口節(jié)點,則該路徑稱為完整路徑。
[000引不可達路徑:是指在任何情況下都不會出現(xiàn)的程序路徑。
[0006]軟件測試是軟件質(zhì)量保障的重要手段,需要耗費大量的人力與物力。統(tǒng)計數(shù)據(jù)表 明,軟件測試的開銷占到了軟件開發(fā)總成本的60%W上。軟件測試的自動化是提高軟件測 試質(zhì)量、降低成本、提高效率的一個重要途徑,因此被學術(shù)界與工業(yè)界廣泛地關(guān)注與研究。 大體上,軟件測試可W分為功能測試與結(jié)構(gòu)測試,后者是指對程序的內(nèi)部邏輯結(jié)構(gòu)進行測 試,W判定程序的各條路徑是否能夠滿足需求。然而充分覆蓋程序的測試是難W達成的,因 為即使是并不復雜的程序段,也會由于分支、循環(huán)結(jié)構(gòu)的存在,導致產(chǎn)生規(guī)模巨大的路徑空 間。因此,結(jié)構(gòu)測試的一個重要研究領(lǐng)域,就是解決面向程序路徑的測試數(shù)據(jù)生成問題。而 不可達路徑的檢測,則是其中的一個重要研究熱點。所謂的程序不可達路徑,是指在任何輸 入下,都不會被執(zhí)行的程序路徑。程序不可達路徑的存在,會導致在生成測試數(shù)據(jù)時,產(chǎn)生 大量的無效測試數(shù)據(jù),從而在測試執(zhí)行時浪費大量的人力與物力,從而大大影響到測試的 效率。因此,不可達路徑的檢測不僅能夠降低測試成本,還能夠有效提高測試效率,一直W 來都是軟件測試領(lǐng)域的一個研究熱點。
[0007] 程序中所存在的不可達路徑是代碼冗余的一種表現(xiàn)形式,Live巧〇〇1大學的化tes 與Malevris兩位學者,通過實驗證明了在大型軟件系統(tǒng)中通常都會包含有10-25%的冗余 代碼。不可達路徑的檢測問題已經(jīng)被證明是一個不可判定問題,因此所有的檢測方法都是 非完備的,即不存在能夠檢測出所有不可達路徑的算法。目前,檢測程序不可達路徑的方 法,可W分為靜態(tài)檢測與動態(tài)檢測兩類。
[000引1.靜態(tài)檢測技術(shù)
[0009]靜態(tài)檢測技術(shù)可依據(jù)原理,分為兩類:
[0010] ?基于路徑條件可滿足性的方法:是指針對所有的程序路徑,通過對滿足路徑條 件的謂詞組合進行求解,依據(jù)解的存在性來判定路徑的可達性。運類方法具有較高的復雜 度。
[0011] ?基于分支相關(guān)性的方法:是指通過對分支語句進行相關(guān)性分析的手段,來檢測 不可達路徑。
[0012] 在第一類技術(shù)中,典型的方法,是抽取程序的每條路徑的分支謂詞,并規(guī)約為一個 方程組,通過求解方程組是否有解來判定路徑是否可達。然而運類方法具有較高的復雜性, 并且缺乏表達數(shù)組、結(jié)構(gòu)體等復合數(shù)據(jù)類型的能力。此外,還有一些類似的方法:使用區(qū)間 算術(shù)規(guī)約程序路徑,但運類方法在處理條件謂詞中的非線性表達式時,效率較為低下;使用 代碼模式檢測程序分支,并通過符號執(zhí)行技術(shù)進行路徑的可達性檢測,但運類方法的通用 性受到代碼模式的約束;使用變量的抽象取值范圍規(guī)約程序的狀態(tài)條件,通過判斷路徑的 變量取值范圍來判定路徑是否可達,但運類方法不能很好地處理復合的分支條件。
[0013]程序分支之間的相關(guān)性是產(chǎn)生不可達路徑的主要原因,在具有一定復雜度的程序 中,9-40%的分支語句會存在相關(guān)系。但基于相關(guān)性分析的檢測方法由于無法分析結(jié)構(gòu)復 雜的分支條件,因此難W獲得令人滿意的節(jié)點覆蓋率。該類方法的代表性工作包括:在傳統(tǒng) 的數(shù)據(jù)流分析中加入了分支相關(guān)性分析,從而提高傳統(tǒng)數(shù)據(jù)流分析的精度;通過判斷賦值 語句、分支語句之間的沖突性來識別不可達路徑,然而該方法卻缺乏處理循環(huán)結(jié)構(gòu)的能力; 通過對控制流與數(shù)據(jù)流的靜態(tài)分析,來確定相關(guān)性語句,并進而判定不可達路徑,其特點是 能夠處理函數(shù)調(diào)用關(guān)系。
[0014] 2.動態(tài)檢現(xiàn)版術(shù)
[0015]動態(tài)檢測技術(shù)是指在進行路徑測試的過程中,依據(jù)測試用例生成的復雜度來判定 待測試的路徑是否可達。然而動態(tài)檢測技術(shù)的檢查代價通常較大,并且無法保證檢測結(jié)果 的絕對準確,具有較強的不確定性。
[0016]常見的方法包括:使用基于啟發(fā)式策略的方法檢測不可達路徑,其依據(jù)是可達路 徑的部分屬相同運一原理,從而通過檢測試數(shù)據(jù)的生成軌跡來實現(xiàn)路徑可達性的檢測;使 用語義更新技術(shù),從程序語義上來排除程序中的不可達路徑;利用遺傳算法來檢測不可達 路徑,為了更好地引導捜索,該類方法會通過融合控制流圖的信息,進行適應度函數(shù)的設 計。
[0017]現(xiàn)有的技術(shù)方案,存在W下的問題:
[0018] (1)復雜度較高,檢測效率較低。
[0019] (2)難W處理復合的數(shù)據(jù)類型。
[0020] (3)理論、方法及過程較為復雜,不利于推廣與應用。
[0021] (4)檢測結(jié)果具有不確定性。
[0022] (5)自動化程度較低。
[0023] (6)在處理復雜的程序分支W及分支條件時,效果不佳。
[0024]為了彌補上述缺點,本發(fā)明提出了一種程序不可達路徑檢測方法,是基于模型檢 測技術(shù),通過將程序控制流圖轉(zhuǎn)化為自動機模型,使用狀態(tài)空間捜索的方法來判定自動機 狀態(tài)的可達性,并依據(jù)狀態(tài)的可達性來生產(chǎn)不可達路徑。在已知的方法中,還沒有發(fā)現(xiàn)與本 發(fā)明相類似的實現(xiàn)方案。
【發(fā)明內(nèi)容】
[0025]為解決上述問題,本發(fā)明提供了一種程序不可達路徑的自動檢測方法。本發(fā)明W 理論上較為簡單的狀態(tài)捜索技術(shù)為基礎,相比已有技術(shù)通?;谳^復雜的數(shù)學理論,有效 降低了技術(shù)運用與推廣的難度;提供了完整的、具有較高自動化程度的程序不可達路徑檢 測方法;解決了控制流圖的可達性檢測問題;解決了靜態(tài)分析技術(shù)在處理較復雜程序時所 存在的困難與低效問題;解決了靜態(tài)分析技術(shù)在處理多分支程序的過程中,難W表達復合 型數(shù)據(jù)的問題。
[0026]為達到上述技術(shù)效果,本發(fā)明的技術(shù)方案是:
[0027]-種程序不可達路徑的自動檢測方法,包括如下步驟:
[0028]步驟1)將待檢測的計算機程序轉(zhuǎn)化為控制流圖;
[0029]步驟2)通過改進的廣度優(yōu)先捜索策略將控制流圖轉(zhuǎn)化為程序模型;
[0030]步驟3)分析每個狀態(tài)是否可達,尋找程序中的不可達路徑,方法為:驗證程序模型 中的每個狀態(tài)S是否存在一條包含S的狀態(tài)序列;若對于某個狀態(tài)S,不存在包含S的狀態(tài)序 列,則此狀態(tài)為不可達狀態(tài);
[0031]步驟4)采用模型檢測技術(shù)自動檢測步驟2)中的程序模型,得到不可達狀態(tài)的集 合;
[0032]步驟5)根據(jù)不可達狀態(tài)的集合,捜索程序路徑是否包含不可達狀態(tài),得到不可達 路徑集合。
[0033]進一步的改進,所述步驟2)中,程序模型為包含狀態(tài)、遷移和遷移標號Ξ大要素的 形式化模型,且不包含狀態(tài)、遷移和標號Ξ大要素W外的性質(zhì)要素。
[0034] 進一步的改進,所述改進的廣度優(yōu)先捜索策略具體為:
[0035]3.1)遍歷控制流圖中的每個節(jié)點,若該節(jié)點是一個賦值語句,則創(chuàng)建一個新的狀 態(tài),并W該賦值語句為遷移標號,創(chuàng)建一個從前驅(qū)狀態(tài)到新狀態(tài)的遷移;若該節(jié)點是一個判 定語句,則創(chuàng)建兩個新的狀態(tài),分別表示判定條件為真和假兩種情況,并依據(jù)判定語句的真 假兩種取值情況生成遷移標號;
[0036] 3.2)若當前節(jié)點的后繼節(jié)點是遍歷過的節(jié)點,則創(chuàng)建一個從當前節(jié)點到后繼節(jié)點 的前一節(jié)點的空標號遷移;
[0037] 3.3)記錄每個節(jié)點所對應的狀態(tài)。
[0038]進一步的改進,所述步驟5)中,采用遞歸策略捜索程序路徑是否包含不可達狀態(tài)。
[0039]進一步的改進,采用遞歸策略捜索程序不可達路徑的方法具體為:捜索程序模型 的所有狀態(tài),若捜索到的狀態(tài)為終止狀態(tài)則遞歸終止,并判斷當前生成的路徑中是否包含 不可達狀態(tài),若包含,則當前生成的路徑是不可達路徑;若捜索到的狀態(tài)不是終止狀態(tài),貝U 將當前狀態(tài)加入到程序路徑中,并檢查當前狀態(tài)的所有后繼狀態(tài),若后繼狀態(tài)未出現(xiàn)在程 序路徑中,則對該后繼狀態(tài)繼續(xù)進行遞歸。
[0040] 本發(fā)明的優(yōu)點:
[0041] (1)原理與過程較為簡單,技術(shù)口檻低,易于推廣與應用。
[0042](2)自動化程度高,人工干預的成分較少。
[0043] (3)能夠處理豐富的程序運算與數(shù)據(jù)類型。
[0044](4)處理過程不受程序結(jié)構(gòu)復雜性的影響。
[004引(5)檢測效率存在不斷提高的空間。
【附圖說明】
[0046]圖1為本發(fā)明的流程示意圖;
[0047]圖2為不例程序的巧制流圖;
[0048] 圖3為示例程序的程序模型;
[0049]圖4為程序模型檢測的基本過程;
[0050]圖5UPPAAL建模語言所描述的程序模型;
[0051 ]圖6由UPPAAL模型檢測器的驗證結(jié)果圖。
【具體實施方式】
[0052]下面結(jié)合附圖對本發(fā)明的【具體實施方式】進行詳細的說明。
[0053] 實施例1
[0054] 如圖1所示的一種程序不可達路徑的自動檢測方法,步驟如下:
[0055] 1.將待檢測的計算機程序轉(zhuǎn)化為控制流圖。
[0056] 2.使用程序模型生成算法(算法1),將控制流圖轉(zhuǎn)換為包含"狀態(tài)、遷移、標號"Ξ 大要素的形式化模型(即程序模型)。
[0057] 3.通過可達性分析,得到待驗證性質(zhì)。
[0058] 4.將程序的自動機模型及待驗證性質(zhì)輸入模型檢測工具,得到不可達狀態(tài)集合。
[0059]5.由不可達狀態(tài)集合,通過不可達路徑捜索算法(算法2),得到不可達路徑集合。
[0060]將程序中所有變量的一次取值稱為程序狀態(tài):
[0061]定義1程序變量程序中所定義的變量稱為程序變量,將所有程序變量的集合記為 Var。
[006引定義2程序狀態(tài)若Var中具有η個變量vi、V2、…Vn,程序狀態(tài)s= ;rir2···!·。,且riER,vi=ri0
[0063]CFG圖包含節(jié)點與有向邊兩類元素,其中節(jié)點表示程序的語句。顯然任何一條賦值 語句的執(zhí)行,都可能導致一個或多個程序變量發(fā)生變化,從而導致程序狀態(tài)發(fā)生變化。
[0064]由此,可W將一個程序轉(zhuǎn)換為一臺擴展的確定型有限自動機,稱為程序模型:
[006引定義3程序模型程序模型是一個?1=儀3日,36人6),其中:
[0066] ?S為程序狀態(tài)集合.
[0067]參so為初始程序狀態(tài).
[0068] 參Se為終止程序狀態(tài).
[0069] ?A為遷移標號集合,一個遷移標號a=(g,e),g是一個布爾表達式,e是一組賦值 表達式.
[0070]參復C務X^W惱}XS為遷移關(guān)系.
[0071]為了描述程序模型的生成算法,給出控制流圖的形式化定義。
[0072] 定義3控制流圖一張控制