專利名稱:應(yīng)用跨函數(shù)分析的軟件測試方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件自動化測試技術(shù),尤其涉及一種應(yīng)用跨函數(shù)分析的軟件測試方法。
背景技術(shù):
軟件測試是軟件開發(fā)過程的重要組成部分,是用來確認(rèn)一個程序的品質(zhì)或性能是 否符合開發(fā)之前所提出的一些要求。軟件測試通??煞譃閯討B(tài)測試和靜態(tài)測試兩類。動態(tài) 測試是指通過運行被測程序,檢查運行結(jié)果與預(yù)期結(jié)果的差異,并分析運行效率和健壯性 等性能,因此,動態(tài)測試的方法一般由三部分組成,即構(gòu)造測試實例、執(zhí)行程序和分析程序 的輸出結(jié)果。靜態(tài)測試是指不運行被測程序本身,只通過搜集、查找程序的信息、分析或檢 查源程序的語法、結(jié)構(gòu)、過程和接口等特征來檢查源程序的正確性。靜態(tài)測試方法通過程序 靜態(tài)特性的分析,可以找到缺陷和可疑之處,如不匹配的參數(shù)、不適當(dāng)?shù)难h(huán)嵌套和分支 嵌套、不允許的遞歸、未使用過的變量、空指針的引用和可疑的計算等,并且其測試結(jié)果還 可用于進(jìn)一步的查找錯誤,并為測試用例的選取提供指導(dǎo),因此其優(yōu)點是能夠在程序運行 之前就可以對程序故障進(jìn)行全面檢測,故在較重要的軟件工程中得到廣泛應(yīng)用。在實際的軟件靜態(tài)測試中,由于源程序中存在函數(shù)間的嵌套調(diào)用關(guān)系,一個函數(shù) 的執(zhí)行可能會對其調(diào)用者或其他函數(shù)產(chǎn)生影響,如函數(shù)中對全局變量或類成員變量的更 改、對指針型參數(shù)或引用型參數(shù)的更改以及函數(shù)的返回值等情況;另外,在測試函數(shù)被調(diào)用 時,函數(shù)的參數(shù)及外部變量在特定的條件下會有一些取值,由于缺少對參數(shù)變量及外部變 量的有效性判斷,可能導(dǎo)致函數(shù)內(nèi)部的變量使用錯誤;再者,程序內(nèi)部的異常處理邏輯也會 改變函數(shù)的出口,從而影響被測程序內(nèi)部的控制邏輯。以上所述內(nèi)容涉及到函數(shù)的內(nèi)部控制流信息,以及由此影響的函數(shù)間數(shù)據(jù)流信 息,因此,會給軟件靜態(tài)分析和測試工作帶來巨大困難,導(dǎo)致檢測結(jié)果中含有大量的誤報信 息和漏報信息,從而降低了軟件測試的意義。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的主要目的在于提供一種應(yīng)用跨函數(shù)分析的軟件測試方法,以 降低軟件靜態(tài)測試過程中函數(shù)調(diào)用對區(qū)間計算精度的影響,提高函數(shù)間分析的準(zhǔn)確度、降 低測試結(jié)果的誤報率和漏報率。為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實現(xiàn)的—種應(yīng)用跨函數(shù)分析的軟件測試方法,該方法包括A、分析項目源程序中所有函數(shù)間的調(diào)用關(guān)系,建立函數(shù)調(diào)用關(guān)系圖;B、在所述函數(shù)調(diào)用關(guān)系圖中確定當(dāng)前節(jié)點,判斷當(dāng)前節(jié)點是否為最后一個節(jié)點, 若所述當(dāng)前節(jié)點為最后一個節(jié)點,則執(zhí)行步驟G ;否則,執(zhí)行步驟C ;C、利用所述當(dāng)前節(jié)點中的相關(guān)變量,生成約束信息,然后執(zhí)行步驟D ;D、讀取所述函數(shù)調(diào)用關(guān)系圖中所在節(jié)點對應(yīng)的控制流圖中的下一個節(jié)點作為當(dāng)
5前節(jié)點,若所述當(dāng)前節(jié)點為最后一個節(jié)點,則執(zhí)行步驟F ;否則,執(zhí)行步驟E ;E、應(yīng)用已獲得的函數(shù)后置信息,并根據(jù)當(dāng)前節(jié)點所對應(yīng)的語句類型對所述節(jié)點的 各變量進(jìn)行區(qū)間運算,得到變量的新的區(qū)間取值,然后返回執(zhí)行步驟D ;F、結(jié)束對當(dāng)前控制流圖的遍歷,為調(diào)用關(guān)系圖中當(dāng)前節(jié)點生成函數(shù)后置信息和函 數(shù)特征信息,然后返回執(zhí)行步驟B ;G、按照拓?fù)漤樞蛉∷龊瘮?shù)調(diào)用關(guān)系圖中的下一個節(jié)點作為當(dāng)前節(jié)點,若所述當(dāng) 前節(jié)點為最后一個節(jié)點,則執(zhí)行步驟I ;否則,執(zhí)行步驟H;H、為所述函數(shù)調(diào)用關(guān)系圖中當(dāng)前節(jié)點生成函數(shù)前置信息,然后返回執(zhí)行步驟G ;I、結(jié)束對當(dāng)前函數(shù)調(diào)用關(guān)系圖的遍歷,輸出程序中所有函數(shù)的摘要信息。其中,步驟A所述建立函數(shù)調(diào)用關(guān)系圖的過程如下Al、編譯項目源程序中的所有文件,若編譯失敗,則返回錯誤信息;若編譯成功,則 執(zhí)行步驟A2 ;A2、根據(jù)編譯后的類class文件,提取所有類型信息,所屬類型信息包括程序中所 有定義的類名稱、類中所有成員變量及其類型、類中所有成員方法及其返回類型,然后執(zhí)行 步驟A3 ;A3、再順序分析程序中的所有函數(shù)或成員方法,若在其語法樹中遇到其它函數(shù)或 成員方法的使用,則在函數(shù)調(diào)用圖中添加相應(yīng)的內(nèi)容。步驟B所述確定函數(shù)調(diào)用關(guān)系圖中的當(dāng)前節(jié)點,具體為按照拓?fù)淠嫘蜻x取所述函數(shù)調(diào)用關(guān)系圖中的下一個節(jié)點作為當(dāng)前節(jié)點。步驟C所述利用當(dāng)前節(jié)點中的相關(guān)變量生成約束信息的過程具體為Cl、提取當(dāng)前節(jié)點中所有引用的全局指針變量及參數(shù)指針變量,分別對這些變量 作如下判斷若存在一條從函數(shù)入口到引用指針變量內(nèi)容的路徑,且在引用內(nèi)容前未判斷 指針是否為空,則將該變量及路徑信息加入到當(dāng)前節(jié)點的空指針引用約束信息中,然后執(zhí) 行步驟C2 ;C2、當(dāng)判斷完所有的指針變量后,則提取當(dāng)前節(jié)點中所有引用的全局指針變量及 參數(shù)指針變量,并分別對這些變量作如下判斷若存在一條從函數(shù)入口到釋放指針內(nèi)容的 路徑,且在釋放內(nèi)容前未判斷指針是否變更,則將該變量及路徑信息加入到當(dāng)前節(jié)點的內(nèi) 存泄露約束信息中;然后執(zhí)行步驟C3 ;C3、提取當(dāng)前節(jié)點中所有數(shù)組類型參數(shù)變量,分別對這些變量作如下判斷若存在 一條從函數(shù)入口到數(shù)組下標(biāo)引用的路徑,則將引用下標(biāo)的最大、最小值加入到當(dāng)前節(jié)點的 數(shù)組越界約束信息中;執(zhí)行步驟C4 ;C4、提取當(dāng)前節(jié)點中所有全局變量及參數(shù)變量,分別對這些變量作如下判斷若存 在一條從函數(shù)入口到引用變量內(nèi)容的路徑,且在引用內(nèi)容前未對其賦值,則將該變量及路 徑信息加入到當(dāng)前節(jié)點的未初始化約束信息中;然后執(zhí)行步驟C5 ;C5、提取當(dāng)前節(jié)點中所有引用的全局變量及參數(shù)變量,分別對這些變量作如下判 斷若存在一條從函數(shù)入口到對該變量作算術(shù)運算的路徑,且在使用其內(nèi)容前未判斷其有 效性,則將該變量及路徑信息加入到當(dāng)前節(jié)點的非法計算約束信息中;其中,所述有效性判 斷包括分母不能為零、平方根不能為負(fù)。所述步驟E進(jìn)一步包括對所有節(jié)點的各變量進(jìn)行區(qū)間運算前,需根據(jù)進(jìn)入當(dāng)前節(jié)點前的輸入狀態(tài),計算經(jīng)過當(dāng)前節(jié)點的所有可能的輸出狀態(tài),其過程如下E1、若當(dāng)前節(jié)點為控制流圖的入口節(jié)點,則該節(jié)點輸入狀態(tài)為空,輸出狀態(tài)為當(dāng)前 節(jié)點的新增狀態(tài),則執(zhí)行步驟D ;否則執(zhí)行步驟E2 ;E2、若當(dāng)前節(jié)點為控制流圖的非分支節(jié)點或匯合節(jié)點,則該節(jié)點輸入狀態(tài)為其所 有前驅(qū)節(jié)點的輸出狀態(tài)相并,其輸出狀態(tài)為當(dāng)前節(jié)點的輸入狀態(tài)減去其刪減狀態(tài)并上新增 狀態(tài),然后執(zhí)行步驟D ;否則執(zhí)行步驟E3 ;E3、若當(dāng)前節(jié)點為控制流圖的分支節(jié)點,則該節(jié)點輸入狀態(tài)為其前驅(qū)接點的輸出 狀態(tài),輸出狀態(tài)為當(dāng)前節(jié)點的輸入狀態(tài)與所有條件相交后的并集,然后執(zhí)行步驟D ;否則, 執(zhí)行步驟E4 ;E4、如果當(dāng)前節(jié)點的前驅(qū)為控制流圖的分支節(jié)點,則該節(jié)點輸入狀態(tài)為其前驅(qū)節(jié) 點的輸出狀態(tài)與該分支條件的交集,輸出狀態(tài)為當(dāng)前節(jié)點的輸入狀態(tài)減去其刪減狀態(tài)并上 新增狀態(tài),然后執(zhí)行步驟D ;否則執(zhí)行步驟E5 ;E5、如果當(dāng)前節(jié)點為控制流圖的匯合節(jié)點,則該節(jié)點輸入狀態(tài)為其所有前驅(qū)節(jié)點 的輸出狀態(tài)的并集,輸出狀態(tài)等于其輸入狀態(tài)。步驟F所述后置信息的生成過程為F1、將當(dāng)前節(jié)點可能的返回值及其相應(yīng)條件加入到后置信息中,然后執(zhí)行步驟 F2 ;F2、將當(dāng)前節(jié)點的指針型參數(shù)和引用型參數(shù)的可能區(qū)間及其相應(yīng)條件加入到后置 信息中,然后再執(zhí)行步驟F3;F3、將當(dāng)前節(jié)點所有調(diào)用的函數(shù)的后置信息中未被修改的部分加入到當(dāng)前節(jié)點的
后置信息中。步驟F進(jìn)一步包括,利用所述生成的后置信息生成所述函數(shù)特征信息,其生成過 程為F4、分析所述調(diào)用關(guān)系圖的當(dāng)前節(jié)點是否為分配資源、釋放資源或可拋出異常的 類型;若在調(diào)用關(guān)系圖中的當(dāng)前節(jié)點中存在一條路徑,返回由庫函數(shù)或者具有分配資源特 征的函數(shù)分配的資源,或者將庫函數(shù)或具有分配資源特征的函數(shù)分配的資源賦值給全局變 量,則當(dāng)前節(jié)點的特征為分配資源,然后執(zhí)行步驟F6 ;否則,執(zhí)行步驟F5 ;F5、若在調(diào)用關(guān)系圖中的當(dāng)前節(jié)點的所有路徑中,都存在由庫函數(shù)或者具有釋放 資源特征的函數(shù)來釋放參數(shù)資源,或者由庫函數(shù)或者具有釋放資源特征的函數(shù)來釋放全 局資源,則當(dāng)前節(jié)點的特征為釋放資源,其中,當(dāng)前節(jié)點的拋出異常包括顯式及隱式拋出異
堂
巾ο步驟H所述前置信息的生成過程為HI、將當(dāng)前節(jié)點中所有與被調(diào)函數(shù)的參數(shù)變量相關(guān)的變量區(qū)間及其相應(yīng)條件加入 到被調(diào)函數(shù)的前置信息中,然后執(zhí)行步驟H2 ;H2、將當(dāng)前節(jié)點的前置信息中沒有被修改的部分加入到被調(diào)函數(shù)的前置信息中。本發(fā)明所提供的應(yīng)用跨函數(shù)分析的軟件測試方法,具有以下優(yōu)點本發(fā)明提出的跨函數(shù)分析的軟件測試方法,在現(xiàn)有的靜態(tài)測試中的區(qū)間計算和函 數(shù)間分析技術(shù)的基礎(chǔ)上,擴(kuò)展函數(shù)摘要信息在基于缺陷模式的軟件測試中的具體內(nèi)容,完 善了函數(shù)內(nèi)的區(qū)間迭代技術(shù),將函數(shù)副作用及其分支條件計算到迭代公式中,從而在缺陷
7判定過程中充分利用所述函數(shù)摘要信息,大幅提高了函數(shù)間分析的準(zhǔn)確度即提高測試結(jié)果 的準(zhǔn)確性、降低了測試結(jié)果中的誤報率和漏報率。
圖1為本發(fā)明實施例應(yīng)用跨函數(shù)分析的方法進(jìn)行軟件測試的流程示意圖;圖2為本發(fā)明實施例中表1所示源程序的函數(shù)調(diào)用關(guān)系圖;圖3為本發(fā)明實施例中表1所示源程序的函數(shù)f的控制流圖;圖4為本發(fā)明實施例中表1所示源程序的函數(shù)f2的控制流圖。
具體實施例方式下面結(jié)合附圖及本發(fā)明的實施例對本發(fā)明的方法作進(jìn)一步詳細(xì)的說明。軟件在實際運行過程中,某一變量或表達(dá)式的取值是存放在計算機(jī)的內(nèi)存中的, 且其取值是唯一確定的。然而在靜態(tài)測試中,由于程序未被執(zhí)行,變量及表達(dá)式的確定取值 情況必須通過對程序內(nèi)部邏輯的分析才能近似得到。本發(fā)明提出的跨函數(shù)分析的方法在現(xiàn)有的靜態(tài)測試中的區(qū)間計算和函數(shù)間分析 技術(shù)的基礎(chǔ)上,擴(kuò)展函數(shù)摘要信息在基于缺陷模式的軟件測試中的具體內(nèi)容;完善函數(shù)內(nèi) 區(qū)間迭代技術(shù),將函數(shù)副作用及分支條件計算到迭代公式中,從而在缺陷判定過程中使用 函數(shù)摘要信息,起到提高函數(shù)間分析的準(zhǔn)確度即提高測試結(jié)果的準(zhǔn)確性、降低測試結(jié)果的 誤報率和漏報率的作用。為了將本發(fā)明提出的函數(shù)摘要信息應(yīng)用在軟件測試中,本發(fā)明首先定義出函數(shù)摘 要信息中前置信息、后置信息、約束信息和特征信息的內(nèi)容,然后給出每種類型信息的計算 方法。下面分別對上述各種類型信息的定義、生成及使用規(guī)則舉例說明為了便于后文的說明,下面首先給出函數(shù)調(diào)用圖、控制流圖和函數(shù)摘要信息等結(jié) 構(gòu)的基本定義。一、函數(shù)調(diào)用圖(FCG)是一個五元組(NODE,EDGE, RELATION, TOP, BOTTOM),其中 NODE表示一個節(jié)點集合,每個節(jié)點代表一個函數(shù);EDGE表示一個邊集合,每條邊代表兩個 函數(shù)間的調(diào)用關(guān)系;RELA TION表示一個關(guān)系集合,表示所有節(jié)點所代表的函數(shù)之間的關(guān) 系,RELATION = {ANCESTORS, PARENTS, CHILDRENS, DESCENDENTS} ;TOP 和 BOTTOM 分別代表 一個節(jié)點集合,包含程序P中沒有直接調(diào)用者的函數(shù)和沒有調(diào)用其它函數(shù)的函數(shù)。二、控制流圖(CFG)是一個五元組(NODE,EDGE, RELATION, begin, end),其中 NODE 表示一個節(jié)點集合;EDGE表示一個邊集合;RELATION表示所有節(jié)點所代表的語句塊之間的 關(guān)系,RELATION = {PRED, NEXT} ;begin 表示 CFG (F)的入口,end 表示 CFG (F)的出口。三、函數(shù)摘要信息(FSI)是一個四元組(P0ST_INF0,PRE_INF0,C0NS_INF0, CHAR_ INFO),其中P0ST_INF0表示函數(shù)F執(zhí)行后對上下文的影響,PRE_INF0表示函數(shù)F執(zhí)行前受 上下文的影響,C0NS_INF0表示函數(shù)執(zhí)行前對環(huán)境的約束,CHAR_INF0是函數(shù)F的特征信息, 用于在靜態(tài)分析的過程中輔助缺陷狀態(tài)的判斷。下面分別說明函數(shù)摘要信息中的相關(guān)內(nèi)容。函數(shù)約束信息是指函數(shù)對其調(diào)用者的 約束,由相關(guān)變量的取值區(qū)間和達(dá)到該取值區(qū)間的條件構(gòu)成。在靜態(tài)分析的過程中,當(dāng)處理到調(diào)用函數(shù)F的語句時,需要參考FSI (F). C0NS_INF0判斷是否發(fā)生故障。對應(yīng)不同類型的 缺陷,函數(shù)摘要信息中的約束信息內(nèi)容也有所不同,下面分別說明。1、空指針引用(NPD)約束信息在函數(shù)F中存在一個外部指針p,如果沒有判斷是否為空就引用它的內(nèi)容,則會發(fā) 生空指針引用的異常。指針P的約束值以及達(dá)到其內(nèi)容引用語句的條件,構(gòu)成函數(shù)F中指 針P的空指針引用約束信息,記做C0NS_NPD (F,ρ) = {VAL (ρ) = N0T_NULL,COND (ρ)},其中 COND(p) = {[C1,VAL (C1) ],[c2,VAL(c2) ],...,[cn,VAL(cn)]}為到達(dá)引用指針 ρ 處的條件, 由一些相外部量的取值區(qū)間構(gòu)成。函數(shù)F中所有具有這種特性指針的約束信息,構(gòu)成函數(shù)F的空指針引用約束信息, 記做C0NS_NPD (F),且有
C0NS NPD(F)=I I{CONS _ NPD(F, v) | PO!NTER{v) λ
—v,lref{Kpara(f)NULL _ NOTSURE{v)}
O
其中POINTER(v)表示變量V為指針類型,NULL_N0TSURE(v)表示無法確定指針變量ν是否為空。2、未初始化變量(UV)約束信息在函數(shù)F中使用一個外部變量V,如果在使用該變量前沒有初始化,則會導(dǎo)致程序 內(nèi)部處理錯誤。變量ν的約束值以及達(dá)到其內(nèi)容使用語句的條件,可以構(gòu)成函數(shù)F中變量 ν 的未初始化約束信息,記做 C0NS_UV(F,ν) = {VAL (ν) = INIT,COND (ν)}。函數(shù)F中所有具有這種特性的變量的約束信息,構(gòu)成函數(shù)F的未初始化約束信息, 記做C0NS_UV(F),且有
其中REF(v)表示變量ν的內(nèi)容被使用,DEF_N0TSURE(v)表示無法確定在使用變量ν前是 否對其內(nèi)容定義。3、誤用指針(WUP)約束信息在函數(shù)F中存在一個外部指針ρ,如果沒有經(jīng)過有效性判斷就引用它的內(nèi)容,則會 發(fā)生無法預(yù)知的錯誤。指針P的約束值以及達(dá)到其內(nèi)容引用語句的條件,可以構(gòu)成函數(shù)F 中指針P的錯誤使用指針約束信息,記做C0NS_WUP(F,p) = {VAL (ρ) = VALID, COND (ρ)}函數(shù)F中所有具有這種特性的指針的約束信息,構(gòu)成函數(shù)F的錯誤使用指針約束 信息,記做C0NS_WUP (F),且有
其中VALID_NOTSURE(p)表示無法確定指針變量ρ是否有效。4、非法計算(IA)約束信息在函數(shù)F中存在一些可能違背操作數(shù)ν約束的運算操作,如除法分母為零、平方根 操作數(shù)為負(fù)數(shù)等,如果在運算前沒有判斷這些非法取值,則會發(fā)生非法計算異常。相關(guān)變量 ν的約束值以及達(dá)到其非法計算位置的條件,可以構(gòu)成函數(shù)F中變量ν的非法計算約束 信息,記做 C0NS_IA(F,ν) = {VAL (ν) = LEGAL, COND (ν)}函數(shù)F中所有具有這種特性的變量的約束信息,構(gòu)成函數(shù)F的非法計算約束信息,記做C0NS_IA(F),且有
其中ARITHMETIC (V)表示變量ν參與算術(shù)運算,ILLEGAL_NOTSURE (ν)表示無法確定變量ν 在算術(shù)運算中的合法性。5、數(shù)組越界(OOB)約束信息在函數(shù)F的形參中使用一個數(shù)組a,如果對其使用的下標(biāo)超過了定義時的范圍, 則會導(dǎo)致程序內(nèi)部處理錯誤。數(shù)組a的約束取值范圍以及達(dá)到其內(nèi)容使用語句的條件,構(gòu) 成函數(shù)F中變量a的數(shù)組越界故束信息,記做C0NS_00B(F,a) = {VAL(a) = [LOW,UP], COND (a) },其中LOW和UP分別表示函數(shù)內(nèi)部使用數(shù)組a下標(biāo)的最小值和最大值。函數(shù)F中所有具有這種特性的數(shù)組的約束信息,構(gòu)成函數(shù)F的數(shù)組越界約束信息, 記做C0NS_00B (F),且有
其中ARRAY (a)表示a為數(shù)組,B0UND_N0TSURE (a)表示無法確定數(shù)組a的有效邊界。通過前面的描述,函數(shù)摘要信息中的約束信息可表示為FSI (F). C0NS_INF0 = C0NS_NPD(F) U C0NS_UV(F) U C0NS_WUP(F) U C0NS_IA(F) U。 C0NS_00B(F)在常見的缺陷檢測算法中,對大多數(shù)缺陷模式需要獲取控制流信息,如空指針引 用故障、資源泄露故障、內(nèi)存不當(dāng)使用故障和變量未初始化故障等。在考慮函數(shù)副作用影響 的同時,應(yīng)用函數(shù)內(nèi)控制流區(qū)間迭代技術(shù),既可以計算出進(jìn)入和退出節(jié)點N時的所有可能 狀態(tài),又可以通過矛盾狀態(tài)排除不可達(dá)路徑。如果函數(shù)F的控制流圖CFG(F)的一個節(jié)點N中聲明了若干局部變量V = Iv1, v2, ... , vn},則這些變量V及其初始取值區(qū)間VAL(V)構(gòu)成節(jié)點N的進(jìn)入作用域變量集合, 記做 IS(N) = {[vi; VAL (V1) ],[v2,VAL (v2) ],···,[vn, VAL (vn) ]} (Vi e N)。如果函數(shù)F的控制流圖CFG(F)中的一個節(jié)點N退出了若干局部變量V = Iv1, v2,...,vj的作用域,則這些變量V構(gòu)成節(jié)點N的退出作用域變量集合,記做OS (N) = Iv1, v2, ... , vn} (Vi e N) ο如果函數(shù)F的控制流圖CFG(F)中的一個節(jié)點N引用了若干外部變量V = Iv1, v2,...,vn},則這些變量V及其取值區(qū)間VAL(V)構(gòu)成節(jié)點N的本地引用集合,記做LREF (N) ={[vi; VAL (V1) ], [v2, VAL (v2) ],···,[vn, VAL (vn) ]} (Vi G N)。如果函數(shù)F的控制流圖CFG(F)中的一個節(jié)點N調(diào)用了若干函數(shù),則這些函數(shù)的全 局使用集合構(gòu)成節(jié)點ν的全局引用集合,記做⑶"(m^y^^^f)
.ο如果函數(shù)F的控制流圖CFG(F)中的一個節(jié)點N修改了若干變量V = {Vl,v2,..., VnI的值,則這些變量V及其修改后的取值區(qū)間VAL(V)構(gòu)成節(jié)點N的本地更改集合,記做 LMOD (N) = {[vi; VAL (V1) ],[v2, VAL (V2) ],···,[vn, VAL (vn) ]} (Vi e N)如果函數(shù)F的控制流圖CFG(F)中的一個節(jié)點N調(diào)用了若干函數(shù),則這些函數(shù)的全
局更改集合構(gòu)成節(jié)點ν的全局更改集合,記做gm^w)=J^gmod(P)如果函數(shù)F的控制流圖CFG(F)中的一個節(jié)點N的后繼節(jié)點數(shù)量大于1,即
10SUM (NEXT (N)) > 1,則該節(jié)點為若干條件分支的分流節(jié)點,記做DIFF (N)。如果CFG(F)中的 一個節(jié)點N的前驅(qū)節(jié)點數(shù)量大于1,即SUM(PRED(N)) > 1,則該節(jié)點為若干條件分支的合流 節(jié)點,記做CONF(N)。如果N' e NEXT (N),則滿足從節(jié)點N到N'的變量及其取值區(qū)間構(gòu)成條件滿足集 合,記做 C0N(N,N' ) = ([V1JAL(V1)], [v2,VAL(v2)],...,[vn,VAL (vn)]} (Vi e N)。如果函數(shù)F的控制流圖CFG(F)中的一個節(jié)點N新產(chǎn)生或改變了相關(guān)變量的取值 區(qū)間,則這些變量V及其取值區(qū)間VAL(V)構(gòu)成節(jié)點N的更新變量區(qū)間集合,記做GEN(N)= (IS(N) U LREF(N) U GREF(N) U LMOD(N) U GMOD(N)}。如果函數(shù)F的控制流圖CFG(F)中的一個節(jié)點N注銷或改變了相關(guān)變量的取 值區(qū)間,則這些變量V構(gòu)成節(jié)點N的消除變量區(qū)間集合,記做KILL(N) = IOS(N) U VAR (LMOD(N)) U VAR(GM0D(N))}。在CFG(F)中的某個節(jié)點N執(zhí)行前,相關(guān)變量V= Iv1, V2, ... , vj及其取值區(qū)間 VAL(V)構(gòu)成通過節(jié)點N前的所有可能狀態(tài)集合,記做IN(N),且有 在CFG(F)中的某個節(jié)點N執(zhí)行后,相關(guān)變量V= Iv1, V2, ... , vj及其取值區(qū)間 VAL(V)構(gòu)成通過節(jié)點N后的所有可能狀態(tài)集合,記做OUT(N),且有 根據(jù)上式,函數(shù)F中所有節(jié)點的IN和OUT可以按照CFG(F)的拓?fù)溆行虻捻樞虻?代獲得。函數(shù)后置信息用來確定函數(shù)的副作用,即函數(shù)執(zhí)行后對上下文的影響,包括函數(shù) 及其內(nèi)部嵌套調(diào)用的函數(shù)對全局變量和類成員變量的更改、指針及引用型參數(shù)的變更對其 調(diào)用者的影響、以及函數(shù)的返回值對其調(diào)用者的影響。如果函數(shù)F中使用了若干外部變量V = Iv1, v2,...,vj,則這些變量V及其取值區(qū) 間 VAL (V)構(gòu)成函數(shù) F 的本地引用集合,記做 LREF (F) = {[Vl,VAL (V1) ],[v2,VAL (V2)],..., [vn,VAL(Vn) ]}。如果函數(shù)F中使用了若干外部變量V = Iv1, v2,...,vn},并且其中包括程序P中 所有直接或間接調(diào)用F的函數(shù)F' =ANCESTORS(F)中使用的外部變量,則這些變量ν及其 取值區(qū)間VAL (V)構(gòu)成函數(shù)F的全局引用集合,記做GREF (F),且有
根據(jù)上式可得,程序P中所有函數(shù)的GREF可以按照FCG (P)的拓?fù)溆行虻捻樞虻?代獲得。
如果函數(shù)F中使用了若干外部變量V= {Vl,v2, ...,vn},并且其中包括程序 P中所有被函數(shù)F直接或間接調(diào)用的函數(shù)F' = DESCENDENTS(F)中使用的外部變量, 則這些變量V及其取值區(qū)間VAL(V)構(gòu)成函數(shù)F的全局使用集合,記做GUSE(F),且有
'LREF(F),Fe BOTTOM ( FCG (P))
GUSE(F)='
LREF(F)<j[UGUSE(F')], F i BOTTOM (FCG {P))
F'eCHILDRENS(F)根據(jù)上式可得,程序P中所有函數(shù)的GUSE可以按照FCG (P)的拓?fù)淠嫘虻捻樞虻?代獲得。如果函數(shù)F更改了若干外部變量V = {Vl,v2,. . .,vn},則這些變量V及其取值區(qū) 間 VAL (V)構(gòu)成函數(shù) F 的本地更改集合,記做 LMOD (F) = {[v” VAL (Vl) ],[v2,VAL (v2) ], , [vn,VAL(vn)]}。如果函數(shù)F中的形參列表中出現(xiàn)指針變量或者引用變量,這些變量及其取值區(qū)間
構(gòu)成函數(shù) F 的可更改參數(shù)集合,記做 PARA (F) = {[Vl,VAL(Vl)],[v2, VAL(v2)], ... , [vn,
VAL(vn)]}。而函數(shù)F中所有被調(diào)函數(shù)的PARA(F’),構(gòu)成函數(shù)F的參數(shù)更改集合,記做
PASS(F) H 有U 腿(F)。 ,-tLflF^HLDRENS(F)如果函數(shù)F更改了若干外部變量v,其中包括F直接或間接調(diào) 用的函數(shù)F ‘ = DESCENDENTS(F)中更改的外部變量,則這些變量v及 其取值區(qū)間VAL(v)構(gòu)成函數(shù)F的全局更改集合,記做GMOD(F),且有
'lMOD(F)^jPASS(F)^RET(F),FeBOTTOM(FCG(P))
GMOD{F)=
LMOD(F}uPASS(FyjRET(FMU{GMOD(F')nGREF(Fr)}]
F'eCHILDRENS(F)
FiBOTTOM{FCG{P))
其中,RET (F)表示函數(shù)F的返回值取值區(qū)間,根據(jù)上式可得,程序P中所有函數(shù)的 GM0D可以按照FCG(P)的拓?fù)淠嫘虻捻樞虻@得。根據(jù)以上定義,函數(shù)摘要信息中的后置信息可表示為FSI (F). P0ST_INF0 = GMOD(F)。函數(shù)特征信息包括函數(shù)對資源的分配及釋放情況、以及可拋出的異常類型,它們 主要用于對資源泄漏故障模式的檢測及對控制流信息的影響。若函數(shù)F內(nèi)存在一條路徑,返回由系統(tǒng)庫函數(shù)創(chuàng)建的資源,則該函數(shù)F的特征為分 配返回資源 ALLOC (F) = [RES, ret] 若函數(shù)F內(nèi)存在一條路徑,返回由具有分配返回資源特征的函數(shù)所分配的資源, 則該函數(shù)F的特征為分配返回資源ALLOC(F) = [RES,ret]。若函數(shù)F內(nèi)存在一條路徑,將系統(tǒng)庫函數(shù)創(chuàng)建的資源賦值給一個全局變量 global_var,則該函數(shù)的F特征為分配全局資源ALLOC (F) = [RES,global_var]。若函數(shù)F內(nèi)存在一條路徑,將具有分配返回資源特征的函數(shù)所分配的資源賦值給 一個全局變量global_var,則該函數(shù)的F特征為分配全局資源ALLOC (F) = [RES, global, var] o在函數(shù)F的所有路徑中,都對由參數(shù)param傳入的資源進(jìn)行釋放,則該函數(shù)的特征 為釋放傳入資源 RELEASE (F) = [RES, param]。在函數(shù)F的所有路徑中,都對由全局變量globalvar標(biāo)記的資源進(jìn)行釋放,則該函數(shù)的特征為釋放全局資源RELEASE (F) = [RES, global_var] 0在一個異常處理結(jié)構(gòu)T中,如果在子句try結(jié)構(gòu)中應(yīng)用throw方法拋出異常,則這 I匕異常稱為T中子句t的顯式異常,五砂= U throws(e)}。
est在一個異常處理結(jié)構(gòu)T中,如果在子句catch結(jié)構(gòu)中應(yīng)用throw方法拋出異常,則 這些異常稱為T中子句c的顯式異常,五印"U^l throw(e)}。
eec在一個異常處理結(jié)構(gòu)T中,如果在子句finally結(jié)構(gòu)中應(yīng)用throw方法拋出異常, 則這些異常稱為T中子句f的顯式異常,芯印&叫廠乃=°
^^ J在一個異常處理結(jié)構(gòu)T中,如果子句try結(jié)構(gòu)中在某種條件下, 由特定的函數(shù)可拋出一些異常,則這些異常稱為T中子句t的隱式異常,
Im p lie it (T ,t) = [J E x c e p tio n{F )
F et在一個異常處理結(jié)構(gòu)T中,如果子句catch結(jié)構(gòu)中在某種條件下, 由特定的函數(shù)可拋出一些異常,則這些異常稱為T中子句c的隱式異常,
Implicit (T ,c) = (J Exc ep tio n(F )
Fee0在一個異常處理結(jié)構(gòu)T中,如果子句finally結(jié)構(gòu)中在某種條件 下,由特定的函數(shù)可拋出一些異常,則這些異常稱為T中子句f的隱式異常, Im p lie it(T , / ) = [J Exception{F )
F-fo一個單層異常處理結(jié)構(gòu)T的顯式拋出異常為
,Explicit(T,f),\fpath. Explicit (J\ f)本 0
0,Vpath, Explicit(T, /) = 0 八 Jump(f,path)Catch(Explicit(J\t)y)u Explicit(T,c)Kj Explicit(T,f\
3path, Explicit (T^ f) = 0 /\]Jump、f, path)一個單層異常處理結(jié)構(gòu)T的隱式拋出異常為
Implicit(J\ f),/path, Explicit(T, /)弇 0 v Jump{f, path)
(Jmpl icit(J\ t) r^Catch{Jmplicit(T, t))) KjImplicitiJ, c) KjImplicitiT, f),
3path, Explicit{!T^ f)-0A -iJump{f, path)
V
j個多層異常處理結(jié)構(gòu)T的顯式拋出異常為
STE(T) =
STI(T) =
MTE(T) =
STE(T),Sub(T) = 0
Explicit(TJ)vj |J MTE{Tr),\fpath, Explicit^, /) ^ 0
reSub(TJ)
{Explicit{T,t)\J [J MTE(T')) n Catch(Explicit(T, t) u (J MTE(T'))u
reSub(T,t)T'€Sub(T,t)
Explicit (T,c)kj (J MTE{T)yjExplicit{T,f)kj |J MTE(T'),
T'eSub(T,c)T'eSub(TJ)
Bpath, Expl icit(T, /) = 0 a —Jump{f, path)
一個多層異常處理結(jié)構(gòu)T的隱式拋出異常為 一個函數(shù)F的非異常處理結(jié)構(gòu)中,如果在語句中應(yīng)用throw方法拋出異常,則這些 異常稱為函數(shù)F的附加顯式異常/印 函數(shù)F的可拋出異常為 根據(jù)以上定義,函數(shù)摘要信息中的特征信息可表示為FSI (F). CHAR_INF0 = {ALLOC(F),RELEASE(F),Exception(F)}。函數(shù)前置信息是指函數(shù)F在被調(diào)用時受上下文的影響,主要包括其ANCESTORS (F) 內(nèi)所有的函數(shù)對全局變量和類成員變量的更改。若存在函數(shù)F的一個直接調(diào)用者F' G PARANTS(F),如果在F、的入口 到F的所有路徑上更改了若干外部變量V= {Vl,v2, ...,vn},則這些變量V及其取 值區(qū)間VAL(V)構(gòu)成函數(shù)F對函數(shù)F、的一個直接關(guān)聯(lián)集合,記做LASS0(F,F(xiàn)')= {[Vl, VAL(Vl)], [v2,VAL(v2) ],..., [vn, VAL(vn)]}0 函數(shù) F 的所有直接關(guān)聯(lián)集合為 如果從程序的入口到函數(shù)F的函數(shù)調(diào)用過程中,若干外部變量V= {Vl,v2,..., vn}被更改,其中包括所有直接或間接調(diào)用F的函數(shù)F' = ANCESTORS (F)的直接關(guān)聯(lián)集 合,則這些變量v及其取值區(qū)間VAL(v)構(gòu)成函數(shù)F的全局關(guān)聯(lián)集合,記做GASSO(F),且有 根據(jù)上式,程序P中所有函數(shù)的GASS0可以按照FCG(P)的拓?fù)溆行虻捻樞虻@得。根據(jù)以上定義,函數(shù)摘要信息中的前置信息可表示為FSI(F).PRE_INF0 = GASS0(F)。以上所述為本發(fā)明所提出的函數(shù)摘要信息介紹,下面再對本發(fā)明所提出的函數(shù)摘 要信息在軟件靜態(tài)測試過程中的應(yīng)用進(jìn)行解釋和進(jìn)一步說明在軟件缺陷的檢測過程中以函數(shù)作為被分析單元,首先建立缺陷相關(guān)變量的狀態(tài) 機(jī)實例,然后根據(jù)狀態(tài)轉(zhuǎn)換規(guī)則,在CFG(F)中應(yīng)用每個節(jié)點N的IN(N)和0UT(N)分析狀態(tài)機(jī)實例,判斷是否會達(dá)到故障狀態(tài)。如在分析過程中遇到函數(shù)調(diào)用時,還需要參考函數(shù)摘要 信息,應(yīng)用約束信息、前置信息和特征信息來輔助進(jìn)行缺陷判斷。下面給出對應(yīng)不同缺陷模式的檢測方法1、檢測空指針引用故障如果在函數(shù)F中的某條路徑上存在一個為空的指針p,沒有經(jīng)過有效性判斷就引 用它的內(nèi)容,則會發(fā)生空指針引用的故障。對該類問題的檢測過程如下首先為相關(guān)變量創(chuàng)建空指針引用狀態(tài)機(jī)實例,這些相關(guān)變量包括函數(shù)內(nèi)實例變量 INTRA_NPD (F) = {v | POINTER (v)八 v G VAR (LOCAL (F)) U VAR (LREF (F))}和函數(shù)間實例變 量 INTER_NPD (F) = {v | v G VAR(C0NS_NPD (F))},其中 LOCAL (F)表示 F 的本地變量。對函數(shù)F內(nèi)非函數(shù)調(diào)用節(jié)點N的檢測描述為
INTRA _NPD{F),NULL{p) eIN(N)aREF(N,p)^NPD(F,p)對調(diào)用函數(shù)F的節(jié)點N的檢測描述為
3p,peINTER_NPD(F),,CONS _NPD(FyVAL{p)e(FSI(F).PRE _INFOuIN_ 八
REF(N,p)ACONS_NPD(F).COND(P)^NPD(F,P)其中NULL(p)表示指針p為空,^COA^ — A/PDC^y^LO)表示與函數(shù)F的NPD 約束信息中P的值相悖的情況,即指針P為空,REF(N, p)表示節(jié)點N中對指針p內(nèi)容的引 用,C0NS_NPD (F). C0ND (p)表示函數(shù)F的NPD約束信息中p所對應(yīng)的條件為真。2、檢測變量未初始化故障如果在函數(shù)F的某條路徑上使用一個變量V,并且v在使用前沒有初始化,則可能 會導(dǎo)致程序內(nèi)部處理錯誤。對該類問題的檢測過程如下首先為相關(guān)變量創(chuàng)建變量未初始化狀態(tài)機(jī)實例,這些相關(guān)變量包括函數(shù)內(nèi)實例變 量 INTRA_UV(F) = {v|v G VAR (LOCAL (F)) U VAR (LREF (F))}和函數(shù)間實例變量 INTER_ UV (F) = {v|v G VAR (C0NS_UV(F))}。對函數(shù)F內(nèi)非函數(shù)調(diào)用節(jié)點N的檢測描述為
3v,v eINTRA—UV{F\NOT _INIT(y) &INQN)八 REFQN,v)。UV、F ,v)對調(diào)用函數(shù)F的節(jié)點N的檢測描述為
3v,v&INTERJJV{F)^COmjW(F)yAUv)錢FSKJ^PRE _INF(XJlN{Ny) AREF{N,V)八
CONSJJV{F).CONOy) ^>UV(F,v)其中NOT_init(v)表示變量v未初始化,-nCOiv^—"rcF)yAL(v)表示與函數(shù)
F的UV約束信息中v的值相悖的情況,即變量v沒有初始化,C0NS_UV(F).C0ND(v)表示函 數(shù)F的UV約束信息中v所對應(yīng)的條件為真。3、檢測錯誤使用指針故障如果在函數(shù)F中存在一個無效的指針p,沒有經(jīng)過有效性判斷就引用它的內(nèi)容,則
15會發(fā)生無法預(yù)知的錯誤。對該類問題的檢測過程如下首先為相關(guān)變量創(chuàng)建錯誤使用指針狀態(tài)機(jī)實例,這些相關(guān)變量包括函數(shù)內(nèi)實例變 量 INTRA_WUP (F) = {p| POINTER (p) A p G VAR (LOCAL (F)) U VAR (LREF (F))}和函數(shù)間實 例變量 INTER_WUP (F) = {p | p G VAR (C0NS_WUP (F))}。對函數(shù)F內(nèi)非函數(shù)調(diào)用節(jié)點N的檢測描述為
3p, p & INTRA _WUP(JF\INVALID{p) eIN(N)八 REF(N, p)。WUP(F, p)對調(diào)用函數(shù)F的節(jié)點N的檢測描述為
3p,peINTER_WUP(F),,CONS—WUP(F).VAL(pXFSI(F).PRE_INFCKJlN(N))A
REF(N,p)aCONS_WUP(F).COND(p)^WUP(F,p)其中INVALID (p)表示p為無效指針,C0NS_WUP (F). COND (p)表示函數(shù)F的WUP約 束信息中條件為真,"" CCWS^FfL/PC^J^LO)表示與函數(shù)F的WUP約束信息中P的值 相悖的情況,即P是一個無效的指針,它的無效性有多種情況,例如指針被釋放后指向的空 間、指向的空間被釋放、指針經(jīng)過算術(shù)運算后要釋放、指向無效的??臻g等等。4、檢測非法計算故障在函數(shù)F中存在一些違背操作數(shù)v約束的運算操作,如除法分母為零、平方根操作 數(shù)為負(fù)數(shù)等,如果在運算前沒有判斷這些非法取值,則會發(fā)生非法計算異常。對該類問題的 檢測過程如下首先為相關(guān)變量創(chuàng)建變量未初始化狀態(tài)機(jī)實例,這些相關(guān)變量包括函數(shù)內(nèi)實例變 量 INTRA_IA(F) = {v|v G VAR (LOCAL (F)) U VAR (LREF (F))}和函數(shù)間實例變量 INTER_ IA (F) = {v|v G VAR (C0NS_IA(F))}。對函數(shù)F內(nèi)非函數(shù)調(diào)用節(jié)點N的檢測描述為
3v,vGlNTRAJA(F),ILLEGAL(v)eIN(N)AREF(N,v)^IA(F,v)對調(diào)用函數(shù)F的節(jié)點N的檢測描述為
3v,v&INTER_IA(F),~CONS_IA{F)miv)&(FSI、F).PREJNFCKjIN{Ny}AREF{N,v)/\
CONS_IA{F).CONOy) =>IA(F,v)其中ILLEGAL (v)表示變量v為非法值,C0NS_IA (F). COND (v)表示函數(shù)F的IA約 束信息中條件為真,表示與函數(shù)F的IA約束信息中V的值相悖 的情況,即變量V為非法值,如對于除法和取余運算的非法值為分母為零、平方根運算的非 法值為負(fù)數(shù)等。5、檢測數(shù)組越界故障在函數(shù)F中一個數(shù)組a使用了下標(biāo)V,如果對v的使用超過了 a定義時的范圍,則 會導(dǎo)致程序內(nèi)部處理錯誤。對該類問題的檢測過程如下首先為相關(guān)變量創(chuàng)建數(shù)組越界狀態(tài)機(jī)實例,這些相關(guān)變量包括函數(shù)內(nèi)實例變量INTRA_00B (F) = {a | a G VAR (LOCAL (F)) U VAR (LREF (F))}和函數(shù)間實例變量 INTER_ 00B(F) = {a|a G VAR(C0NS_00B(F))}。對函數(shù)F內(nèi)非函數(shù)調(diào)用節(jié)點N的檢測描述為3a,aeINTRA_OOB(F),OUT_BOUND(a) eIN(N) => OOB{F,a)對調(diào)用函數(shù)F的節(jié)點N的檢測描述為
3a, a e INTER _OOB(F),^CONS_OOB(F).VAL(a) g (FSI(F).CONS _INFO uIN(N)) a
CONS _ OOB(F).COND(a) => OOB(F,a)其中,0UT_B0UND (a)表示對數(shù)組a使用越界,C0NS_00B (F). COND (a)表示函數(shù)F的 00B約束信息中條件為真,表示與函數(shù)F的00B約束信息中a 的值相悖的情況,即對數(shù)組a使用越界。下面結(jié)合本發(fā)明具體實施例對本發(fā)明做進(jìn)一步說明,以表1中的程序代碼為例作 為本發(fā)明實施例中的被測源程序表1 被測源程序
1int 氺p,氺q ;
2int flag, vl ;
3f2(inta[]) {
4if (flag)
5p = new int[a[10]/\^1];
6else
7p = NULL ;
9}
10int*fl(int & v2){
11intb[10];
12f2 (b);
13vl = 1, v2 = 0 ;
14return new int [1];
15}
16int f() {
17int v2,r ;
18vl = 0, p = NULL ;
19q = fl(v2);
20if(flag)
21氺p = v2/vl ;
22if(p k)
23= vl/v2, r =;}
24return r ;
25}
采用現(xiàn)有軟件測試工具中使用的算法對表1中的源程序進(jìn)行測試,可發(fā)現(xiàn)如下軟 件故障19行變量v2未初始化;21行變量p空指針引用;21行變量vl非法計算;23行變 量q空指針引用;23行變量p空指針引用;24行變量r未初始化。圖1為本發(fā)明實施例應(yīng)用跨函數(shù)分析的方法進(jìn)行軟件測試的流程示意圖,如圖1 所示,應(yīng)用本發(fā)明中的函數(shù)摘要信息后再對表1進(jìn)行軟件測試,其過程包括如下步驟步驟101 分析項目源程序中所有函數(shù)間的調(diào)用關(guān)系,建立函數(shù)調(diào)用關(guān)系圖。這里,以表1中的源程序為例,經(jīng)過分析后得到幾個函數(shù)間的調(diào)用關(guān)系圖,所述函 數(shù)間的調(diào)用關(guān)系,如圖2所示。其中,建立函數(shù)調(diào)用關(guān)系圖的過程具體如下首先編譯項目中的所有文件,若編譯失敗,則返回錯誤信息;若編譯成功,則根據(jù) 編譯后的類(class)文件,提取所有類型信息,所屬類型信息包括程序中所有定義的類名 稱、類中所有的成員變量及其類型、類中所有的成員方法及其返回類型;然后再順序分析程 序中的所有函數(shù)或成員方法,若在其語法樹中遇到其它函數(shù)或方法的使用,則在函數(shù)調(diào)用 圖中添加相應(yīng)的內(nèi)容。待執(zhí)行完后,再執(zhí)行步驟102。步驟102 在函數(shù)調(diào)用關(guān)系圖中確定當(dāng)前節(jié)點,判斷當(dāng)前節(jié)點是否為最后一個節(jié) 點,若所述當(dāng)前節(jié)點為最后一個節(jié)點,則執(zhí)行步驟107 ;否則,執(zhí)行步驟103。這里,所述確定當(dāng)前節(jié)點具體為按照拓?fù)淠嫘蛉『瘮?shù)調(diào)用關(guān)系圖中下一個節(jié)點 作為當(dāng)前節(jié)點。步驟103 利用所述當(dāng)前節(jié)點中的相關(guān)變量,如全局變量和參數(shù)變量等,生成約 束信息,然后執(zhí)行步驟104。這里,所述生成約束信息的內(nèi)容和格式隨缺陷類型的不同而不同。所述約束信息 生成的具體過程如下步驟1031 提取當(dāng)前節(jié)點中所有引用的全局指針變量及參數(shù)指針變量,分別對這 些變量作如下判斷若存在一條從函數(shù)入口到引用指針變量內(nèi)容的路徑,且在引用內(nèi)容前 未判斷指針是否為空,則將該變量及路徑信息加入到當(dāng)前節(jié)點的空指針引用約束信息中, 然后執(zhí)行步驟1032 ;步驟1032 當(dāng)判斷完所有的指針變量后,則提取當(dāng)前節(jié)點中所有引用的全局指針 變量及參數(shù)指針變量,并分別對這些變量作如下判斷若存在一條從函數(shù)入口到釋放指針 內(nèi)容的路徑,且在釋放內(nèi)容前未判斷指針是否變更,則將該變量及路徑信息加入到當(dāng)前節(jié) 點的內(nèi)存泄露約束信息中;當(dāng)判斷完所有的指針變量后,執(zhí)行步驟1033 ;步驟1033 提取當(dāng)前節(jié)點中所有數(shù)組類型參數(shù)變量,分別對這些變量作如下判 斷若存在一條從函數(shù)入口到數(shù)組下標(biāo)引用的路徑,則將引用下標(biāo)的最大、最小值加入到當(dāng) 前節(jié)點的數(shù)組越界約束信息中。當(dāng)判斷完所有的數(shù)組變量后,執(zhí)行步驟1034 ;步驟1034 提取當(dāng)前節(jié)點中所有全局變量及參數(shù)變量,分別對這些變量作如下判 斷若存在一條從函數(shù)入口到引用變量內(nèi)容的路徑,且在引用內(nèi)容前未對其賦值,則將該變 量及路徑信息加入到當(dāng)前節(jié)點的未初始化約束信息中。當(dāng)判斷完所有的變量后,執(zhí)行步驟 1035 ;步驟1035 提取當(dāng)前節(jié)點中所有引用的全局變量及參數(shù)變量,分別對這些變量作 如下判斷若存在一條從函數(shù)入口到對該變量作算術(shù)運算的路徑,且在使用其內(nèi)容前未判 斷其有效性,如分母不能為零、平方根不能為負(fù)等,則將該變量及路徑信息加入到當(dāng)前節(jié)點的非法計算約束信息中。當(dāng)判斷完所有的變量后,執(zhí)行步驟104。所述調(diào)用關(guān)系圖中的節(jié)點生成約束信息為FSI (f2) . C0NS_INF0 = { {paral
, vl [-max, -1] | [1, max] }, {flag: [-max, _1] | [1, max]}}FSI (fl) C0NS_INF0 = {}FSI (f). C0NS_INF0 = {}步驟104 讀取函數(shù)調(diào)用關(guān)系圖中所在節(jié)點對應(yīng)的控制流圖中的下一個節(jié)點作為 當(dāng)前節(jié)點,若所述當(dāng)前節(jié)點為最后一個節(jié)點,則執(zhí)行步驟106 ;否則,執(zhí)行步驟105。步驟105 應(yīng)用已獲得的函數(shù)后置信息,并根據(jù)當(dāng)前節(jié)點所對應(yīng)的語句類型對所 述節(jié)點的各變量進(jìn)行區(qū)間運算,得到變量的新的區(qū)間取值,然后返回執(zhí)行步驟104。這里,所述對節(jié)點的各變量進(jìn)行區(qū)間運算前,需根據(jù)進(jìn)入當(dāng)前節(jié)點前的輸入狀態(tài), 計算出經(jīng)過當(dāng)前節(jié)點的所有可能的輸出狀態(tài),其生成過程步驟如下步驟1051 若當(dāng)前節(jié)點為控制流圖的入口節(jié)點,則該節(jié)點輸入狀態(tài)為空,輸出狀 態(tài)為當(dāng)前節(jié)點的新增狀態(tài),則執(zhí)行步驟104 ;否則執(zhí)行步驟1052 ;步驟1052 若當(dāng)前節(jié)點為控制流圖的非分支節(jié)點或匯合節(jié)點,則該節(jié)點輸入狀態(tài) 為其所有前驅(qū)節(jié)點的輸出狀態(tài)相并,其輸出狀態(tài)為當(dāng)前節(jié)點的輸入狀態(tài)減去其刪減狀態(tài)并 上新增狀態(tài),然后執(zhí)行步驟104 ;否則執(zhí)行步驟1053 ;步驟1053 若當(dāng)前節(jié)點為控制流圖的分支節(jié)點,則該節(jié)點輸入狀態(tài)為其前驅(qū)接 點的輸出狀態(tài),輸出狀態(tài)為當(dāng)前節(jié)點的輸入狀態(tài)與所有條件相交后的并集,然后執(zhí)行步驟 104 ;否則,執(zhí)行步驟1054 ;步驟1054 如果當(dāng)前節(jié)點的前驅(qū)為控制流圖的分支節(jié)點,則該節(jié)點輸入狀態(tài)為其 前驅(qū)節(jié)點的輸出狀態(tài)與該分支條件的交集,輸出狀態(tài)為當(dāng)前節(jié)點的輸入狀態(tài)減去其刪減狀 態(tài)并上新增狀態(tài),然后執(zhí)行步驟104 ;否則執(zhí)行步驟1055 ;步驟1055 如果當(dāng)前節(jié)點為控制流圖的匯合節(jié)點,則該節(jié)點輸入狀態(tài)為其所有前 驅(qū)節(jié)點的輸出狀態(tài)的并集,輸出狀態(tài)等于其輸入狀態(tài),然后執(zhí)行步驟104。其中,以上步驟中,函數(shù)f的控制流圖為圖3、函數(shù)f2的控制流圖為圖4。將控制 流區(qū)間進(jìn)行迭代后,得到如下運算結(jié)果f2. IN(N1) = {};f2. OUT(Nl) = {{flag: [-max, -1] | [1, max]}, {flag:
}}f2. IN(N2) = {flag: [-max, _1] | [1,max]}f2. OUT(N2) = {flag: [-max, _1] | [1,max],p:N0T_NULL,a:
,vl:UNKN0ff}f2. IN(N3) = {flag:
};f2. OUT(N3) = {flag:
, p:NULL}f2. IN(N4) = {{flag:
,p:NULL},{flag: [-max, _1] | [1,max],p:N0T_NULL, a:
,vl:UNKN0ff}}f2. OUT (N4) = {{flag:
,p:NULL},{flag: [-max,_1] | [1,max],p:N0T_NULL, a:
,vl:UNKN0ff}}fl. IN(N1) = {};fl. OUT(Nl) = {b:
}
fl. IN(N2) = {b:
};fl. OUT(N2) = {{flag:
, p:NULL, b:
}, {flag: [—max,_1] | [1,max],p:N0T_NULL, vl:UNKNOff,b:
}}fl. IN(N3) = {{flag:
, p:NULL, b:
}, {flag: [—max, _1] | [1,max],p:N0T_NULL,vl:UNKNOff, b:
}};fl. 0UT(N3) = {{flag:
, p:NULL, b:
, vl: [1,1], v2:
}, {flag: [-max, 一1][l,max],p:N0T_NULL,vl: UNKNOff, b:
, vl: [1,1], v2:
}};fl. IN(N4) = { {flag:
,p:NULL,b:
,vl : [1,1],v2:
}, {flag: [-max, 一1][l,max],p:N0T_NULL,vl: UNKNOff, b:
, vl: [1,1], v2:
}};fl. OUT(N4) = {{flag:
, p:NULL, b:
, vl: [1,1], v2:
, ret:N0T_ NULL},{flag:[-max, _1]|[1,max],p:N0T_NULL,vl:UNKNOff, b:
,vl: [1,1],v2:
, ret: N0T_NULL}};f. IN(N1) = {}f. OUT (Nl) = {v2:UNINIT, r:UNINIT}f. IN(N2) = {V2:UNINIT, r:UNINIT}f. OUT(N2) = {v2:UNINIT, r:UNINIT, vl:
, p:NULL}f. IN(N3) = {v2:UNINIT, r:UNINIT, vl:
, p:NULL}f. OUT(N3) = {{flag:
, p:NULL, vl: [1,1], v2:
, r:UNINIT, q:N0T_ NULL},{flag: [-max, _1] | [1, max], r: UNINIT, p: N0T_NULL, vl: [1,1], v2:
,q:N0T_NULL}}f. IN(N4) = {{flag:
, r:UNINIT, p:NULL, vl: [1,1], v2:
, q:N0T_ NULL},{flag:[-max, _1]|[1, max], r:UNINIT,p:N0T_NULL, vl:[1,1], v2:
,q:N0T_NULL}}f. OUT(N4) = {{flag: [-max, -1] | [1, max], r:UNINIT, p:N0T_NULL, vl: [1,1],v2:
, q:N0T_NULL},{flag:
, r:UNINIT, p:NULL, vl:[1,1], v2:
,q:N0T_NULL}}f. IN(N5) = {flag:[-max, -1] | [1,max],r:UNINIT,p:N0T_NULL,vl: [1,1], v2:
,q:N0T_NULL}f. OUT(N5) = {flag:[-max, -1] | [1, max], r:UNINIT, p:N0T_NULL, vl: [1,1], v2:
,q:N0T_NULL}f. IN(N6) = {{flag:[-max, -1] | [1, max], r:UNINIT, p:N0T_NULL, vl: [1,1], v2:
,
20
q:N0T_NULL},{flag:
,r:UNINIT, p:NULL, vl:[1,1], v2:
,q:N0T_NULL}}步驟106 結(jié)束對當(dāng)前控制流圖的遍歷,為調(diào)用關(guān)系圖中當(dāng)前節(jié)點生成函數(shù)后置 信息和函數(shù)特征信息,然后返回執(zhí)行步驟102。這里,將調(diào)用關(guān)系圖的當(dāng)前節(jié)點內(nèi)所有可能對環(huán)境產(chǎn)生影響的變量及其發(fā)生條件 生成后置信息,所述后置信息的生成過程如下步驟1061 將當(dāng)前節(jié)點可能的返回值及其相應(yīng)條件加入到后置信息中,然后執(zhí)行 步驟1062 ;步驟1062 將當(dāng)前節(jié)點的指針型參數(shù)和引用型參數(shù)的可能區(qū)間及其相應(yīng)條件加 入到后置信息中,然后再執(zhí)行步驟1063 ;步驟1063 將當(dāng)前節(jié)點所有調(diào)用的函數(shù)的后置信息中未被修改的部分加入到當(dāng) 前節(jié)點的后置信息中;然后再執(zhí)行步驟1064。所述為調(diào)用關(guān)系圖中當(dāng)前節(jié)點生成的函數(shù)后置信息如下FSI (f 2). P0ST_INF0 = {{flag:
, p:NULL}, {flag: [-max, -1] | [1, max], p:N0T_NULL, vl:UNKN0ff}}FSI(fl).P0ST_INF0 = {{flag:
, p:NULL, vl:[1,1], v2:
, ret:N0T_ NULL},{flag: [-max, _1] | [1,max],p:N0T_NULL,vl: [1,1], v2:
, ret :N0T_NULL}}進(jìn)一步地,在所述步驟1061 1063的基礎(chǔ)上,分析所述調(diào)用關(guān)系圖的當(dāng)前節(jié)點是 否為分配資源、釋放資源或可拋出異常的類型,再生成函數(shù)的特征信息,其生成過程如下步驟1064:若在調(diào)用關(guān)系圖中的當(dāng)前節(jié)點中存在一條路徑,返回由庫函數(shù)或者 具有分配資源特征的函數(shù)分配的資源,或者將庫函數(shù)或具有分配資源特征的函數(shù)分配的 資源賦值給全局變量,則當(dāng)前節(jié)點的特征為分配資源,然后執(zhí)行步驟1066 ;否則,執(zhí)行步驟 1065 ;步驟1065 若在調(diào)用關(guān)系圖中的當(dāng)前節(jié)點的所有路徑中,都存在由庫函數(shù)或者 具有釋放資源特征的函數(shù)來釋放參數(shù)資源,或者由庫函數(shù)或者具有釋放資源特征的函 數(shù)來釋放全局資源,則當(dāng)前節(jié)點的特征為釋放資源,其中,當(dāng)前節(jié)點的可拋出異常包括 try-catch-finally結(jié)構(gòu)內(nèi)和try-catch-finally結(jié)構(gòu)外等的顯式及隱式拋出異常;然后 執(zhí)行步驟102。所述為調(diào)用關(guān)系圖中的當(dāng)前節(jié)點生成函數(shù)特征信息如下FSI(f2). CHAR INFO = {[memory,p], [null, null], {}}FSI(f1). CHAR_INF0 = {[memory, ret], [null, null], {}}FSI(f). CHAR_INF0 = {[null, nullret], [null, null], {}}步驟107 按照拓?fù)漤樞蛉『瘮?shù)調(diào)用關(guān)系圖中的下一個節(jié)點作為當(dāng)前節(jié)點,判斷 該當(dāng)前節(jié)點是否為最后一個節(jié)點,若所述當(dāng)前節(jié)點為最后一個節(jié)點,則執(zhí)行步驟109 ;否 則,執(zhí)行步驟108。步驟108 為函數(shù)調(diào)用關(guān)系圖中當(dāng)前節(jié)點生成函數(shù)前置信息,然后返回執(zhí)行步驟 107。這里,調(diào)用關(guān)系圖當(dāng)前節(jié)點入口到引用被調(diào)函數(shù)的所有路徑中,所有可能對被調(diào)函數(shù)產(chǎn)生影響的變量及其發(fā)生條件構(gòu)成被調(diào)函數(shù)的前置信息。所述生成函數(shù)前置信息的過程如下步驟1081 將當(dāng)前節(jié)點中所有與被調(diào)函數(shù)的參數(shù)變量相關(guān)的變量區(qū)間及其相應(yīng) 條件加入到被調(diào)函數(shù)的前置信息中,然后執(zhí)行步驟1082 ;步驟1082 將當(dāng)前節(jié)點的前置信息中沒有被修改的部分加入到被調(diào)函數(shù)的前置 信息中,然后執(zhí)行步驟107。所述為調(diào)用關(guān)系圖中的節(jié)點生成前置信息如下FSI (f2). PRE_INF0 = {vl:
, p:NULL}FSI (f 1). PRE_INF0 = {vl:
, p:NULL}FSI (f). PRE_INF0 = {}當(dāng)分析函數(shù)fl時,先為相關(guān)變量創(chuàng)建狀態(tài)機(jī)實例,其中包括INTRA_00B(fl)= ;INTER_00B(f2) = {paral} ;INTER_IA(f2) = {vj,然后獨立分析每個狀態(tài)機(jī)實例,與
普通工具檢測結(jié)果對比如下 當(dāng)分析函數(shù)f時,先為相關(guān)變量創(chuàng)建狀態(tài)機(jī)實例,其中包括INTRA_UV(f) = {v2, r} ;INTRA_NPD(f) = {p,q} ;INTRA_IA(f) = {v2,vl},然后獨立分析每個狀態(tài)機(jī)實例,與普 通工具檢測結(jié)果對比如下v2 e INTRA _UV(f),INIT(v2) e OUT(N3) ^ ^ UV(f,v2) : DEFECT (A, f,v2)r e INTRA _ UV(f), INIT(r) e IN(N9) ^ ^ UV(f, r): DEFECT{A,f,r)P e INTRA _ NPD{f), NOT _ NULL(p) e IN(N5) ^ ^NPD{f, p) : DEFECT {A J, p)p e INTRA _ NPD(f), NULL(p) e W(JV8) NPD{f, p) : DEFECT(A,f,p)q e INTRA _ NPD{f), NOT _ NULL(q) e IN(m) ^ ^NPD(J, q) : DEFECT {A, f,q)vl e INTRA _IA{f), ILLEGAL{v\) g IN(N5) -nIA(f, vl) : DEFECT {A, f,v\)v2 e INTRA_IA(f), ILLEGAL(v2) e IN(m) => IA(f,v2) : ^DEFECT{A,f,v2)步驟109 結(jié)束對當(dāng)前函數(shù)調(diào)用關(guān)系圖的遍歷,輸出程序中所有函數(shù)的摘要信息。這里,所述輸出程序中所有函數(shù)的摘要信息,包括前置信息、約束信息、后置信息 以及函數(shù)特征信息等。在軟件缺陷分析過程中,如果遇到函數(shù)調(diào)用時,這些函數(shù)摘要信息可 以作為被調(diào)函數(shù)的替代。運用本發(fā)明定義的函數(shù)摘要信息并結(jié)合本發(fā)明的跨函數(shù)分析方法,對一些開源軟 件的源程序進(jìn)行測試,其實驗所測得的數(shù)據(jù)及結(jié)果如下為了便于計算,定義故障誤報率的公式如下 其中,F(xiàn)PR(A,P)代表程序P應(yīng)用軟件缺陷測試系統(tǒng)(DTS,Defect TestingSystenOl.CK算法A)檢測的故障誤報率;DEFECT (F, v)表示函數(shù)F中的變量v發(fā) 生故障;五Cr(F,v)表示函數(shù)F中的變量v未發(fā)生故障;DEFECT (A,F(xiàn),v)表示算法 A檢測到函數(shù)F中變量v發(fā)生故障;表示算法A未檢測到函數(shù)F中變量 v發(fā)生故障。定義故障增報率公式如下 其中,DER(A,B,P)代表對程序P進(jìn)行測試時,軟件缺陷測試系統(tǒng)(DTS) 2. 3 (算法 B)發(fā)現(xiàn)故障較DTS1.0 (算法A)發(fā)現(xiàn)故障的倍數(shù);其中DEFECT (A,F(xiàn),v)表示工具DTS1.0應(yīng) 用算法A檢測到函數(shù)F中變量V發(fā)生故障廠DEFECT(A,F,v)表示工具DTS1. 0不能檢測 到函數(shù)F中變量v發(fā)生故障;DEFECT (B,F, v)表示工具DTS2. 3檢測到函數(shù)F中變量v發(fā)生 故障廠DEFECT(B,F,v)表示工具DTS2. 3不能檢測到函數(shù)F中變量v發(fā)生故障。實驗1 以10個開源的Java程序為例,將沒有應(yīng)用函數(shù)摘要信息的測試軟件 DTS1. 0與采用本發(fā)明方法的并應(yīng)用函數(shù)摘要信息的測試軟件DTS2. 3進(jìn)行對比。其測試結(jié) 果對比情況如表2所示表2 :DTS1. 0和DTS2. 3的測試結(jié)果對比 從表2所示的測試結(jié)果對比情況可知,采用測試軟件DTS1. 0的平均故障誤報率為 61. 49%,而采用測試軟件DTS2. 3的平均誤報率僅為35. 53%,比前者降低了 25. 95%。另 外,使用DTS2. 3檢測出的故障為DTS1. 0檢測出故障的4. 811倍。實驗2 仍以10個開源的Java程序為例,其中包括實驗1中所用到的部分源程序。 將以上開源軟件的源代碼應(yīng)用Klockwork公司的測試軟件K8與采用本發(fā)明方法的測試軟件DTS2. 3分別進(jìn)行測試,所測試的結(jié)果中資源泄露類故障的測試結(jié)果對比如表3所示表3 :K8和DTS2. 3的測試結(jié)果對比 綜合表3的測試結(jié)果可知,使用測試軟件DTS2. 3報告的資源泄露缺陷數(shù)目平均為 采用K8的1. 682倍。以上所述,僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護(hù)范圍。
權(quán)利要求
一種應(yīng)用跨函數(shù)分析的軟件測試方法,其特征在于,該方法包括A、分析項目源程序中所有函數(shù)間的調(diào)用關(guān)系,建立函數(shù)調(diào)用關(guān)系圖;B、在所述函數(shù)調(diào)用關(guān)系圖中確定當(dāng)前節(jié)點,判斷當(dāng)前節(jié)點是否為最后一個節(jié)點,若所述當(dāng)前節(jié)點為最后一個節(jié)點,則執(zhí)行步驟G;否則,執(zhí)行步驟C;C、利用所述當(dāng)前節(jié)點中的相關(guān)變量,生成約束信息,然后執(zhí)行步驟D;D、讀取所述函數(shù)調(diào)用關(guān)系圖中所在節(jié)點對應(yīng)的控制流圖中的下一個節(jié)點作為當(dāng)前節(jié)點,若所述當(dāng)前節(jié)點為最后一個節(jié)點,則執(zhí)行步驟F;否則,執(zhí)行步驟E;E、應(yīng)用已獲得的函數(shù)后置信息,并根據(jù)當(dāng)前節(jié)點所對應(yīng)的語句類型對所述節(jié)點的各變量進(jìn)行區(qū)間運算,得到變量的新的區(qū)間取值,然后返回執(zhí)行步驟D;F、結(jié)束對當(dāng)前控制流圖的遍歷,為調(diào)用關(guān)系圖中當(dāng)前節(jié)點生成函數(shù)后置信息和函數(shù)特征信息,然后返回執(zhí)行步驟B;G、按照拓?fù)漤樞蛉∷龊瘮?shù)調(diào)用關(guān)系圖中的下一個節(jié)點作為當(dāng)前節(jié)點,若所述當(dāng)前節(jié)點為最后一個節(jié)點,則執(zhí)行步驟I;否則,執(zhí)行步驟H;H、為所述函數(shù)調(diào)用關(guān)系圖中當(dāng)前節(jié)點生成函數(shù)前置信息,然后返回執(zhí)行步驟G;I、結(jié)束對當(dāng)前函數(shù)調(diào)用關(guān)系圖的遍歷,輸出程序中所有函數(shù)的摘要信息。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟A所述建立函數(shù)調(diào)用關(guān)系圖的過程如下A1、編譯項目源程序中的所有文件,若編譯失敗,則返回錯誤信息;若編譯成功,則執(zhí)行 步驟A2 ;A2、根據(jù)編譯后的類class文件,提取所有類型信息,所屬類型信息包括程序中所有定 義的類名稱、類中所有成員變量及其類型、類中所有成員方法及其返回類型,然后執(zhí)行步驟 A3 ;A3、再順序分析程序中的所有函數(shù)或成員方法,若在其語法樹中遇到其它函數(shù)或成員 方法的使用,則在函數(shù)調(diào)用圖中添加相應(yīng)的內(nèi)容。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟B所述確定函數(shù)調(diào)用關(guān)系圖中的當(dāng)前 節(jié)點,具體為按照拓?fù)淠嫘蜻x取所述函數(shù)調(diào)用關(guān)系圖中的下一個節(jié)點作為當(dāng)前節(jié)點。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟C所述利用當(dāng)前節(jié)點中的相關(guān)變量生 成約束信息的過程具體為C1、提取當(dāng)前節(jié)點中所有引用的全局指針變量及參數(shù)指針變量,分別對這些變量作如 下判斷若存在一條從函數(shù)入口到引用指針變量內(nèi)容的路徑,且在引用內(nèi)容前未判斷指針 是否為空,則將該變量及路徑信息加入到當(dāng)前節(jié)點的空指針引用約束信息中,然后執(zhí)行步 驟C2 ;C2、當(dāng)判斷完所有的指針變量后,則提取當(dāng)前節(jié)點中所有引用的全局指針變量及參數(shù) 指針變量,并分別對這些變量作如下判斷若存在一條從函數(shù)入口到釋放指針內(nèi)容的路徑, 且在釋放內(nèi)容前未判斷指針是否變更,則將該變量及路徑信息加入到當(dāng)前節(jié)點的內(nèi)存泄露 約束信息中;然后執(zhí)行步驟C3;C3、提取當(dāng)前節(jié)點中所有數(shù)組類型參數(shù)變量,分別對這些變量作如下判斷若存在一條 從函數(shù)入口到數(shù)組下標(biāo)引用的路徑,則將引用下標(biāo)的最大、最小值加入到當(dāng)前節(jié)點的數(shù)組越界約束信息中;執(zhí)行步驟C4 ;C4、提取當(dāng)前節(jié)點中所有全局變量及參數(shù)變量,分別對這些變量作如下判斷若存在一 條從函數(shù)入口到引用變量內(nèi)容的路徑,且在引用內(nèi)容前未對其賦值,則將該變量及路徑信 息加入到當(dāng)前節(jié)點的未初始化約束信息中;然后執(zhí)行步驟C5 ;C5、提取當(dāng)前節(jié)點中所有引用的全局變量及參數(shù)變量,分別對這些變量作如下判斷若 存在一條從函數(shù)入口到對該變量作算術(shù)運算的路徑,且在使用其內(nèi)容前未判斷其有效性, 則將該變量及路徑信息加入到當(dāng)前節(jié)點的非法計算約束信息中;其中,所述有效性判斷包 括分母不能為零、平方根不能為負(fù)。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟E進(jìn)一步包括對所有節(jié)點的各 變量進(jìn)行區(qū)間運算前,需根據(jù)進(jìn)入當(dāng)前節(jié)點前的輸入狀態(tài),計算經(jīng)過當(dāng)前節(jié)點的所有可能 的輸出狀態(tài),其過程如下E1、若當(dāng)前節(jié)點為控制流圖的入口節(jié)點,則該節(jié)點輸入狀態(tài)為空,輸出狀態(tài)為當(dāng)前節(jié)點 的新增狀態(tài),則執(zhí)行步驟D ;否則執(zhí)行步驟E2 ;E2、若當(dāng)前節(jié)點為控制流圖的非分支節(jié)點或匯合節(jié)點,則該節(jié)點輸入狀態(tài)為其所有前 驅(qū)節(jié)點的輸出狀態(tài)相并,其輸出狀態(tài)為當(dāng)前節(jié)點的輸入狀態(tài)減去其刪減狀態(tài)并上新增狀 態(tài),然后執(zhí)行步驟D ;否則執(zhí)行步驟E3 ;E3、若當(dāng)前節(jié)點為控制流圖的分支節(jié)點,則該節(jié)點輸入狀態(tài)為其前驅(qū)接點的輸出狀態(tài), 輸出狀態(tài)為當(dāng)前節(jié)點的輸入狀態(tài)與所有條件相交后的并集,然后執(zhí)行步驟D;否則,執(zhí)行步 驟E4 ;E4、如果當(dāng)前節(jié)點的前驅(qū)為控制流圖的分支節(jié)點,則該節(jié)點輸入狀態(tài)為其前驅(qū)節(jié)點的 輸出狀態(tài)與該分支條件的交集,輸出狀態(tài)為當(dāng)前節(jié)點的輸入狀態(tài)減去其刪減狀態(tài)并上新增 狀態(tài),然后執(zhí)行步驟D ;否則執(zhí)行步驟E5 ;E5、如果當(dāng)前節(jié)點為控制流圖的匯合節(jié)點,則該節(jié)點輸入狀態(tài)為其所有前驅(qū)節(jié)點的輸 出狀態(tài)的并集,輸出狀態(tài)等于其輸入狀態(tài)。
6.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟F所述后置信息的生成過程為 F1、將當(dāng)前節(jié)點可能的返回值及其相應(yīng)條件加入到后置信息中,然后執(zhí)行步驟F2 ; F2、將當(dāng)前節(jié)點的指針型參數(shù)和引用型參數(shù)的可能區(qū)間及其相應(yīng)條件加入到后置信息中,然后再執(zhí)行步驟F3;F3、將當(dāng)前節(jié)點所有調(diào)用的函數(shù)的后置信息中未被修改的部分加入到當(dāng)前節(jié)點的后置 信息中。
7.根據(jù)權(quán)利要求1或6所述的方法,其特征在于,步驟F進(jìn)一步包括,利用所述生成的 后置信息生成所述函數(shù)特征信息,其生成過程為F4、分析所述調(diào)用關(guān)系圖的當(dāng)前節(jié)點是否為分配資源、釋放資源或可拋出異常的類型; 若在調(diào)用關(guān)系圖中的當(dāng)前節(jié)點中存在一條路徑,返回由庫函數(shù)或者具有分配資源特征的函 數(shù)分配的資源,或者將庫函數(shù)或具有分配資源特征的函數(shù)分配的資源賦值給全局變量,則 當(dāng)前節(jié)點的特征為分配資源,然后執(zhí)行步驟F6 ;否則,執(zhí)行步驟F5 ;F5、若在調(diào)用關(guān)系圖中的當(dāng)前節(jié)點的所有路徑中,都存在由庫函數(shù)或者具有釋放資源 特征的函數(shù)來釋放參數(shù)資源,或者由庫函數(shù)或者具有釋放資源特征的函數(shù)來釋放全局資 源,則當(dāng)前節(jié)點的特征為釋放資源,其中,當(dāng)前節(jié)點的拋出異常包括顯式及隱式拋出異常。
8.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟H所述前置信息的生成過程為 HI、將當(dāng)前節(jié)點中所有與被調(diào)函數(shù)的參數(shù)變量相關(guān)的變量區(qū)間及其相應(yīng)條件加入到被 調(diào)函數(shù)的前置信息中,然后執(zhí)行步驟H2 ;H2、將當(dāng)前節(jié)點的前置信息中沒有被修改的部分加入到被調(diào)函數(shù)的前置信息中。
全文摘要
本發(fā)明公開了一種應(yīng)用跨函數(shù)分析的軟件測試方法,解決軟件靜態(tài)測試中函數(shù)調(diào)用對區(qū)間精度的影響、對環(huán)境約束信息未充分利用以及由異常處理導(dǎo)致的控制流變更等問題。通過定義函數(shù)摘要信息及其前置信息、后置信息、約束信息和特征信息,對程序中不同類型的缺陷檢測相應(yīng)地規(guī)定了判定方法;而且在軟件測試過程中通過收集函數(shù)摘要信息,并將其應(yīng)用在控制流圖的語句節(jié)點上和缺陷模式的判定過程中,在測試完成后輸出被測程序中所有函數(shù)的摘要信息。通過實驗證明,應(yīng)用本發(fā)明方法的測試軟件比現(xiàn)有測試軟件的測試結(jié)果相比,具有更高的函數(shù)間分析準(zhǔn)確度和更低的測試結(jié)果誤報率和漏報率。
文檔編號G06F11/36GK101894064SQ20091008454
公開日2010年11月24日 申請日期2009年5月21日 優(yōu)先權(quán)日2009年5月21日
發(fā)明者宮云戰(zhàn), 楊朝紅, 肖慶, 金大海, 陳俊亮 申請人:北京郵電大學(xué)