專(zhuān)利名稱(chēng)::一種基于軟件缺陷模式的測(cè)試方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及軟件測(cè)試技術(shù),尤其涉及一種基于軟件缺陷模式的測(cè)試方法及系統(tǒng)。
背景技術(shù):
:程序靜態(tài)分析是當(dāng)前軟件工程的一個(gè)研究熱點(diǎn),該類(lèi)方法的一個(gè)主要優(yōu)勢(shì)就是在軟件測(cè)試中,可以快速對(duì)大量程序源碼進(jìn)行自動(dòng)掃描并找到潛在的故障。靜態(tài)分析方法有很多,如符號(hào)執(zhí)行、定理證明、抽象解釋、類(lèi)型推導(dǎo)、模型檢查、基于程序風(fēng)格和注釋的檢測(cè)等。但是,這些方法在實(shí)現(xiàn)上有的過(guò)于復(fù)雜使得難以對(duì)大型程序進(jìn)行測(cè)試,有的方法雖然相對(duì)簡(jiǎn)單但會(huì)造成過(guò)多的誤報(bào),很難實(shí)用?;谀J降能浖y(cè)試技術(shù)也是一種靜態(tài)分析方法。與形式驗(yàn)證如定理證明試圖證明整個(gè)軟件沒(méi)有故障不同,基于模式的軟件測(cè)試技術(shù)首先提出軟件模式,然后通過(guò)檢測(cè)算法進(jìn)行檢測(cè),如果檢測(cè)算法是完全的,則能夠從待測(cè)軟件中找出該類(lèi)模式對(duì)應(yīng)的的程序代碼進(jìn)行后續(xù)處理。近年來(lái),基于模式的軟件測(cè)試技術(shù)得到快速的發(fā)展,大量的軟件測(cè)試工具被研制出來(lái)從而可以自動(dòng)地檢測(cè)軟件中的故障,并且在對(duì)一些大型商業(yè)軟件和開(kāi)源軟件的測(cè)試中發(fā)現(xiàn)了大量以前測(cè)試沒(méi)有發(fā)現(xiàn)的軟件故障和安全隱患。例如,SDV在對(duì)Windows操作系統(tǒng)126個(gè)使用多年的驅(qū)動(dòng)程序測(cè)試中發(fā)現(xiàn)了多個(gè)故障;explode在一些常用的文件存儲(chǔ)系統(tǒng)中發(fā)現(xiàn)了大量的嚴(yán)重故障;mc在Linux、OpenBSD和Xokexokernel軟件中發(fā)現(xiàn)了近500個(gè)故障以及100多個(gè)安全漏洞;FindBugs在Eclipse、J2SE和JBoss等開(kāi)源軟件中發(fā)現(xiàn)上百的故障。在NASA以及神舟軟件的測(cè)試中,基于模式的軟件測(cè)試技術(shù)都得到較好的應(yīng)用。與其他測(cè)試技術(shù)相比,基于模式的軟件測(cè)試技術(shù)具有如下特點(diǎn)(1)工具自動(dòng)化程度高、測(cè)試效率高。在內(nèi)存為1G、CPU主頻為1.8G的PC機(jī)上,F(xiàn)indBugs對(duì)Eclipse、J2SE和JBoss等開(kāi)源軟件進(jìn)行分析,所耗時(shí)間不超過(guò)65分鐘。舉例來(lái)說(shuō),對(duì)J2SE中的rt.jar分析,該程序包有13083個(gè)類(lèi),約40M大小,所耗時(shí)間只需45分鐘。(2)基于模式的軟件測(cè)試技術(shù)往往能發(fā)現(xiàn)其他測(cè)試技術(shù)難以發(fā)現(xiàn)的故障。如上面舉例說(shuō)明的對(duì)經(jīng)過(guò)測(cè)試且長(zhǎng)期投入運(yùn)行的程序進(jìn)行檢測(cè)時(shí),仍檢測(cè)到存在的大量軟件故障、安全漏洞、安全隱患。雖然基于模式的測(cè)試方法相比其他測(cè)試技術(shù)有很多優(yōu)越之處,但現(xiàn)有一些基于模式的測(cè)試方法還是存在誤報(bào)、漏報(bào)、測(cè)試精度不夠高的問(wèn)題。
發(fā)明內(nèi)容有鑒于此,本發(fā)明的主要目的在于提供一種基于軟件缺陷模式的測(cè)試方法及系統(tǒng),以提高軟件測(cè)試精度。為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的本發(fā)明公開(kāi)了一種基于軟件缺陷模式的測(cè)試方法,該方法包括-.a.讀取被測(cè)程序源代碼文件及缺陷狀態(tài)機(jī)SDSM描述文件,對(duì)被測(cè)程序進(jìn)行預(yù)處理,解析SDSM描述文件;b.對(duì)被測(cè)程序進(jìn)行詞法分析和語(yǔ)法分析,構(gòu)造出被測(cè)程序的抽象語(yǔ)法樹(shù);c.根據(jù)抽象語(yǔ)法樹(shù),生成控制流圖和符號(hào)表,并根據(jù)控制流圖和符號(hào)表,進(jìn)行變量取值區(qū)間集的計(jì)算與更新;d.根據(jù)符號(hào)表,對(duì)被測(cè)程序進(jìn)行函數(shù)調(diào)用關(guān)系分析,生成函數(shù)調(diào)用關(guān)系e.根據(jù)函數(shù)調(diào)用關(guān)系圖以函數(shù)為單位對(duì)控制流圖進(jìn)行遍歷,并計(jì)算控制流圖上每個(gè)節(jié)點(diǎn)缺陷狀態(tài)機(jī)的狀態(tài)變遷,缺陷狀態(tài)機(jī)進(jìn)入缺陷狀態(tài)時(shí)報(bào)告對(duì)應(yīng)的檢查點(diǎn)。該方法進(jìn)一步包括f.對(duì)于每個(gè)檢查點(diǎn),確認(rèn)是否為真的缺陷。該方法還包括設(shè)置基于軟件缺陷模式測(cè)試方法的技術(shù)指標(biāo),包括漏報(bào)率ER,準(zhǔn)確率CR,誤報(bào)率DR,缺陷檢測(cè)率DDR,自動(dòng)缺陷檢測(cè)率ADR。進(jìn)一步的,上述方法中步驟b所述抽象語(yǔ)法樹(shù)的所有節(jié)點(diǎn)支持訪問(wèn)者模式接口;步驟c所述控制流圖及符號(hào)表的生成分別通過(guò)采用訪問(wèn)者模式遍歷抽象語(yǔ)法樹(shù)生成;所述進(jìn)行變量取值區(qū)間集的計(jì)算與更新為沿著被測(cè)程序控制流正向遍歷控制流圖、釆用遞歸調(diào)用的方法進(jìn)行;步驟e所述對(duì)控制流圖進(jìn)行遍歷由缺陷模式分析引擎進(jìn)行,缺陷模式分析引擎根據(jù)步驟c所述變量取值區(qū)問(wèn)集的計(jì)算,識(shí)別不可達(dá)路徑上的缺陷,且不會(huì)將其報(bào)為缺陷。本發(fā)明還公開(kāi)了一種基于軟件缺陷模式的測(cè)試系統(tǒng),該系統(tǒng)包括輸入模塊,用于提供被測(cè)程序源代碼文件、軟件缺陷模式對(duì)應(yīng)的缺陷狀態(tài)機(jī)SDSM描述文件和系統(tǒng)配置文件;缺陷模式統(tǒng)一測(cè)試框架,用于讀入輸入模塊提供的文件,對(duì)被測(cè)程序進(jìn)行基于缺陷模式的測(cè)試并生成分析缺陷分布情況的缺陷報(bào)表。該系統(tǒng)還包括用戶(hù)界面模塊,用于提供用戶(hù)使用的界面,顯示缺陷報(bào)表。進(jìn)一步的,上述輸入模塊中,所述軟件缺陷模式包括故障模式、安全漏洞模式、低性能模式、壞習(xí)慣模式、疑問(wèn)代碼模式、死鎖模式;所述缺陷模式統(tǒng)一測(cè)試框架進(jìn)一步包括被測(cè)程序預(yù)處理模塊,讀入被測(cè)程序源代碼文件進(jìn)行預(yù)處理;SDSM解析器,讀入軟件缺陷模式對(duì)應(yīng)的缺陷狀態(tài)機(jī)SDSM描述文件,并解析SDSM描述文件;詞法分析及語(yǔ)法分析模塊,對(duì)被測(cè)程序進(jìn)行詞法分析、語(yǔ)法分析;抽象語(yǔ)法樹(shù)生成模塊,生成被測(cè)程序的抽象語(yǔ)法樹(shù);控制流圖生成模塊,采用訪問(wèn)者模式、遍歷抽象語(yǔ)法樹(shù),生成被測(cè)程序的控制流符號(hào)表生成模塊,釆用訪問(wèn)者模式、遍歷抽象語(yǔ)法樹(shù),生成被測(cè)程序的符號(hào)表;同時(shí)對(duì)被測(cè)程序進(jìn)行語(yǔ)義分析;區(qū)間運(yùn)算模塊,通過(guò)區(qū)間運(yùn)算計(jì)算變量在程序中的取值區(qū)間集;函數(shù)調(diào)用關(guān)系圖生成模塊,根據(jù)符號(hào)表,對(duì)被測(cè)程序進(jìn)行函數(shù)調(diào)用關(guān)系分析,生成函數(shù)調(diào)用關(guān)系缺陷模式分析引擎,根據(jù)函數(shù)調(diào)用關(guān)系圖以函數(shù)為單位對(duì)控制流圖進(jìn)行遍歷,根據(jù)缺陷狀態(tài)機(jī)的變遷,對(duì)被測(cè)程序進(jìn)行測(cè)試,缺陷狀態(tài)機(jī)進(jìn)入缺陷狀態(tài)時(shí)報(bào)告對(duì)應(yīng)的檢查點(diǎn),并生成缺陷報(bào)表。本發(fā)明所提供的基于軟件缺陷模式的測(cè)試方法及系統(tǒng),由于釆用了區(qū)間運(yùn)算,用于對(duì)被測(cè)程序進(jìn)行基于缺陷模式的測(cè)試和幫助識(shí)別不可達(dá)路徑;釆用基于缺陷模式的分析引擎,能對(duì)被測(cè)程序的控制流圖進(jìn)行遍歷,檢出缺陷代碼,并且不會(huì)報(bào)告不可達(dá)路徑上的缺陷,減少了誤報(bào)。因此,應(yīng)用本發(fā)明的方法和系統(tǒng)具有測(cè)試精度高、測(cè)試時(shí)間短、自動(dòng)化程度高的優(yōu)點(diǎn)。圖l為本發(fā)明基于軟件缺陷模式的測(cè)試方法的流程圖;圖2為本發(fā)明基于軟件缺陷模式的測(cè)試系統(tǒng)組成結(jié)構(gòu)框圖;圖3為本發(fā)明系統(tǒng)的DTS界面示意圖4為本發(fā)明方法抽象語(yǔ)法樹(shù)的生成在DTS系統(tǒng)中的實(shí)現(xiàn)過(guò)程示意圖;圖5為本發(fā)明系統(tǒng)對(duì)一段被測(cè)程序利用控制流圖遍歷時(shí)部分節(jié)點(diǎn)的缺陷狀態(tài)機(jī)狀態(tài)信息流動(dòng)示意圖。具體實(shí)施例方式下面結(jié)合附圖及具體實(shí)施例對(duì)本發(fā)明再作進(jìn)一步詳細(xì)的說(shuō)明。本發(fā)明的基本思想是首先讀取被測(cè)程序源代碼文件進(jìn)行預(yù)處理,解析軟件缺陷模式對(duì)應(yīng)的缺陷狀態(tài)機(jī)(SDSM)描述文件;再對(duì)被測(cè)程序進(jìn)行詞法分析和語(yǔ)法分析,構(gòu)造出被測(cè)程序的抽象語(yǔ)法樹(shù);根據(jù)抽象語(yǔ)法樹(shù),構(gòu)造控制流圖,生成符號(hào)表;然后進(jìn)行變量取值區(qū)間集的計(jì)算與更新,并根據(jù)符號(hào)表、對(duì)被測(cè)程序進(jìn)行函數(shù)調(diào)用關(guān)系分析,生成函數(shù)調(diào)用關(guān)系圖;最后缺陷模式分析引擎對(duì)控制流圖進(jìn)行遍歷,并計(jì)算控制流圖上每個(gè)節(jié)點(diǎn)缺陷狀態(tài)機(jī)的狀態(tài)變遷,如果缺陷狀態(tài)機(jī)進(jìn)入缺陷狀態(tài),則報(bào)告對(duì)應(yīng)的檢查點(diǎn)(IP,InspectivePoint)。圖1為本發(fā)明基于軟件缺陷模式的測(cè)試方法的流程圖,如圖l所示,該方法包括以下步驟步驟11,讀取被測(cè)程序源代碼文件及軟件缺陷模式對(duì)應(yīng)的缺陷狀態(tài)機(jī)SDSM描述文件,對(duì)被測(cè)程序進(jìn)行預(yù)處理,解析SDSM描述文件。這里,所謂狀態(tài)機(jī)是指一個(gè)行為,用于指定一個(gè)對(duì)象在其整個(gè)生命周期中對(duì)事件作出響應(yīng)而先后經(jīng)歷的各種狀態(tài),同時(shí)表明響應(yīng)和動(dòng)作,本發(fā)明中將對(duì)應(yīng)于缺陷模式的狀態(tài)機(jī)稱(chēng)為缺陷狀態(tài)機(jī),每種缺陷模式對(duì)應(yīng)一類(lèi)缺陷狀態(tài)機(jī)。對(duì)被測(cè)程序進(jìn)行的預(yù)處理是指對(duì)被測(cè)程序進(jìn)行測(cè)試之前要進(jìn)行宏替換、文件包含和條件編譯。對(duì)SDSM描述文件的解析是利用一段解析程序,將SDSM描述文件解析成后續(xù)處理中缺陷模式分析引擎能夠識(shí)別的內(nèi)存數(shù)據(jù)結(jié)構(gòu)。步驟12,對(duì)被測(cè)程序進(jìn)行詞法分析和語(yǔ)法分析,構(gòu)造出被測(cè)程序的抽象語(yǔ)法樹(shù)。這里,詞法分析(Lexicalanalysis)將被測(cè)程序轉(zhuǎn)換為可以進(jìn)行語(yǔ)法分析的記號(hào)流。抽象語(yǔ)法樹(shù)(AbstractSyntaxTree)是一種編譯技術(shù)中的用語(yǔ),指的是編譯器將源程序代碼解析,轉(zhuǎn)換為方便計(jì)算機(jī)處理的數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)通常為樹(shù)狀結(jié)構(gòu),因此稱(chēng)為抽象語(yǔ)法樹(shù)。本發(fā)明方法中所述的抽象語(yǔ)法樹(shù)由不同類(lèi)型的節(jié)點(diǎn)組成,所有的節(jié)點(diǎn)都支持一個(gè)統(tǒng)一的訪問(wèn)者模式接口,這樣就能很方便地對(duì)抽象語(yǔ)法樹(shù)通過(guò)訪問(wèn)者模式進(jìn)行進(jìn)一步的不同形式的加工、遍歷訪問(wèn)和輸出。步驟13,根據(jù)所構(gòu)造的抽象語(yǔ)法樹(shù),生成反映被測(cè)程序控制結(jié)構(gòu)的控制流圖??刂屏鲌D采用訪問(wèn)者模式遍歷抽象語(yǔ)法樹(shù)得到,其方法是在遍歷抽象語(yǔ)法樹(shù)的基礎(chǔ)上,由一個(gè)控制流圖生成訪問(wèn)者實(shí)現(xiàn)。所述訪問(wèn)者釆用遞歸下降的辦法生成控制流圖,即在每個(gè)抽象語(yǔ)法樹(shù)中代表語(yǔ)句節(jié)點(diǎn)的訪問(wèn)者函數(shù)中加入相應(yīng)產(chǎn)生控制流圖的代碼。每一個(gè)控制語(yǔ)句對(duì)應(yīng)抽象語(yǔ)法樹(shù)節(jié)點(diǎn)的訪問(wèn)者函數(shù)負(fù)責(zé)生成該控制語(yǔ)句的部分控制流圖,在遍歷的過(guò)程中將這些部分控制流圖一一連接組織起來(lái)就構(gòu)成了被測(cè)程序的控制流圖。被測(cè)程序的控制流圖與抽象語(yǔ)法樹(shù)是相對(duì)應(yīng)的,控制流圖的每一個(gè)節(jié)點(diǎn)對(duì)應(yīng)抽象語(yǔ)法樹(shù)的語(yǔ)句節(jié)點(diǎn),從控制流圖可以訪問(wèn)抽象語(yǔ)法樹(shù),同樣的,從抽象語(yǔ)法樹(shù)的語(yǔ)句節(jié)點(diǎn)也可以很方便的訪問(wèn)到控制流圖的相應(yīng)節(jié)點(diǎn)。另外,控制流圖的每個(gè)節(jié)點(diǎn)對(duì)應(yīng)被測(cè)程序中的一條語(yǔ)句。步驟14,根據(jù)所構(gòu)造的抽象語(yǔ)法樹(shù),生成被測(cè)程序的符號(hào)表,用來(lái)記錄被測(cè)程序標(biāo)識(shí)符的類(lèi)型、作用域以及綁定信息,并對(duì)被測(cè)程序進(jìn)行語(yǔ)義分析。符號(hào)表的生成與控制流圖的生成類(lèi)似,也是采用訪問(wèn)者模式遍歷抽象語(yǔ)法樹(shù)得到,只是在每個(gè)抽象語(yǔ)法樹(shù)中代表語(yǔ)句節(jié)點(diǎn)的訪問(wèn)者函數(shù)中加入的是相應(yīng)產(chǎn)生符號(hào)表的代碼。這里,符號(hào)表將標(biāo)識(shí)符與其類(lèi)型和在程序中所處的位置進(jìn)行映射,在處理類(lèi)型、變量和函數(shù)的聲明時(shí),這些標(biāo)識(shí)符可以在符號(hào)表中得到解釋。當(dāng)發(fā)現(xiàn)有標(biāo)識(shí)符被使用時(shí),這些標(biāo)識(shí)符都可以在符號(hào)表中找到。在實(shí)際應(yīng)用中,步驟13和步驟14是并列的,前后順序不限。步驟15,根據(jù)所生成的控制流圖和符號(hào)表,沿著被測(cè)程序控制流正向遍歷控制流圖;釆用遞歸調(diào)用的方法,進(jìn)行變量取值區(qū)間集的計(jì)算與更新。本發(fā)明方法所釆用的區(qū)間運(yùn)算對(duì)基本的區(qū)間運(yùn)算進(jìn)行了擴(kuò)展,支持區(qū)間集運(yùn)算和實(shí)數(shù)、布爾變量、句柄變量和數(shù)組變量多種數(shù)據(jù)類(lèi)型的區(qū)間運(yùn)算,可以對(duì)聲明語(yǔ)句、賦值語(yǔ)句和條件語(yǔ)句進(jìn)行區(qū)間計(jì)算,在對(duì)控制流圖遍歷時(shí),通過(guò)區(qū)間運(yùn)算可以大概計(jì)算被測(cè)程序變量的取值范圍,該信息用于后續(xù)基于缺陷模式的測(cè)試和幫助識(shí)別不可達(dá)路徑。步驟16,根據(jù)生成的符號(hào)表,對(duì)被測(cè)程序進(jìn)行函數(shù)調(diào)用關(guān)系分析,生成函數(shù)調(diào)用關(guān)系圖。其中,所述對(duì)被測(cè)程序進(jìn)行函數(shù)調(diào)用關(guān)系分析包括分析函數(shù)在源代碼中的位置、函數(shù)之間的調(diào)用關(guān)系以及函數(shù)調(diào)用的先后順序和次數(shù)等。步驟17,對(duì)被測(cè)程序進(jìn)行測(cè)試,以函數(shù)為單位,根據(jù)函數(shù)調(diào)用關(guān)系圖對(duì)控制流圖進(jìn)行遍歷,并根據(jù)SDSM描述文件中關(guān)于缺陷狀態(tài)、狀態(tài)變遷以及引起狀態(tài)變遷的動(dòng)作的描述,計(jì)算控制流圖上每個(gè)節(jié)點(diǎn)缺陷狀態(tài)機(jī)的狀態(tài)變遷,如果缺陷狀態(tài)機(jī)進(jìn)入缺陷狀態(tài),則報(bào)告對(duì)應(yīng)的檢查點(diǎn)。這里,利用預(yù)先定義的缺陷模式分析引擎對(duì)控制流圖進(jìn)行遍歷,實(shí)現(xiàn)對(duì)缺陷狀態(tài)機(jī)狀態(tài)變遷的計(jì)算,報(bào)告檢查點(diǎn)IP。檢查點(diǎn)IP定義了和缺陷相關(guān)聯(lián)的變量的定義代碼行、缺陷的發(fā)生代碼行和缺陷的類(lèi)型。對(duì)于控制流圖上的每個(gè)節(jié)點(diǎn),其相應(yīng)動(dòng)作改變?nèi)毕轄顟B(tài)機(jī)的狀態(tài),如果有缺陷狀態(tài)機(jī)進(jìn)入出錯(cuò)狀態(tài)(Error),則報(bào)告一個(gè)缺陷。具體的,對(duì)控制流圖的遍歷以函數(shù)為單位進(jìn)行,根據(jù)函數(shù)調(diào)用關(guān)系圖,按照函數(shù)調(diào)用關(guān)系的拓?fù)淠嫘蜻M(jìn)行;在函數(shù)控制流入口處開(kāi)始遍歷,如果符合缺陷狀態(tài)機(jī)創(chuàng)建條件,則建立相應(yīng)的缺陷狀態(tài)機(jī)實(shí)例,如對(duì)函數(shù)中每個(gè)會(huì)被引用的句柄變量建立一個(gè)空指針引用缺陷狀態(tài)機(jī)實(shí)例。對(duì)于控制流圖的每個(gè)節(jié)點(diǎn),計(jì)算每個(gè)缺陷狀態(tài)機(jī)的狀態(tài)變遷,缺陷狀態(tài)機(jī)的狀態(tài)信息流動(dòng)可以用如下方程表示<formula>formulaseeoriginaldocumentpage10</formula>其中,in[n]指到達(dá)節(jié)點(diǎn)n之前的所有可能狀態(tài)集合;out[n]指到達(dá)節(jié)點(diǎn)n之后所有可能狀態(tài)集合;gen[n]為節(jié)點(diǎn)n中新產(chǎn)生或改變得到的新?tīng)顟B(tài)集合;kill[n]為節(jié)點(diǎn)n中"注銷(xiāo)"或"被改變"的狀態(tài)集合;pred[n]為節(jié)點(diǎn)n的所有前驅(qū)節(jié)點(diǎn)集合。利用步驟15的區(qū)間運(yùn)算,缺陷模式分析引擎在對(duì)控制流圖進(jìn)行遍歷的過(guò)程中,將識(shí)別出不可達(dá)路徑上的缺陷,并且不會(huì)報(bào)告不可達(dá)路徑上的缺陷,減少了誤報(bào)。在分析過(guò)程中,如果在節(jié)點(diǎn)n上的狀態(tài)集合出現(xiàn)Error狀態(tài),則報(bào)告一個(gè)缺陷,也就是報(bào)告對(duì)應(yīng)的檢查點(diǎn)IP。步驟18,對(duì)于每個(gè)檢查點(diǎn),進(jìn)一步確認(rèn)是否為真的缺陷??紤]到程序的邏輯復(fù)雜性以及測(cè)試代價(jià)等因素,IP經(jīng)確認(rèn)后分為三種情況:確認(rèn)為缺陷、確認(rèn)為非缺陷、以及不能確定是否缺陷。對(duì)于基于缺陷模式的測(cè)試,根據(jù)經(jīng)驗(yàn)估計(jì),對(duì)IP判斷其是否為真的缺陷的工作從經(jīng)濟(jì)上來(lái)說(shuō)占測(cè)試總代價(jià)的80%以上,通常由有經(jīng)驗(yàn)的測(cè)試小組進(jìn)行確認(rèn),每個(gè)成員平均每天能確認(rèn)100個(gè)IP。進(jìn)一步的,在本發(fā)明的方法中,還定義了基于軟件缺陷模式測(cè)試方法的幾個(gè)主要技術(shù)指標(biāo)包括漏報(bào)率(ER)、準(zhǔn)確率(CR)、誤報(bào)率(DR)、缺陷檢測(cè)率(DDR)、自動(dòng)缺陷檢測(cè)率(ADR)。這些參數(shù)可通過(guò)以下方式具體計(jì)算得出假設(shè)P是被測(cè)程序,M是缺陷模式,A是算法,IP是檢查點(diǎn)。將M分成n類(lèi)M={MhM2,—,Mn},每類(lèi)分成種MHMuM^.Ml},從P中計(jì)算出與M相匹配的檢查點(diǎn)的集合IP^IPJP2,…,IPiJ。IP(M,A,P)是在算法為A時(shí)IP總的數(shù)目,IP(M,P)是在M和P給定之后,IP總的數(shù)目。理論上,在M和P給定之后,IP(M,P)是確定的,但是在實(shí)踐中很難得到IP(M,P);實(shí)際中,用0/戶(hù)(M,4,尸)表示IP(M,P),其中Ai,A2,…,An為不同測(cè)試工具所對(duì)應(yīng)的算法。所述技術(shù)指標(biāo)ER、CR、DR、DDR、ADR可分別表示為<formula>formulaseeoriginaldocumentpage11</formula>;其中,IPY(M,A,P)表示IP確認(rèn)為缺陷的數(shù)目,IPu(M,A,P)表示不能確定是否為缺陷的數(shù)目;<formula>formulaseeoriginaldocumentpage11</formula>;其中,IPN(M,A,P)表示確認(rèn)為非缺陷的數(shù)目;DDR(DefectDetectingRatio):Z)e/e"D"ecriwgia;"oADR(AutoDefectRatio):麵£>—i垂=;其中,IPAY(M,A,P)表示不需人工確認(rèn),工具可以自動(dòng)確認(rèn)為缺陷的檢查點(diǎn)個(gè)數(shù)。為實(shí)現(xiàn)上述方法,本發(fā)明還提供了一種基于軟件缺陷模式的測(cè)試系統(tǒng)(DTS,DefectTestingSystem),該系統(tǒng)能夠?qū)崿F(xiàn)對(duì)C/C++ZJava語(yǔ)言編寫(xiě)的源圖2是本發(fā)明基于軟件缺陷模式的測(cè)試系統(tǒng)組成結(jié)構(gòu)框圖,該系統(tǒng)由輸入模塊21、缺陷模式統(tǒng)一測(cè)試框架22、及用戶(hù)界面模塊23組成。其中,輸入模塊21提供被測(cè)程序源代碼文件、軟件缺陷模式對(duì)應(yīng)的缺陷狀態(tài)機(jī)SDSM描述文件和系統(tǒng)配置文件。缺陷模式統(tǒng)一測(cè)試框架22讀入輸入模塊21提供的文件,對(duì)被測(cè)程序進(jìn)行基于缺陷模式的測(cè)試,并生成分析缺陷分布情況的缺陷報(bào)表24。該缺陷模式統(tǒng)一測(cè)試框架22能夠?qū)Χ囝?lèi)軟件缺陷模式同時(shí)測(cè)試,多類(lèi)軟件缺陷模式的測(cè)試能共享很多信息,如變量取值等,可以縮短測(cè)試時(shí)間。缺陷模式統(tǒng)一測(cè)試框架22進(jìn)一步包括被測(cè)程序預(yù)處理模塊、SDSM解析器、詞法分析及語(yǔ)法分析模塊、抽象語(yǔ)法樹(shù)生成模塊、控制流圖生成模塊、符號(hào)表生成模塊、區(qū)間運(yùn)算模塊、函數(shù)調(diào)用關(guān)系圖生成模塊和缺陷模式分析引擎。具體的被測(cè)程序預(yù)處理模塊,用于讀入被測(cè)程序源代碼文件進(jìn)行預(yù)處理;SDSM解析器,用于讀入軟件缺陷模式對(duì)應(yīng)的缺陷狀態(tài)機(jī)SDSM描述文件,并解析SDSM描述文件,將SDSM描述文件解析成后續(xù)處理中缺陷模式分析引擎能夠識(shí)別的內(nèi)存數(shù)據(jù)結(jié)構(gòu);詞法分析及語(yǔ)法分析模塊,負(fù)責(zé)對(duì)被測(cè)程序進(jìn)行詞法分析、語(yǔ)法分析;抽象語(yǔ)法樹(shù)生成模塊,用于生成被測(cè)程序的抽象語(yǔ)法樹(shù);控制流圖生成模塊,釆用訪問(wèn)者模式遍歷抽象語(yǔ)法樹(shù),生成被測(cè)程序的控制流符號(hào)表生成模塊,釆用訪問(wèn)者模式遍歷抽象語(yǔ)法樹(shù),生成被測(cè)程序的符號(hào)表;同時(shí)對(duì)被測(cè)程序進(jìn)行語(yǔ)義分析;區(qū)間運(yùn)算模塊,通過(guò)區(qū)間運(yùn)算計(jì)算變量在程序中的取值區(qū)間集;函數(shù)調(diào)用關(guān)系圖生成模塊,根據(jù)符號(hào)表,對(duì)被測(cè)程序進(jìn)行函數(shù)調(diào)用關(guān)系分析,生成函數(shù)調(diào)用關(guān)系缺陷模式分析引擎,對(duì)被測(cè)程序進(jìn)行測(cè)試,以函數(shù)為單位,根據(jù)函數(shù)調(diào)用關(guān)系圖對(duì)控制流圖進(jìn)行遍歷,根據(jù)缺陷狀態(tài)機(jī)的變遷,對(duì)被測(cè)程序進(jìn)行測(cè)試,如果缺陷狀態(tài)機(jī)進(jìn)入缺陷狀態(tài)則報(bào)告對(duì)應(yīng)的檢查點(diǎn),并生成缺陷報(bào)表24。用戶(hù)界面模塊23包括文件視圖、代碼視圖、描述視圖以及檢查點(diǎn)列表,用于提供用戶(hù)使用的界面,顯示缺陷報(bào)表24,圖3是本發(fā)明系統(tǒng)的DTS界面示意圖。進(jìn)一步的,在輸入模塊21中,所述軟件缺陷模式對(duì)應(yīng)的缺陷狀態(tài)機(jī)SDSM描述文件,釆用xml技術(shù)實(shí)現(xiàn),描述了要檢測(cè)的缺陷模式、或者系統(tǒng)中自定義規(guī)則的狀態(tài)機(jī)。系統(tǒng)中自定義規(guī)則是指軟件開(kāi)發(fā)所要遵循的一些規(guī)則或模式,比如命名規(guī)則、代碼規(guī)則等,違反這些規(guī)則也是不允許的。本系統(tǒng)所述的缺陷模式包括故障模式、安全漏洞模式、低性能模式、壞習(xí)慣模式、疑問(wèn)代碼模式、死鎖模式六個(gè)大類(lèi),30個(gè)子類(lèi),150種;所述規(guī)則的模式有200種。進(jìn)一步的,在缺陷模式統(tǒng)一測(cè)試框架22中,抽象語(yǔ)法樹(shù)生成模塊生成抽象語(yǔ)法樹(shù)的實(shí)現(xiàn)過(guò)程如圖4所示,包括以下步驟步驟1,編寫(xiě)語(yǔ)法規(guī)則及抽象語(yǔ)法樹(shù)的生成動(dòng)作描述文件;本發(fā)明實(shí)施例中,可編寫(xiě)DTS系統(tǒng)中的Java.jjt文件,.jjt文件是語(yǔ)法規(guī)則及其抽象語(yǔ)法樹(shù)生成動(dòng)作描述文件。步驟2,生成抽象語(yǔ)法樹(shù)數(shù)據(jù)結(jié)構(gòu)定義文件和解析器最終能識(shí)別的語(yǔ)法規(guī)則文件;這里,利用JavaCC的伙伴工具JJTree來(lái)處理.jjt文件,自動(dòng)生成抽象語(yǔ)法樹(shù)數(shù)據(jù)結(jié)構(gòu)定義Java文件和.jj文件,.jj文件為JavaCC最終能識(shí)別的語(yǔ)法規(guī)則文件。其中,所述JavaCC為現(xiàn)有的解析器生成器工具軟件。步驟3,構(gòu)造出在內(nèi)存中的抽象語(yǔ)法樹(shù)結(jié)構(gòu);JavaCC根據(jù).jj文件創(chuàng)建抽象語(yǔ)法樹(shù)的Java分析器,在分析被測(cè)源程序的基礎(chǔ)上生成抽象語(yǔ)法樹(shù)分析代碼,執(zhí)行該代碼將在內(nèi)存中生成抽象語(yǔ)法樹(shù)結(jié)構(gòu)??刂屏鲌D的生成在遍歷抽象語(yǔ)法樹(shù)的基礎(chǔ)上,由一個(gè)控制流圖生成訪問(wèn)者ControlFlowViskor實(shí)現(xiàn)。ControlFlowVisitor訪問(wèn)者釆用遞歸下降的辦法生成控制流圖,即在每個(gè)抽象語(yǔ)法樹(shù)中代表語(yǔ)句節(jié)點(diǎn)的訪問(wèn)者函數(shù)中加入相應(yīng)產(chǎn)生控制流圖的代碼。每一個(gè)控制語(yǔ)句對(duì)應(yīng)抽象語(yǔ)法樹(shù)節(jié)點(diǎn)的訪問(wèn)者(visit)函數(shù)負(fù)責(zé)生成本語(yǔ)句的部分控制流圖,在遍歷的過(guò)程中將這些部分控制流圖一一連接組織起來(lái)就構(gòu)成了被測(cè)程序的控制流圖。符號(hào)表生成模塊用來(lái)構(gòu)造符號(hào)表,同樣釆用遍歷抽象語(yǔ)法樹(shù)的訪問(wèn)者模式。以一個(gè)在DTS系統(tǒng)中對(duì)一段被測(cè)程序的分析為例Java中支持向前引用,例如classTest{TestCasea;classTestCase{在Test類(lèi)中使用了TestCase類(lèi),但是TestCase類(lèi)的聲明此時(shí)還未出現(xiàn),為了支持向前引用,需要采用兩遍訪問(wèn)。第一遍僅僅處理所有的聲明(declarations)和能產(chǎn)生作用域的節(jié)點(diǎn),在每個(gè)聲明的節(jié)點(diǎn)對(duì)符號(hào)表進(jìn)行符號(hào)記錄的添加;第二遍處理所有標(biāo)記符出現(xiàn)的地方,對(duì)符號(hào)記錄進(jìn)行查詢(xún),將每一個(gè)標(biāo)記符的出現(xiàn)和相應(yīng)的正確聲明進(jìn)行聯(lián)系,如此構(gòu)造出DTS系統(tǒng)中被測(cè)程序的符號(hào)表的一部分或全部。區(qū)間運(yùn)算模塊計(jì)算程序中每個(gè)語(yǔ)句中變量的當(dāng)前可能取值范圍。區(qū)間分析主要由四個(gè)訪問(wèn)者完成ExpressionDomainVisitor完成對(duì)抽象語(yǔ)法樹(shù)上的各種表達(dá)式的遍歷,計(jì)算表達(dá)式的取值區(qū)間,包括賦值表達(dá)式;ConditionDomainVisitor對(duì)抽象語(yǔ)法樹(shù)上的條件判斷表達(dá)式進(jìn)行處理,計(jì)算條件判斷中各變量在條件判斷被限定取真或假值后的取值區(qū)間;ControlFlowDomainVisitor主要處理構(gòu)造方法和普通方法語(yǔ)法樹(shù)節(jié)點(diǎn),啟動(dòng)控制流圖遍歷;DomainVexVisitor是遍歷控制流圖的訪問(wèn)者,將區(qū)間分析應(yīng)用到整個(gè)程序并處理控制流圖對(duì)變量區(qū)間的影響,經(jīng)過(guò)DomainVexVisitor訪問(wèn)者的處理后,控制流圖上的每個(gè)節(jié)點(diǎn)都記錄了當(dāng)前節(jié)點(diǎn)的相關(guān)變量取值區(qū)間。下面是幾個(gè)比較典型的Java被測(cè)程序的例子,用來(lái)比較基于軟件缺陷模式的DTS和常見(jiàn)靜態(tài)分析工具之間的差異。例1:在控制流圖遍歷過(guò)程中,對(duì)缺陷狀態(tài)機(jī)實(shí)例的每一個(gè)狀態(tài)都關(guān)聯(lián)一個(gè)前提條件,該前提條件由一系列變量及其取值區(qū)間組成。如果某個(gè)狀態(tài)的前提條件中存在一個(gè)變量的取值區(qū)間為空,則說(shuō)明該狀態(tài)是不可能狀態(tài),也即發(fā)現(xiàn)了不可達(dá)路徑,以往的一些測(cè)試工具對(duì)于不可達(dá)路徑上的缺陷可能會(huì)報(bào)告為故障,而利用本發(fā)明的DTS系統(tǒng)則能識(shí)別不可達(dá)路徑上的缺陷,不會(huì)將其報(bào)為缺陷,減少了誤報(bào)。如本例所示,參照?qǐng)D5,一段被測(cè)程序代碼及相應(yīng)的控制流圖節(jié)點(diǎn)缺陷狀態(tài)機(jī)的狀態(tài)變化如下,其中,nln8為八個(gè)節(jié)點(diǎn)intlogLevel;PrintWriterlog=null;if(logLevel>0)log=newPrintWriter(…);if(logLevel>3)log,println("Logstarted");在nl節(jié)點(diǎn)in:{Start(logLevel:[MinInt,MaxInt])},out:(MayNull(logLevel:[Minlnt,MaxInt]));在n2節(jié)點(diǎn)in:{MayNull(logLevel:[MinInt,MaxInt])},out:{MayNull(logLevel:[MinInt,MaxInt])};在n3節(jié)點(diǎn)in:{MayNull(logLevel:[l,MaxInt])},out:(NonNull(logLevel:[l,MaxInt]));在n4節(jié)點(diǎn)in:{MayNull(logLevel:[MinInt,O])NonNull(logLevel:[l,MaxInt])},out:{MayNull(logLevel:[MinInt,O])NonNull(logLevel:[l,Max闊));在n5節(jié)點(diǎn)in:{MayNull(logLevel:[MinInt,O])NonNull(logLevel:[l,MaxInt])},out:{MayNull(logLevel:[MinInt,O])NonNull(logLevel:[l,MaxInt])};在n6節(jié)點(diǎn)in:{MayNull(1ogLevel::0)NonNull(logLevel:[4,MaxInt])},out:{NonNull(logLevel:[4,MaxInt]";在n7節(jié)點(diǎn)in:{MayNull(logLevel:[MinInt,O])NonNull(logLevel:[l,MaxInt])},out:{MayNull(logLevel:[MMnt,O])NonNull(logLevel:[l,MaxInt]));在n8節(jié)點(diǎn)in:{MayNull(logLevel:[MinInt,O])NonNull(logLevel:[l,MaxInt]",out:{END};其中,in:(Start(logLevel:[Minlnt,MaxInt]》表示進(jìn)入節(jié)點(diǎn)nl缺陷狀態(tài)機(jī)的狀態(tài)為Start狀態(tài),其前提條件是整型變量logLevel的取值范圍為[Minlnt,MaxInt],Minlnt,MaxInt代表整型變量的默認(rèn)的最小和最大取值。執(zhí)行完節(jié)點(diǎn)nl后,該狀態(tài)機(jī)的狀態(tài)為MayNull。執(zhí)行完節(jié)點(diǎn)n3后,由于對(duì)log進(jìn)行了內(nèi)存分配,故缺陷狀態(tài)機(jī)的狀態(tài)為NotNull,其前提條件是整型變量logLevel的取值范圍為[1,Maxlnt];進(jìn)入節(jié)點(diǎn)n4的缺陷狀態(tài)機(jī)有關(guān)聯(lián)不同前提條件的兩個(gè)狀態(tài)MayNull(logLevel:[Minlnt,0])和NonNull(logLevel:[l,MaxInt])。進(jìn)入節(jié)點(diǎn)n6的缺陷狀態(tài)機(jī)有兩個(gè)狀態(tài)MayNull(logLevel::0)和NonNull(logLevel:[4,MaxInt]),由于此時(shí)和MayNull狀態(tài)關(guān)聯(lián)的前提條件是logLevel取值范圍為0,故該狀態(tài)為一個(gè)不可能狀態(tài),該不可能狀態(tài)實(shí)際反映了nl》n2》n4》n5一n6為不可達(dá)路徑,所以節(jié)點(diǎn)n6對(duì)句柄變量1og的引用不會(huì)報(bào)告空指針引用故障。例2:如本例所示,每個(gè)用例都會(huì)產(chǎn)生一個(gè)空指針引用故障,如果用注釋代碼替換源代碼相應(yīng)部分,則空指針故障不會(huì)產(chǎn)生。表項(xiàng)中v代表x為局部變量的情況,f代表將x改為成員變量后的情況。一個(gè)v代表正確地報(bào)告出了故障,兩個(gè)v代表代碼替換前后都報(bào)告故障,其中一個(gè)是誤報(bào);f情況類(lèi)似,一個(gè)f代表正確地報(bào)告出了故障,兩個(gè)f代表代碼替換前后都報(bào)告故障,其中一個(gè)是誤報(bào);空白表示沒(méi)有報(bào)告故障。用例如下intintral(intlevel){Objectx=null;if(level>0;>x=newObject();if(level</*>*Z4)returnx.hashCode();return0;intintra2(boolean{Objectx=null;if(b)x=newObject();if(!b/*bV)returnx.hashCode();return0;intintra3(Objectx){Objecty=null;if(x!=null—)y=newObject();if(y!=null)returnx.hashCode()十y.hashCode(乂elsereturnx,hashCode()/*0*/;return0;表1為空指針引用故障的測(cè)試結(jié)果:intintra4(boolean{Objectx=null;Objecty=null;if(b)x="x";if(x!=null)y='y';if(y!=null)returnx.hashCodeO+y.hashCode();elsereturnx.hashCode()/*0*/;intintm5(Objectx){if(x=,ll){returnx.hashCode();/*0*/return0;intintra6(Pbjectx){if(x==null){Objecty=x;/*0*/returny.hashCode();intinter1(booleanb){Objectx=null;if(b/*!b*0x=newObject();returnhelperl(x,b);intinter2(){returnhelper2(null);/*0:intinter3(boolean{Objectx=null;if(b)x="x";returnhelper2(x);/*0*/〃Bugwhenxisnull〃andbisfalseprivateinthelperl(Objectx,boolean{if(b)return0;returnx.hashCode(》privateinthelper2(Objectx){returnx,hashCode();<table>tableseeoriginaldocumentpage17</column></row><table>表1表1中,DTS對(duì)于函數(shù)內(nèi)部用例中的第1和第2個(gè)測(cè)試用例只報(bào)告了x為局部變量的情況,在x為成員變量時(shí)DTS沒(méi)有報(bào)告錯(cuò)誤。這是因?yàn)閷?duì)于成員變量,只選擇報(bào)告那些在函數(shù)中存在類(lèi)似x:-null或xhnull的檢查情況,以避免大量的誤報(bào)。另外,在處理第l個(gè)函數(shù)間用例時(shí)測(cè)試結(jié)果是w,也就是說(shuō)產(chǎn)生了一個(gè)誤報(bào),這是因?yàn)镈TS還只能處理比較簡(jiǎn)單的函數(shù)間情況。由例2可以看出使用本發(fā)明DTS工具的測(cè)試誤報(bào)要少很多,測(cè)試的準(zhǔn)確率較高。例3:本例是使用不同的測(cè)試工具對(duì)Tomcat4丄24進(jìn)行缺陷測(cè)試的結(jié)果如表2所示<table>tableseeoriginaldocumentpage18</column></row><table>表2從表2可以看出,很明顯的,使用DTS系統(tǒng)測(cè)試時(shí),相對(duì)于別的現(xiàn)有測(cè)試工具,使用了本發(fā)明方法的DTS系統(tǒng),具有很高的準(zhǔn)確率和缺陷檢測(cè)率,較低的誤報(bào)率。使用了本發(fā)明方法的DTS系統(tǒng),其優(yōu)點(diǎn)還在于測(cè)試時(shí)間短。對(duì)同樣的被測(cè)程序而言,由于程序靜態(tài)分析的方式本身的測(cè)試速度要比程序動(dòng)態(tài)分析的快,也就是測(cè)試時(shí)間相對(duì)要短,同時(shí),本發(fā)明中釆用缺陷模式統(tǒng)一測(cè)試框架,使得一次測(cè)試能對(duì)多類(lèi)軟件缺陷模式同時(shí)測(cè)試,多類(lèi)軟件缺陷模式的測(cè)試能共享很多信息,如變量取值等,縮短了測(cè)試時(shí)間;本發(fā)明所述的DTS系統(tǒng)對(duì)數(shù)十萬(wàn)行的程序,可以在12個(gè)小時(shí)內(nèi)測(cè)試完畢。自動(dòng)化程度高。應(yīng)用DTS,可直接對(duì)C/C++/Java的源代碼進(jìn)行掃描測(cè)試,并自動(dòng)產(chǎn)生故障點(diǎn)IP。以上所述,僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。權(quán)利要求1、一種基于軟件缺陷模式的測(cè)試方法,其特征在于,該方法包括a.讀取被測(cè)程序源代碼文件及缺陷狀態(tài)機(jī)SDSM描述文件,對(duì)被測(cè)程序進(jìn)行預(yù)處理,解析SDSM描述文件;b.對(duì)被測(cè)程序進(jìn)行詞法分析和語(yǔ)法分析,構(gòu)造出被測(cè)程序的抽象語(yǔ)法樹(shù);c.根據(jù)抽象語(yǔ)法樹(shù),生成控制流圖和符號(hào)表,并根據(jù)控制流圖和符號(hào)表,進(jìn)行變量取值區(qū)間集的計(jì)算與更新;d.根據(jù)符號(hào)表,對(duì)被測(cè)程序進(jìn)行函數(shù)調(diào)用關(guān)系分析,生成函數(shù)調(diào)用關(guān)系圖;e.根據(jù)函數(shù)調(diào)用關(guān)系圖以函數(shù)為單位對(duì)控制流圖進(jìn)行遍歷,并計(jì)算控制流圖上每個(gè)節(jié)點(diǎn)缺陷狀態(tài)機(jī)的狀態(tài)變遷,缺陷狀態(tài)機(jī)進(jìn)入缺陷狀態(tài)時(shí)報(bào)告對(duì)應(yīng)的檢查點(diǎn)。2、根據(jù)權(quán)利要求l所述的方法,其特征在于,該方法進(jìn)一步包括f.對(duì)于每個(gè)檢查點(diǎn),確認(rèn)是否為真的缺陷。3、根據(jù)權(quán)利要求l所述的方法,其特征在于,該方法還包括設(shè)置基于軟件缺陷模式測(cè)試方法的技術(shù)指標(biāo),包括漏報(bào)率ER,準(zhǔn)確率CR,誤報(bào)率DR,缺陷檢測(cè)率DDR,自動(dòng)缺陷檢測(cè)率ADR。4、根據(jù)權(quán)利要求l所述的方法,其特征在于,步驟b所述抽象語(yǔ)法樹(shù)的所有節(jié)點(diǎn)支持訪問(wèn)者模式接口。5、根據(jù)權(quán)利要求l所述的方法,其特征在于,步驟c所述控制流圖及符號(hào)表的生成分別通過(guò)釆用訪問(wèn)者模式遍歷抽象語(yǔ)法樹(shù)生成;所述進(jìn)行變量取值區(qū)間集的計(jì)算與更新為沿著被測(cè)程序控制流正向遍歷控制流圖、釆用遞歸調(diào)用的方法進(jìn)行。6、根據(jù)權(quán)利要求l所述的方法,其特征在于,步驟e所述對(duì)控制流圖進(jìn)行遍歷由缺陷模式分析引擎進(jìn)行,缺陷模式分析引擎根據(jù)步驟c所述變量取值區(qū)間集的計(jì)算,識(shí)別不可達(dá)路徑上的缺陷,且不會(huì)將其報(bào)為缺陷。7、一種基于軟件缺陷模式的測(cè)試系統(tǒng),其特征在于,該系統(tǒng)包括輸入模塊,用于提供被測(cè)程序源代碼文件、軟件缺陷模式對(duì)應(yīng)的缺陷狀態(tài)機(jī)SDSM描述文件和系統(tǒng)配置文件;缺陷模式統(tǒng)一測(cè)試框架,用于讀入輸入模塊提供的文件,對(duì)被測(cè)程序進(jìn)行基于缺陷模式的測(cè)試并生成分析缺陷分布情況的缺陷報(bào)表。8、根據(jù)權(quán)利要求7所述的系統(tǒng),其特征在于,該系統(tǒng)還包括用戶(hù)界面模塊,用于提供用戶(hù)使用的界面,顯示缺陷報(bào)表。9、根據(jù)權(quán)利要求7所述的系統(tǒng),其特征在于,所述軟件缺陷模式包括故障模式、安全漏洞模式、低性能模式、壞習(xí)慣模式、疑問(wèn)代碼模式、死鎖模式。10、根據(jù)權(quán)利要求7所述的系統(tǒng),其特征在于,所述缺陷模式統(tǒng)一測(cè)試框架進(jìn)一步包括被測(cè)程序預(yù)處理模塊,讀入被測(cè)程序源代碼文件進(jìn)行預(yù)處理;SDSM解析器,讀入軟件缺陷模式對(duì)應(yīng)的缺陷狀態(tài)機(jī)SDSM描述文件,并解析SDSM描述文件;詞法分析及語(yǔ)法分析模塊,對(duì)被測(cè)程序進(jìn)行詞法分析、語(yǔ)法分析;抽象語(yǔ)法樹(shù)生成模塊,生成被測(cè)程序的抽象語(yǔ)法樹(shù);控制流圖生成模塊,釆用訪問(wèn)者模式、遍歷抽象語(yǔ)法樹(shù),生成被測(cè)程序的控制流圖;符號(hào)表生成模塊,釆用訪問(wèn)者模式、遍歷抽象語(yǔ)法樹(shù),生成被測(cè)程序的符號(hào)表;同時(shí)對(duì)被測(cè)程序進(jìn)行語(yǔ)義分析;區(qū)間運(yùn)算模塊,通過(guò)區(qū)間運(yùn)算計(jì)算變量在程序中的取值區(qū)間集;函數(shù)調(diào)用關(guān)系圖生成模塊,根據(jù)符號(hào)表,對(duì)被測(cè)程序進(jìn)行函數(shù)調(diào)用關(guān)系分析,生成函數(shù)調(diào)用關(guān)系圖;缺陷模式分析引擎,根據(jù)函數(shù)調(diào)用關(guān)系圖以函數(shù)為單位對(duì)控制流圖進(jìn)行遍歷,根據(jù)缺陷狀態(tài)機(jī)的變遷,對(duì)被測(cè)程序進(jìn)行測(cè)試,缺陷狀態(tài)機(jī)進(jìn)入缺陷狀態(tài)時(shí)報(bào)告對(duì)應(yīng)的檢查點(diǎn),并生成缺陷報(bào)表。全文摘要本發(fā)明公開(kāi)了一種基于軟件缺陷模式的測(cè)試方法,包括讀取被測(cè)程序源代碼文件及缺陷狀態(tài)機(jī)SDSM描述文件,對(duì)被測(cè)程序進(jìn)行預(yù)處理,解析SDSM描述文件;對(duì)被測(cè)程序進(jìn)行詞法分析和語(yǔ)法分析,構(gòu)造出抽象語(yǔ)法樹(shù);根據(jù)抽象語(yǔ)法樹(shù),生成控制流圖和符號(hào)表,并根據(jù)控制流圖和符號(hào)表,進(jìn)行變量取值區(qū)間集的計(jì)算與更新;對(duì)被測(cè)程序進(jìn)行函數(shù)調(diào)用關(guān)系分析,生成函數(shù)調(diào)用關(guān)系圖;根據(jù)函數(shù)調(diào)用關(guān)系圖以函數(shù)為單位對(duì)控制流圖進(jìn)行遍歷,并計(jì)算控制流圖上每個(gè)節(jié)點(diǎn)缺陷狀態(tài)機(jī)的狀態(tài)變遷,缺陷狀態(tài)機(jī)進(jìn)入缺陷狀態(tài)時(shí)報(bào)告對(duì)應(yīng)的檢查點(diǎn)。本發(fā)明還公開(kāi)了一種基于軟件缺陷模式的測(cè)試系統(tǒng),包括輸入模塊,缺陷模式統(tǒng)一測(cè)試框架,和用戶(hù)界面模塊,完成對(duì)被測(cè)程序的統(tǒng)一測(cè)試。文檔編號(hào)G06F11/36GK101286132SQ20081011426公開(kāi)日2008年10月15日申請(qǐng)日期2008年6月2日優(yōu)先權(quán)日2008年6月2日發(fā)明者宮云戰(zhàn),楊朝紅,王雅文,慶肖,陳俊亮申請(qǐng)人:北京郵電大學(xué)