手機(jī)版WPS 手機(jī)版wps免費(fèi)下載
2022-11-29
更新時(shí)間:2022-04-03 14:42:22作者:佚名
軟件白盒測試中,需要對待測程序的結(jié)構(gòu)進(jìn)行分析,根據(jù)不同的覆蓋策略,設(shè)計(jì)不同功能的探針函數(shù)并確定合適的插入點(diǎn)。同時(shí),為了完成插裝、保證搜集到正確的被測程序執(zhí)行信息,便于統(tǒng)計(jì)執(zhí)行結(jié)果以及輸出測試報(bào)告,還需要進(jìn)行程序結(jié)構(gòu)的調(diào)整、輔助信息的添加等程序修改以及信息的提取操作。
目前常用來進(jìn)行信息提取修改的工具主要有Gcc、JavaCC等,雖然可以達(dá)到目的,但無論實(shí)現(xiàn)的復(fù)雜度還是可操作性都面臨較大的挑戰(zhàn),而Eclipse CDT開源工具提供了有力的支持,基于其強(qiáng)大的方法庫以及清晰簡潔的架構(gòu),我們可以方便地使用程序抽象語法樹(AST)信息。本文采用Eclipse CDT開源包,進(jìn)行待測程序AST的獲取,并結(jié)合此結(jié)構(gòu)完成覆蓋策略實(shí)現(xiàn)的部分工作。
1 程序修改與信息提取工具
對源程序進(jìn)行修改及信息提取主要有以下兩種方式:
?。?)直接編寫針對源程序語言的詞法、語法分析器,對源程序進(jìn)行分析,得到源程序的信息,并在修改后重建。
?。?)利用開源工具實(shí)現(xiàn)。常用工具屬于第一種方式,這種方式特點(diǎn)是,語法識別準(zhǔn)確,提取的源代碼信息比較準(zhǔn)確,編寫靜態(tài)信息輸出接口也有利于實(shí)現(xiàn)交互,但是由于語言描述比較復(fù)雜,實(shí)現(xiàn)難度比較大。
2 基于Eclipse CDT的程序修改
2.1 程序標(biāo)準(zhǔn)化
本文所說的標(biāo)準(zhǔn)化,主要是進(jìn)行源程序結(jié)構(gòu)的調(diào)整。主要的調(diào)整有:①注釋語句的去除②為分支循環(huán)語句添加語句塊標(biāo)記“{}”。在AST中注釋語句對應(yīng)的節(jié)點(diǎn)類型為IASTComment,當(dāng)遍歷到該類型節(jié)點(diǎn)時(shí),不進(jìn)行其他操作。CASTIfStatement類型對應(yīng)if語句,CASTCompoundStatement類型對應(yīng)語句塊“{}”節(jié)點(diǎn)并作為CASTIfStatement節(jié)點(diǎn)的孩子節(jié)點(diǎn)出現(xiàn),因此可以通過判斷CASTIfStatement節(jié)點(diǎn)下是否存在CASTCompoundStatement節(jié)點(diǎn)判斷該if語句是否有語句塊標(biāo)記,如果沒有的話,在將if語句的對應(yīng)的token寫入新文件之前,應(yīng)該先寫入“{”,然后寫入if語句,最后寫入“}”,而對應(yīng)CASTSwitchStatement語句以及循環(huán)語句CASTForStatement,CASTWhileStatement等有相似的操作。這樣,通過去除注釋以及添加花括號,我們得到標(biāo)準(zhǔn)的程序結(jié)構(gòu),為后續(xù)插樁點(diǎn)確定、路徑統(tǒng)計(jì)等做準(zhǔn)備。
2.2 隱藏段的添加
隱藏段的作用主要是用來記錄程序的執(zhí)行路徑, 以便于進(jìn)行覆蓋分析、路徑分析乃至測試用例生成等工作,列如只有if語句而缺少與之搭配的else語句,就需要在遍歷AST的過程中自動(dòng)添加else隱藏段。
2.3 探針函數(shù)的插樁
在對AST訪問的過程中,讀取之前信息提取時(shí)確定的插裝點(diǎn)信息,將探針庫的頭文件“probe.h”以及相應(yīng)的探針函數(shù)調(diào)用使用文件流寫到文件中。為了不影響源程序的邏輯完整,插入探針函數(shù)時(shí)可以采用特殊結(jié)構(gòu),例如逗號表達(dá)式、多目表達(dá)式等。
3 基于Eclipse CDT的程序信息提取
具體到不同的策略,item可以是可執(zhí)行語句、條件語句、分支語句和路徑等。利用AST節(jié)點(diǎn)類型,實(shí)現(xiàn)這些信息的統(tǒng)計(jì)非常方便。
3.1 統(tǒng)計(jì)信息
對于待測程序來說,通過CDT得到的AST中,每一條語句都對應(yīng)一個(gè)IASTStatement節(jié)點(diǎn),統(tǒng)計(jì)總的可執(zhí)行語句數(shù)時(shí),只需要排除非可執(zhí)行語句,然后設(shè)置全局變量,對可執(zhí)行語句進(jìn)行計(jì)數(shù),當(dāng)AST遍歷完成之后,整個(gè)待測函數(shù)的可執(zhí)行語句數(shù)即可獲得。同樣,AST中,每個(gè)分支、每個(gè)條件都會(huì)作為單獨(dú)的節(jié)點(diǎn)出現(xiàn),相應(yīng)的全局變量即可完成統(tǒng)計(jì)。
3.2 計(jì)算信息
覆蓋測試中的路徑總數(shù),需要通過計(jì)算獲取。分析如下:
對于一條路徑,需要考慮兩個(gè)元素,一是節(jié)點(diǎn),二是節(jié)點(diǎn)之間的邊。
3.2.1 節(jié)點(diǎn)
首先,對于一組順序執(zhí)行語句來說,可以將其看作一個(gè)節(jié)點(diǎn)。對于條件語句來說,情況較為復(fù)雜,往往需要考慮條件的類型,具體來說,例如表達(dá)式“if(a < b || b < c && c > 1)”,我們需要建立三個(gè)節(jié)點(diǎn),節(jié)點(diǎn)1為“a < b”,當(dāng)取真時(shí),則進(jìn)入if語句塊內(nèi)執(zhí)行,否則執(zhí)行節(jié)點(diǎn)2“b < c”,對于節(jié)點(diǎn)2,當(dāng)取真時(shí),執(zhí)行節(jié)點(diǎn)3“c > 1”,否則,會(huì)直接執(zhí)行整個(gè)if條件表達(dá)式為假之后的語句。另外,跳轉(zhuǎn)語句之后不應(yīng)該與其他節(jié)點(diǎn)有邊相連。
3.2.2 節(jié)點(diǎn)之間的邊
根據(jù)節(jié)點(diǎn)類型,邊的關(guān)系有,順序節(jié)點(diǎn)與條件節(jié)點(diǎn)相連,條件節(jié)點(diǎn)與順序節(jié)點(diǎn)相連,條件節(jié)點(diǎn)中不同類型的子表達(dá)式節(jié)點(diǎn)相連,其他節(jié)點(diǎn)與跳轉(zhuǎn)節(jié)點(diǎn)相連等。
在遍歷AST過程中,我們通過節(jié)點(diǎn)名來判斷節(jié)點(diǎn)類型,并以此來建立節(jié)點(diǎn)與節(jié)點(diǎn)之間的邊的關(guān)系,可以選鄰接矩陣來進(jìn)行存儲(chǔ)表示。當(dāng)AST訪問完成,通過鄰接矩陣即可完成路徑總數(shù)計(jì)算。
4 總結(jié)
軟件白盒測試中,程序信息的修改與獲取是關(guān)鍵點(diǎn),常規(guī)工具如Gcc、JavaCC等面臨復(fù)雜度高,操作不方便的問題,而Eclipse CDT提供了強(qiáng)大的分析功能。在此基礎(chǔ)之上,可以集中在覆蓋算法設(shè)計(jì)實(shí)現(xiàn)上,本文提出了幾種覆蓋策略所需條件的算法實(shí)現(xiàn)。同時(shí),除了本文中CDT適用于C/C++,基于Eclipse的AST提取工具還可以支持Java、Javascript等,它們都可以同CDT集成,對于完成更加強(qiáng)大通用的應(yīng)用,提供廣泛的支持。