日韩成人黄色,透逼一级毛片,狠狠躁天天躁中文字幕,久久久久久亚洲精品不卡,在线看国产美女毛片2019,黄片www.www,一级黄色毛a视频直播

一種程序中不可達路徑的靜態(tài)檢測方法

文檔序號:6341279閱讀:278來源:國知局
專利名稱:一種程序中不可達路徑的靜態(tài)檢測方法
技術(shù)領(lǐng)域
本發(fā)明涉及軟件測試技術(shù),尤其涉及一種程序中不可達路徑的靜態(tài)檢測方法。
背景技術(shù)
在軟件的測試過程中,如果能夠盡早發(fā)現(xiàn)程序中存在不可達路徑,可以避免在動 態(tài)測試階段耗費大量的人力物力來為不可達路徑生成測試用例。因此,程序中不可達路徑 的檢測對于軟件開發(fā)的整個過程都具有十分重要的意義。目前,利用靜態(tài)分析方法來檢測程序中的不可達路徑,盡管還不可能檢測出所有 的不可達路徑,但卻可以通過分析路徑條件中的變量取值范圍信息來確定一部分不可達路 徑,并可驗證該程序中檢測出的不可達路徑的結(jié)果百分之百正確,這對測試的精確性的提 高是非常有益的。程序不可達路徑信息,不僅可以優(yōu)化一些基于數(shù)據(jù)流分析的工具,更有利于軟件 測試過程的實現(xiàn),主要體現(xiàn)在以下幾個方面1、改善程序靜態(tài)分析的準確性路徑敏感的數(shù)據(jù)流分析方法考慮程序分支間的組 合關(guān)系,存在矛盾的分支條件可能由于位于不可達路徑上而不必分析。2、直接應(yīng)用于單元測試在路徑覆蓋測試以及其他的覆蓋測試(如分支覆蓋、判 定覆蓋、修改的條件判定覆蓋)中,選擇待測路徑的算法可以避免由分支條件矛盾所造成 的不可達路徑,從而減少了測試用例生成的耗費。3、提高路徑敏感缺陷檢測算法的準確性如果靜態(tài)分析在一條不可達路徑上報告 了一個缺陷,那么這無疑是個誤報。盡早地檢測出不可達路徑可有效地減少誤報,降低誤報 率,提高算法識別潛在缺陷的效率。

發(fā)明內(nèi)容
有鑒于此,本發(fā)明的主要目的在于提供一種程序中不可達路徑的靜態(tài)檢測方法, 解決軟件測試中不可達路徑無效計算的問題,以提高程序靜態(tài)分析和測試用例生成的效率。為達到上述目的,本發(fā)明的技術(shù)方案是這樣實現(xiàn)的一種程序中不可達路徑的靜態(tài)檢測方法,該方法包括以下步驟A、對待測試程序的函數(shù)單元進行詞法分析、語法分析及語義分析,生成函數(shù)的控 制流圖;B、通過所述待測試程序中變量值范圍的函數(shù)間分析得到被調(diào)用函數(shù)單元的函數(shù) 摘要;C、在控制流圖的入口和出口節(jié)點之間選取一條路徑p,如果路徑中含有循環(huán)語句 節(jié)點,則采用進入循環(huán)體0次或1次的策略;D、從所述路徑ρ的入口節(jié)點開始,計算各語句節(jié)點處的上下文狀態(tài);如果存在某 節(jié)點的上下文狀態(tài)中有變量取值為空的情況,則表示所述路徑P為不可達路徑,否則,為可達路徑。其中,所述步驟C進一步包括在所述控制流圖中,同一節(jié)點的多次出現(xiàn)視為不同 的路徑節(jié)點。其中,所述步驟D進一步包括D1、設(shè)路徑ρ的入口節(jié)點為entry,出口節(jié)點為exit,并將所述入口節(jié)點設(shè)為當前 節(jié)占.
I— /、、、 D2、計算當前語句節(jié)點η在路徑ρ中的上下文狀態(tài),即應(yīng)用擴展區(qū)間技術(shù)計算各變 量的取值范圍情況;D3、判斷節(jié)點η處的上下文狀態(tài)中是否出現(xiàn)變量取值為空的情況,若是,則執(zhí)行步 驟D4,否則執(zhí)行步驟D5 ;D4、當前路徑ρ為不可達路徑,結(jié)束路徑遍歷;D5、判斷當前節(jié)點是否為出口節(jié)點exit ;若是,則當前路徑ρ為可達路徑,結(jié)束路 徑遍歷;否則,取當前節(jié)點的下一個節(jié)點作為目標節(jié)點,返回步驟D2。步驟D2的進一步包括D21、若所述當前節(jié)點為入口節(jié)點entry,取函數(shù)定義的參數(shù)列表,并將所有的參數(shù) 取值初始區(qū)間設(shè)為Unknown ;否則執(zhí)行步驟D22。D22、取所述當前節(jié)點在路徑ρ上的前驅(qū)節(jié)點上出現(xiàn)的每一個變量的區(qū)間取值,設(shè) 為該變量在當前節(jié)點上的初始區(qū)間值;D23、若所述當前節(jié)點為變量聲明語句,將該變量的取值區(qū)間設(shè)為該變量類型的默 認區(qū)間;否則執(zhí)行步驟D24;D24、若所述當前節(jié)點包含函數(shù)調(diào)用,根據(jù)當前節(jié)點處的上下文狀態(tài)和函數(shù)摘要 更新函數(shù)調(diào)用的返回值區(qū)間以及其他與上下文環(huán)境相關(guān)的變量的區(qū)間值;否則執(zhí)行步驟 D25 ;D25、若所述當前節(jié)點包含賦值語句,則計算右端表達式的區(qū)間取值并以此值來更 新被賦值變量的取值區(qū)間;否則執(zhí)行步驟D26 ;D26、若所述當前節(jié)點所對應(yīng)的語句類型為分支條件判斷語句,則根據(jù)出邊的取值 來計算該節(jié)點所關(guān)聯(lián)的每一變量的新取值區(qū)間;否則執(zhí)行步驟D27 ;D27、若所述當前節(jié)點η所對應(yīng)的語句類型為循環(huán)條件判斷語句,則根據(jù)路徑ρ中 包含循環(huán)體的次數(shù)來計算各變量的取值區(qū)間。所述步驟D23進一步包括D231、若所述當前節(jié)點為數(shù)值類型變量的聲明語句,則將變量的取值區(qū)間設(shè)為 {[MIN, MAX]};否則執(zhí)行步驟D232 ;D232、若所述當前節(jié)點為布爾類型變量的聲明語句,則將變量的取值區(qū)間設(shè)為 TRUE_0R_FALSE ;否則執(zhí)行步驟 D233 ;D233、若所述當前節(jié)點為指針類型變量vp的聲明語句,則為vp生成一個取值六元 組,其中包括以下6個域vp的變量標識、vp的解引用值DerefVal (vp)、vp將要關(guān)聯(lián)的內(nèi) 存空間標識Mem(vp)、vp的別名集AliasSet (vp)、vp在Mem (vp)上的偏移位置Offset (vp) 以及與Mem(vp)關(guān)聯(lián)的指針變量集合RelVar(Vp)。所述步驟D25進一步包括
5
D251、若所述當前節(jié)點上被賦值變量va為數(shù)值類型,則計算右端數(shù)值表達式的區(qū) 間取值并以此值來更新va的取值區(qū)間;否則執(zhí)行步驟D252 ;D252、若所述當前節(jié)點上被賦值變量va為布爾類型,則計算右端數(shù)值表達式的區(qū) 間取值并以此值來更新va的取值區(qū)間;否則執(zhí)行步驟D253 ;D253、若所述當前節(jié)點上賦值號左端為指針變量vp的解引用,則計算右端表達式 的值并以此值來更新AliasSet (vp)中各元素的解引用值;否則執(zhí)行步驟D2M ;D254、若所述當前節(jié)點上賦值號左端為指針變量vp,右端為另一指針變量vp', 則將 vp 從 AliasSet(vp)和 RelVar(vp)中刪除,加入 AliasSet(vp')和 Alias Set(vp') 中,并用vp'的取值六元組中各個域值來更新vp的取值六元組中的對應(yīng)域值;否則執(zhí)行步 驟 D255 ;D255、若所述當前節(jié)點上賦值號左端為指針變量vp,右端為變量vc的取地址操 作,用VC的取值來更新DerefVal (vp);否則執(zhí)行步驟D256 ;D256、若所述當前節(jié)點上賦值號左端為指針變量vp,右端為指針變量vp'與常 量C的“加”“減”運算,則將vp加入RelVaHvp'),用vp ‘的取值六元組中各個域值來 更新vp的取值六元組中的對應(yīng)域值,并根據(jù)常量C重新計算vp在內(nèi)存空間上的偏移位置 0ffset(Vp),若ReIVar (vp')中存在偏移位置與Offset (vp)相同的變量,則這些變量與 vp互為別名。 所述步驟D27進一步包括D271、若當前路徑ρ不包含節(jié)點η的“真”分支,根據(jù)各變量的初始取值區(qū)間來計 算η中條件表達式取“假”值時的變量取值區(qū)間;否則執(zhí)行步驟D272 ;D272、若當前路徑ρ包含節(jié)點η的“真”分支,對循環(huán)相關(guān)變量分別運用拓寬 widening算子和收窄narrowing算子進行迭代計算,直到各變量的取值區(qū)間穩(wěn)定為止。本發(fā)明所提供的程序中不可達路徑的靜態(tài)檢測方法,具有以下優(yōu)點該靜態(tài)檢測方法基于靜態(tài)分析技術(shù),不用運行被測程序,所需的人力和時間成本 很低;同時檢測結(jié)果的準確率為100%,即檢測出的不可達路徑確定為實際的不可達路徑。 除此之外,該方法還可廣泛應(yīng)用于諸如路徑敏感的數(shù)據(jù)流分析、測試用例自動生成等軟件 測試的各個子領(lǐng)域,能夠提高軟件測試的效率。


圖1為本發(fā)明靜態(tài)檢測程序不可達路徑的總體流程示意圖;圖2為本發(fā)明計算路徑上語句節(jié)點的流程示意圖;圖3為本發(fā)明實施例的源程序testl. c中函數(shù)calcl的一條不可達路徑;圖4為本發(fā)明實施例的源程序test2. c中函數(shù)calc2的一條不可達路徑;
具體實施例方式下面結(jié)合附圖及本發(fā)明的實施例對本發(fā)明的靜態(tài)檢測方法作進一步詳細的說明。為了便于后文的說明,下面首先簡單介紹控制流圖、上下文狀態(tài)、函數(shù)摘要、指針 變量的六元組模型、抽象解釋中的拓寬/收窄算子等概念。1、控制流圖(CFG),是一種反映程序邏輯控制流程的有向圖。通常一個函數(shù)的控制流圖可表示為(N,E,entry,exit),其中N代表節(jié)點的集合,反映程序中的簡單語句和復合 語句的條件判斷以及控制流匯合點等;E代表有向邊的集合,反映程序中語句間的控制流 關(guān)系;entry為函數(shù)的固定唯一入口節(jié)點;exit為函數(shù)唯一的出口節(jié)點。2、一條路徑ρ上變量的取值信息稱為路徑狀態(tài),路徑狀態(tài)由ρ中各節(jié)點處的上下 文狀態(tài)組成。上下文狀態(tài)用于近似地表示程序動態(tài)執(zhí)行時的變量取值信息,通過一組變量 及其抽象取值來描述,C =VariablesXIntervals, Variables代表變量集合,Intervals代
表變量取值范圍;C(i)代表變量i在C中取值
c(/)= l· if (i,v) ^ C 代表/在C中的取值為ν ‘"[Telse代表C對/沒有約束例如Cl= {(i,{[-1,3], [6,10]}),(b, TRUE)};則 Cl(i) = {[-1,3], [6,10]}, Cl (j)=丄。3、利用函數(shù)摘要來代替函數(shù)調(diào)用是一種靈活的跨函數(shù)分析方法。一般首先由每個 函數(shù)的本地分析算法為其創(chuàng)建一個函數(shù)摘要,當分析到該函數(shù)的調(diào)用時,就將該函數(shù)摘要 作為函數(shù)調(diào)用的替代進行使用。函數(shù)f的函數(shù)摘要表示不同上下文狀態(tài)條件下的后置條件,在值范圍分析中通常 表示為一個二元組,記為 summary(f)二 PostCondxContext。這里,PostCond是函數(shù)f的后置條件pc的集合,即f執(zhí)行后對上下文的影響。pc ={value (vl), value (v2),…,value (vn)} (vi e Var (f), i = 1, 2, . . . , n),其中 vi 是 函數(shù)f中能夠?qū)φ{(diào)用點上下文環(huán)境產(chǎn)生影響的因素,包括全局變量、類成員及返回值等。 Context是上下文狀態(tài)的集合。若想進一步了解具體函數(shù)摘要的生成方法,請參見申請?zhí)?200910084547. 3、名稱為“應(yīng)用跨函數(shù)分析的軟件測試方法”的發(fā)明申請的公開文件。4、對于指針類型變量vp,本發(fā)明采用一個六元組模型<vp,DerefVal, Mem, AliasSet, Offset, RelVar>對其取值情況進行表示和計算,這6個域的具體含義如下vp 變量標識;DerefVal :vp 的解引用值;Mem vp所指向的內(nèi)存空間標識;AliasSet :vp 的別名集合;Offset :vp在所指向內(nèi)存空間Mem上的偏移位置;RelVar 與內(nèi)存空間Mem相關(guān)聯(lián)的指針變量集合。5、一條路徑中循環(huán)變量的值范圍分析計算是靜態(tài)分析的一大難點,因為循環(huán)的確 切次數(shù)一般很難得到。本方法在選取包含循環(huán)的路徑時采用“Z路徑”方法,即路徑經(jīng)過循 環(huán)體的次數(shù)為0或1。這里的循環(huán)“0次”是指路徑不進入循環(huán)體;“1次”指當前路徑會進 入循環(huán)體,對應(yīng)于實際執(zhí)行時的K次,K由循環(huán)變量經(jīng)過拓寬/收窄算子迭代穩(wěn)定后的結(jié)果 確定?;诔橄蠼忉尷碚撝械耐貙?收窄(widening/narrowing)算子,對循環(huán)體中的變量 取值區(qū)間進行迭代求精,使得語句的上下文狀態(tài)快速收斂,又能在得到保守解的前提下使 之更加“逼近”精確解。圖1為本發(fā)明靜態(tài)檢測程序不可達路徑的總體流程示意圖,如圖1所示,該流程包括如下步驟步驟10、對待測試程序的函數(shù)單元進行詞法分析、語法分析及語義分析,生成函數(shù) 的控制流圖。步驟11、通過所述待測試程序中變量值范圍的函數(shù)間分析得到被調(diào)用函數(shù)單元的 函數(shù)摘要。步驟12、在控制流圖的入口和出口節(jié)點之間選取一條路徑P,如果路徑中含有循 環(huán)語句節(jié)點,則采用進入循環(huán)體0次或1次的策略。這里,所述控制流圖中,同一節(jié)點的多次出現(xiàn)視為不同的路徑節(jié)點。步驟13、從所述路徑ρ的入口節(jié)點開始,計算各語句節(jié)點處的上下文狀態(tài);如果存 在某節(jié)點的上下文狀態(tài)中有變量取值為空的情況,則表示所述路徑P為不可達路徑,否則, 為可達路徑。上述流程中,所述步驟13進一步包括如下步驟步驟131、設(shè)路徑ρ的入口節(jié)點為entry,出口節(jié)點為exit,并將所述入口節(jié)點設(shè)為 當前節(jié)點。步驟132、計算當前語句節(jié)點η在路徑ρ中的上下文狀態(tài),即應(yīng)用擴展區(qū)間技術(shù)計 算各變量的取值范圍情況。步驟133、判斷節(jié)點η處的上下文狀態(tài)中是否出現(xiàn)變量取值為空的情況,若是,則 執(zhí)行步驟134,否則執(zhí)行步驟135。步驟134、當前路徑ρ為不可達路徑,結(jié)束路徑遍歷。步驟135、判斷當前節(jié)點是否為出口節(jié)點exit ;若是,則當前路徑ρ為可達路徑,結(jié) 束路徑遍歷;否則,取當前節(jié)點的下一個節(jié)點作為目標節(jié)點,返回步驟132。若想要進一步了解具體如何應(yīng)用擴展區(qū)間來表示和計算變量的取值信息,請參見 專利號為ZL200810114^2.5、名稱為“應(yīng)用區(qū)間運算的軟件測試方法”的一文。上述流程中,所述步驟132進一步包括如下步驟步驟1321、若所述當前節(jié)點為入口節(jié)點entry,取函數(shù)定義的參數(shù)列表,并將所有 的參數(shù)取值初始區(qū)間設(shè)為Unknown ;否則執(zhí)行步驟1322。步驟1322、取所述當前節(jié)點在路徑ρ上的前驅(qū)節(jié)點上出現(xiàn)的每一個變量(超出作 用域的變量除外)的區(qū)間取值,設(shè)為該變量在當前節(jié)點上的初始區(qū)間值。步驟1323、若所述當前節(jié)點為變量聲明語句(不含初始化操作),將該變量的取值 區(qū)間設(shè)為該變量類型的默認區(qū)間;否則執(zhí)行步驟13M。步驟13M、若所述當前節(jié)點包含函數(shù)調(diào)用,根據(jù)當前節(jié)點處的上下文狀態(tài)和函數(shù) 摘要更新函數(shù)調(diào)用的返回值區(qū)間以及其他與上下文環(huán)境相關(guān)的變量(如全局變量、類成員 變量和參數(shù))的區(qū)間值;否則執(zhí)行步驟1325。步驟1325、若所述當前節(jié)點包含賦值語句(含帶有初始化操作的聲明語句及復合 賦值語句),則計算右端表達式的區(qū)間取值并以此值來更新被賦值變量的取值區(qū)間;否則 執(zhí)行步驟13 。步驟13 、若所述當前節(jié)點所對應(yīng)的語句類型為分支條件判斷語句(含單變量多 分支判斷語句),則根據(jù)出邊的取值(“真”、“假”或常量值)來計算該節(jié)點所關(guān)聯(lián)的每一變 量的新取值區(qū)間;否則執(zhí)行步驟1327。
步驟1327、若所述當前節(jié)點η所對應(yīng)的語句類型為循環(huán)條件判斷語句,則根據(jù)路 徑P中包含循環(huán)體的次數(shù)(0次或1次)來計算各變量的取值區(qū)間。上述步驟1323具體還包括步驟13231、若所述當前節(jié)點為數(shù)值類型(包括整數(shù)型、浮點型和字符型)變量的 聲明語句,則將變量的取值區(qū)間設(shè)為{[ΜΙΝ,ΜΑΧ]};否則執(zhí)行步驟13232。步驟13232、若所述當前節(jié)點為布爾類型變量的聲明語句,則將變量的取值區(qū)間設(shè) 為TRUE_0R_FALSE ;否則執(zhí)行步驟13233。步驟13233、若所述當前節(jié)點為指針類型變量vp的聲明語句,則為vp生成一個 取值六元組,其中包括以下6個域vp的變量標識、vp的解引用值DerefVal (vp)、vp將要 關(guān)聯(lián)的內(nèi)存空間標識Mem(vp)、vp的別名集AliasSet (vp)、vp在Mem (vp)上的偏移位置 Offset (vp)以及與Mem(vp)關(guān)聯(lián)的指針變量集合RelVar (vp)。圖2所示的計算路徑上語句節(jié)點的流程示意圖中,所述步驟1325進一步包括如下 步驟步驟13251、若所述當前節(jié)點上被賦值變量va為數(shù)值類型(包括整數(shù)型、浮點型和 字符型),則計算右端數(shù)值表達式的區(qū)間取值并以此值來更新va的取值區(qū)間;否則執(zhí)行步 驟 13252。步驟13252、若所述當前節(jié)點上被賦值變量va為布爾類型,則計算右端數(shù)值表達 式的區(qū)間取值并以此值來更新va的取值區(qū)間;否則執(zhí)行步驟13253。步驟13253、若所述當前節(jié)點上賦值號左端為指針變量vp的解引用,則計算右端 表達式的值并以此值來更新AliasSet(Vp)中各元素的解引用值;否則執(zhí)行步驟13254。步驟13254、若所述當前節(jié)點上賦值號左端為指針變量vp,右端為另一指針 變量 VP ‘,貝丨J 將 VP 從 AliasSet (vp)和 RelVar (vp)中刪除,加入 AliasSet (vp ‘)和 AliasSet(vp')中,并用vp'的取值六元組中各個域值來更新vp的取值六元組中的對應(yīng) 域值;否則執(zhí)行步驟13255。步驟13255、若所述當前節(jié)點上賦值號左端為指針變量vp,右端為變量vc的取地 址操作,用vc的取值來更新DerefVal (vp);否則執(zhí)行步驟13256。步驟13256、若所述當前節(jié)點上賦值號左端為指針變量vp,右端為指針變量vp' 與常量C的“加”“減”運算,則將vp加入RelVar (vp‘),用vp'的取值六元組中各個域值 來更新vp的取值六元組中的對應(yīng)域值,并根據(jù)常量C重新計算vp在內(nèi)存空間上的偏移位 置Offset (vp),若RelVar (vp ‘)中存在偏移位置與Offset (vp)相同的變量,則這些變量 與vp互為別名。所述步驟1327進一步包括如下步驟步驟13271、若當前路徑ρ不包含節(jié)點η的“真”分支(即循環(huán)體),根據(jù)各變量的 初始取值區(qū)間來計算η中條件表達式取“假”值時的變量取值區(qū)間;否則執(zhí)行步驟13272。步驟13272、若當前路徑P包含節(jié)點η的“真”分支(即循環(huán)體),對循環(huán)相關(guān)變量 分別運用拓寬(widening)算子和收窄(narrowing)算子進行迭代計算,直到各變量的取值 區(qū)間穩(wěn)定為止。下面對具體的實施例結(jié)合圖3、圖4所示的控制流圖對本發(fā)明的程序不可達路徑 的靜態(tài)檢測方法作進一步的說明。
9
對于源程序testl. c,方法calcl的控制流圖如附圖3所示,圖中節(jié)點名字的最 后一個數(shù)字標識了產(chǎn)生的順序號,邊上標識的最后一個數(shù)字標識了該邊產(chǎn)生的順序號;以 “T”開頭命名的邊表示為條件表達式的“真”分支,以“F”開頭命名的邊則表示為“假”分支。 符號表中與區(qū)間運算有關(guān)的變量為m和n,m和η的初始取值區(qū)間集為{[_inf,inf]}。對于該圖中虛線標識部分所示的一條路徑 0—1 — 2 — 4 — 5 — 6 — 7 — 8 — 9 — 10 (數(shù)字表示控制流圖中節(jié)點的序號),沿著這條 路徑計算各節(jié)點處的上下文狀態(tài),路徑狀態(tài)標識在圖中的節(jié)點內(nèi)。當?shù)竭_節(jié)點while_out_8 時,η的取值區(qū)間為空,根據(jù)上述不可達路徑檢測方法,當前路徑即為不可達路徑。testl. c 源代碼
權(quán)利要求
1.一種程序中不可達路徑的靜態(tài)檢測方法,其特征在于,該方法包括以下步驟A、對待測試程序的函數(shù)單元進行詞法分析、語法分析及語義分析,生成函數(shù)的控制流圖;B、通過所述待測試程序中變量值范圍的函數(shù)間分析得到被調(diào)用函數(shù)單元的函數(shù)摘要;C、在控制流圖的入口和出口節(jié)點之間選取一條路徑p,如果路徑中含有循環(huán)語句節(jié)點, 則采用進入循環(huán)體0次或1次的策略;D、從所述路徑ρ的入口節(jié)點開始,計算各語句節(jié)點處的上下文狀態(tài);如果存在某節(jié)點 的上下文狀態(tài)中有變量取值為空的情況,則表示所述路徑ρ為不可達路徑,否則,為可達路徑。
2.根據(jù)權(quán)利要求1所述的程序中不可達路徑的靜態(tài)檢測方法,其特征在于,所述步驟C 進一步包括在所述控制流圖中,同一節(jié)點的多次出現(xiàn)視為不同的路徑節(jié)點。
3.根據(jù)權(quán)利要求1所述的程序中不可達路徑的靜態(tài)檢測方法,其特征在于,步驟D進一 步包括D1、設(shè)路徑ρ的入口節(jié)點為entry,出口節(jié)點為exit,并將所述入口節(jié)點設(shè)為當前節(jié) 點。D2、計算當前語句節(jié)點η在路徑ρ中的上下文狀態(tài),即應(yīng)用擴展區(qū)間技術(shù)計算各變量的 取值范圍情況;D3、判斷節(jié)點η處的上下文狀態(tài)中是否出現(xiàn)變量取值為空的情況,若是,則執(zhí)行步驟 D4,否則執(zhí)行步驟D5;D4、當前路徑ρ為不可達路徑,結(jié)束路徑遍歷;D5、判斷當前節(jié)點是否為出口節(jié)點exit ;若是,則當前路徑ρ為可達路徑,結(jié)束路徑遍 歷;否則,取當前節(jié)點的下一個節(jié)點作為目標節(jié)點,返回步驟D2。
4.根據(jù)權(quán)利要求3所述的程序中不可達路徑的靜態(tài)檢測方法,其特征在于,步驟D2的 進一步包括D21、若所述當前節(jié)點為入口節(jié)點entry,取函數(shù)定義的參數(shù)列表,并將所有的參數(shù)取值 初始區(qū)間設(shè)為Unknown ;否則執(zhí)行步驟D22。D22、取所述當前節(jié)點在路徑ρ上的前驅(qū)節(jié)點上出現(xiàn)的每一個變量的區(qū)間取值,設(shè)為該 變量在當前節(jié)點上的初始區(qū)間值;D23、若所述當前節(jié)點為變量聲明語句,將該變量的取值區(qū)間設(shè)為該變量類型的默認區(qū) 間;否則執(zhí)行步驟D24 ;D24、若所述當前節(jié)點包含函數(shù)調(diào)用,根據(jù)當前節(jié)點處的上下文狀態(tài)和函數(shù)摘要更新函 數(shù)調(diào)用的返回值區(qū)間以及其他與上下文環(huán)境相關(guān)的變量的區(qū)間值;否則執(zhí)行步驟D25 ;D25、若所述當前節(jié)點包含賦值語句,則計算右端表達式的區(qū)間取值并以此值來更新被 賦值變量的取值區(qū)間;否則執(zhí)行步驟D26 ;D26、若所述當前節(jié)點所對應(yīng)的語句類型為分支條件判斷語句,則根據(jù)出邊的取值來計 算該節(jié)點所關(guān)聯(lián)的每一變量的新取值區(qū)間;否則執(zhí)行步驟D27 ;D27、若所述當前節(jié)點η所對應(yīng)的語句類型為循環(huán)條件判斷語句,則根據(jù)路徑ρ中包含 循環(huán)體的次數(shù)來計算各變量的取值區(qū)間。
5.根據(jù)權(quán)利要求4所述的程序中不可達路徑的靜態(tài)檢測方法,其特征在于,所述步驟 D23進一步包括D231、若所述當前節(jié)點為數(shù)值類型變量的聲明語句,則將變量的取值區(qū)間設(shè)為{[MIN, MAX]};否則執(zhí)行步驟D232 ;D232、若所述當前節(jié)點為布爾類型變量的聲明語句,則將變量的取值區(qū)間設(shè)為TRUE_ 0R_FALSE ;否則執(zhí)行步驟D233 ;D233、若所述當前節(jié)點為指針類型變量vp的聲明語句,則為vp生成一個取值六元組, 其中包括以下6個域vp的變量標識、vp的解引用值DerefVal (νρ),νρ將要關(guān)聯(lián)的內(nèi)存空 間標識Mem(vp)、νρ的別名集AliasSet (vp)、νρ在Mem (vp)上的偏移位置Offset (vp)以及 與Mem(vp)關(guān)聯(lián)的指針變量集合RelVar(Vp)。
6.根據(jù)權(quán)利要求4所述的程序中不可達路徑的靜態(tài)檢測方法,其特征在于,所述步驟 D25進一步包括D251、若所述當前節(jié)點上被賦值變量va為數(shù)值類型,則計算右端數(shù)值表達式的區(qū)間取 值并以此值來更新va的取值區(qū)間;否則執(zhí)行步驟D252 ;D252、若所述當前節(jié)點上被賦值變量va為布爾類型,則計算右端數(shù)值表達式的區(qū)間取 值并以此值來更新va的取值區(qū)間;否則執(zhí)行步驟D253 ;D253、若所述當前節(jié)點上賦值號左端為指針變量vp的解引用,則計算右端表達式的值 并以此值來更新AliasSet (vp)中各元素的解引用值;否則執(zhí)行步驟D2M ;D254、若所述當前節(jié)點上賦值號左端為指針變量vp,右端為另一指針變量vp',則將 VP 從 AliasSet (vp)和 RelVar(VP)中刪除,加入 AliasSet (vp‘)和 AliasSet (vp‘)中, 并用vp'的取值六元組中各個域值來更新vp的取值六元組中的對應(yīng)域值;否則執(zhí)行步驟 D255 ;D255、若所述當前節(jié)點上賦值號左端為指針變量vp,右端為變量vc的取地址操作,用 vc的取值來更新DerefVal (vp);否則執(zhí)行步驟D256 ;D256、若所述當前節(jié)點上賦值號左端為指針變量vp,右端為指針變量vp'與常量C的 “加"‘減”運算,則將vp加入RelVaHvp'),用vp'的取值六元組中各個域值來更新vp的取 值六元組中的對應(yīng)域值,并根據(jù)常量C重新計算vp在內(nèi)存空間上的偏移位置Offset (vp), 若RelVar (vp')中存在偏移位置與Offset(Vp)相同的變量,則這些變量與vp互為別名。
7.根據(jù)權(quán)利要求4所述的程序中不可達路徑的靜態(tài)檢測方法,其特征在于,所述步驟 D27進一步包括D271、若當前路徑ρ不包含節(jié)點η的“真”分支,根據(jù)各變量的初始取值區(qū)間來計算η中 條件表達式取“假”值時的變量取值區(qū)間;否則執(zhí)行步驟D272 ;D272、若當前路徑ρ包含節(jié)點η的“真”分支,對循環(huán)相關(guān)變量分別運用拓寬widening 算子和收窄narrowing算子進行迭代計算,直到各變量的取值區(qū)間穩(wěn)定為止。
全文摘要
本發(fā)明公開一種程序中不可達路徑的靜態(tài)檢測方法,該方法包括A、對待測試程序的函數(shù)單元進行詞法分析、語法分析及語義分析,生成函數(shù)的控制流圖;B、通過所述待測試程序中變量值范圍的函數(shù)間分析得到被調(diào)用函數(shù)單元的函數(shù)摘要;C、在控制流圖的入口和出口節(jié)點之間選取一條路徑p,如果路徑中含有循環(huán)語句節(jié)點,則采用進入循環(huán)體0次或1次的策略;D、從所述路徑p的入口節(jié)點開始,計算各語句節(jié)點處的上下文狀態(tài);如果存在某節(jié)點的上下文狀態(tài)中有變量取值為空的情況,則表示所述路徑p為不可達路徑,否則,為可達路徑。應(yīng)用本發(fā)明的方法,能夠提高程序靜態(tài)分析和測試用例生成的效率,以提高軟件測試效率。
文檔編號G06F11/36GK102073587SQ20101062221
公開日2011年5月25日 申請日期2010年12月27日 優(yōu)先權(quán)日2010年12月27日
發(fā)明者宮云戰(zhàn), 李青翠, 楊朝紅, 王思嵐, 王雅文, 肖慶, 金大海 申請人:北京郵電大學
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1