專(zhuān)利名稱:基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件測(cè)試技術(shù),尤其涉及一種基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)(DTS,Defect Testing System)的復(fù)雜性分析方法,以發(fā)現(xiàn)該缺陷檢測(cè)系統(tǒng)的性能瓶頸, 對(duì)提高缺陷檢測(cè)效率及并發(fā)執(zhí)行多個(gè)測(cè)試任務(wù)提供理論依據(jù)。
背景技術(shù):
靜態(tài)的程序分析技術(shù)通過(guò)對(duì)源代碼進(jìn)行分析,毋須動(dòng)態(tài)執(zhí)行程序即可得到程序的語(yǔ)義信息。完備的程序分析技術(shù)通過(guò)對(duì)程序語(yǔ)義的抽象(over-approximation),可以應(yīng)用于缺陷查找、類(lèi)型檢查、編譯優(yōu)化等的過(guò)程。但對(duì)程序語(yǔ)義的抽象帶來(lái)的負(fù)面影響則是增大了計(jì)算量,導(dǎo)致分析效率下降。基于區(qū)間運(yùn)算的缺陷檢測(cè)系統(tǒng)是抽象解釋理論的一種典型應(yīng)用,它通過(guò)將源程序構(gòu)建為語(yǔ)法樹(shù)(AST),然后訪問(wèn)AST節(jié)點(diǎn)生成符號(hào)表信息,從而得到變量及函數(shù)的作用域、 類(lèi)型信息。進(jìn)一步地,再通過(guò)遍歷函數(shù)控制流圖,對(duì)每個(gè)控制流節(jié)點(diǎn)進(jìn)行數(shù)據(jù)流迭代,得到每個(gè)函數(shù)的抽象取值信息(以離散的區(qū)間域來(lái)表示);根據(jù)此抽象取值信息可以進(jìn)行缺陷狀態(tài)機(jī)迭代,如果有錯(cuò)誤(error)狀態(tài)發(fā)生,則表示程序中存在某種類(lèi)型的缺陷。通過(guò)上述對(duì)靜態(tài)缺陷檢測(cè)系統(tǒng)的功能描述不難發(fā)現(xiàn),其中的某些步驟復(fù)雜度較高,有可以成為影響軟件性能的瓶頸;而某些步驟與上下文分析環(huán)境(Context)依賴性不大的,則可通過(guò)采用改進(jìn)的分析技術(shù)來(lái)提高分析效率。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的主要目的在于提供一種基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法,通過(guò)對(duì)每個(gè)分析子模塊的內(nèi)部分析單元的復(fù)雜性進(jìn)行分析,統(tǒng)計(jì)得出DTS的復(fù)雜性分布情況,克服現(xiàn)有復(fù)雜性分析評(píng)估方法不夠系統(tǒng)全面、對(duì)影響系統(tǒng)復(fù)雜性的關(guān)鍵技術(shù)分析不足等缺點(diǎn),以檢出和解決DTS性能瓶頸以及優(yōu)化分布式(并行化)缺陷檢測(cè)任務(wù)。為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的
一種基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法,該分析方法包括
A、根據(jù)所述缺陷檢測(cè)系統(tǒng)DTS缺陷檢測(cè)原理,將該分析方法的流程包括由前端輸入預(yù)處理模塊完成的前端輸入預(yù)處理步驟、由預(yù)分析模塊完成預(yù)分析的步驟、由正式分析模塊完成正式分析的步驟;
B、對(duì)所述的前端輸入預(yù)處理模塊、預(yù)分析模塊和正式分析模塊的內(nèi)部所有分析單元, 按其調(diào)用順序及依賴關(guān)系依次分析其復(fù)雜度,得到每個(gè)分析單元復(fù)雜性分布的性質(zhì)和規(guī)律;
C、根據(jù)步驟B的分析結(jié)果,統(tǒng)計(jì)得出整個(gè)DTS系統(tǒng)的復(fù)雜性分布情況。其中,將步驟B所述前端輸入預(yù)處理模塊、預(yù)分析模塊和正式分析模塊分別進(jìn)一步分為將所述前端輸入預(yù)處理模塊分為載入缺陷狀態(tài)機(jī)單元、源文件收集單元和程序轉(zhuǎn)換單元;
將所述預(yù)分析模塊分為全局函數(shù)調(diào)用關(guān)系生成單元和文件分析次序解析單元;以及將正式分析模塊分為線程分析單元和缺陷檢測(cè)結(jié)果輸出單元。其中,步驟C所述得出整個(gè)DTS系統(tǒng)的復(fù)雜性分布情況的過(guò)程,包括對(duì)前端預(yù)輸入處理模塊的分析單元進(jìn)行復(fù)雜度分析,具體如下
Cl、將待測(cè)試的程序源文件載入缺陷狀態(tài)機(jī)單元,根據(jù)預(yù)先配置的待掃描缺陷狀態(tài)機(jī)類(lèi)型,讀入對(duì)應(yīng)的狀態(tài)機(jī)描述XML文件;復(fù)雜度取決于待掃描缺陷狀態(tài)機(jī)種類(lèi)數(shù) Num (fsm);
C2、收集待進(jìn)行缺陷檢測(cè)的源文件,如果以工程為單位進(jìn)行檢測(cè),則根據(jù)工程配置文件搜索待分析源文件;否則,直接搜索待掃描目錄,收集所有待檢測(cè)源文件;復(fù)雜度取決于待分析源文件數(shù)量Num(srcFiles);
C3、根據(jù)待測(cè)源文件的類(lèi)型執(zhí)行程序轉(zhuǎn)換,具體為通過(guò)程序轉(zhuǎn)換單元,根據(jù)待檢測(cè)源文件類(lèi)型,調(diào)用相應(yīng)的編譯器進(jìn)行預(yù)處理,得到預(yù)處理后的中間文件,作為后續(xù)分析的輸入;
如果是JAVA語(yǔ)言,需要調(diào)用JVM將源文件(.Java)編譯為字節(jié)碼文件(.class);其復(fù)雜度取決于JVM的編譯器效率;
如果是C或CPP語(yǔ)言,需要調(diào)用相應(yīng)的編譯器(gcc,cl)將源文件(.c,.cpp)預(yù)處理為中間文件(.i);其復(fù)雜度取決于編譯器的效率;
最后,將該類(lèi)不可控分析單元的復(fù)雜度標(biāo)記為0(⑴)。步驟C所述得出整個(gè)DTS系統(tǒng)的復(fù)雜性分布情況的過(guò)程,對(duì)預(yù)分析模塊的分析單元進(jìn)行復(fù)雜度分析,具體如下
C4、通過(guò)全局函數(shù)調(diào)用關(guān)系生成單元,首先進(jìn)行預(yù)分析,生成全局函數(shù)調(diào)用關(guān)系,然后按字母順序遍歷所有源文件,查找所有需要分析的函數(shù)并建立全局函數(shù)表,保存函數(shù)間調(diào)用關(guān)系;同時(shí),還能夠根據(jù)需要生成庫(kù)函數(shù)摘要;
C5、利用文件分析次序解析單元,根據(jù)所述全局函數(shù)表及調(diào)用關(guān)系,對(duì)文件調(diào)用關(guān)系進(jìn)行拓?fù)渑判颍罱K的文件分析次序?yàn)橥負(fù)渑判虻哪嫘?;該分析單元的?fù)雜度取決于全局函數(shù)表中的函數(shù)個(gè)數(shù)Num(Proc)及每個(gè)函數(shù)調(diào)用其他函數(shù)的平均次數(shù)NumQ^ocCall),得出該分析單元的復(fù)雜度Num(Proc) *Num(ProcCal 1)。步驟C所述得出整個(gè)DTS系統(tǒng)的復(fù)雜性分布情況的過(guò)程,對(duì)正式分析模塊的分析單元進(jìn)行復(fù)雜度分析,具體如下
C6、利用線程分析單元,根據(jù)上述步驟C5中得到的文件分析次序,為每個(gè)文件依次生成分析線程,同時(shí)檢測(cè)線程執(zhí)行過(guò)程中是否出現(xiàn)異常以便及時(shí)結(jié)束線程;
C7、通過(guò)缺陷檢測(cè)結(jié)果輸出單元,將所述步驟C6的輸出檢測(cè)結(jié)果寫(xiě)入數(shù)據(jù)庫(kù)中;其復(fù)雜度取決于待分析文件數(shù)Num(srCFiles)及每個(gè)文件的平均缺陷數(shù)Num(IP),復(fù)雜度依賴于 Num(srcFiles) *Num(IP)。根據(jù)全局函數(shù)調(diào)用關(guān)系生成單元的原理,將所述步驟C4分為五個(gè)子分析單元,然后對(duì)每個(gè)子單元的復(fù)雜度分析,具體包括
C41、語(yǔ)法樹(shù)生成包括詞法分析及語(yǔ)法分析兩個(gè)階段詞法分析復(fù)雜度取決于源文件的平均行數(shù)NunKsrcFileLines),語(yǔ)法分析的復(fù)雜度取決于源文件的語(yǔ)法復(fù)雜程度,均為不可控的;其語(yǔ)法樹(shù)生成單元的復(fù)雜度為NunKsrcFileLines);
C42、作用域和聲明分析單元為單個(gè)文件生成SourceFil必cope, ClassScope, MethodScope及LocalScope作用域?qū)哟侮P(guān)系,及每個(gè)作用域下的變量聲明集合 VariableNamesDeclarations 禾口函數(shù)聲明集合 MethodNameDeclarations,并且為每個(gè)變量及函數(shù)創(chuàng)建類(lèi)型信息;其復(fù)雜度主要依賴于語(yǔ)法樹(shù)中相關(guān)節(jié)點(diǎn)的數(shù)量,若其與文件行數(shù)成正比,則本分析單元復(fù)雜度為Num(srcFiIeLines);
C43、表達(dá)式類(lèi)型分析單元為程序中的各種表達(dá)式生成類(lèi)型信息,為后續(xù)的區(qū)間分析及缺陷模式計(jì)算提供類(lèi)型支持;本分析單元的復(fù)雜度也依賴于語(yǔ)法樹(shù)中相關(guān)節(jié)點(diǎn)的數(shù)量,若其與文件行數(shù)成正比,則本分析單元復(fù)雜度為NunKsrcFileLines);
C44、標(biāo)志符出現(xiàn)分析單元將所有標(biāo)識(shí)符的出現(xiàn)與其正確的聲明相關(guān)聯(lián),并且將這種關(guān)聯(lián)關(guān)系添加到具體的作用域中,以方便后續(xù)的文件內(nèi)函數(shù)調(diào)用關(guān)系生成;標(biāo)識(shí)符的出現(xiàn)分為變量使用和函數(shù)調(diào)用,本分析單元的復(fù)雜度取決于程序中變量和函數(shù)的聲明及使用數(shù)量 Num(Var)+Num(Proc);
C45、函數(shù)調(diào)用關(guān)系分析單元遍歷程序中所有函數(shù)定義節(jié)點(diǎn) (ASTFimctionDefinition),查找該函數(shù)作用域中的所有函數(shù)調(diào)用,為當(dāng)前函數(shù)定義節(jié)點(diǎn)生成“一對(duì)多”的調(diào)用關(guān)系,隨著遍歷的進(jìn)行生成函數(shù)調(diào)用關(guān)系圖;本分析單元復(fù)雜度主要依賴于每個(gè)文件中函數(shù)平均個(gè)數(shù)Num(ftx)C),及每個(gè)函數(shù)調(diào)用其他函數(shù)的平均個(gè)數(shù) Num(ProcCall),其復(fù)雜度為 Num(Proc) * Num(ProcCall);
所述的全局函數(shù)調(diào)用關(guān)系生成單元,其復(fù)雜度為Num(srcFiles)* (Num(srcFileLines) + Num(Var) + Num(Proc))。 根據(jù)線程分析單元的檢測(cè)原理,將所述步驟C6進(jìn)一步分為十個(gè)子分析單元,對(duì)每個(gè)子單元的復(fù)雜度分析步驟為
C61 C64、其復(fù)雜度分析過(guò)程與C41 C44的類(lèi)似;
C65、利用控制流圖生成單元遍歷語(yǔ)法樹(shù)相關(guān)節(jié)點(diǎn),分別生成控制流圖節(jié)點(diǎn)和邊; 所述控制流圖中節(jié)點(diǎn)與邊的數(shù)量為等數(shù)量級(jí)的,且節(jié)點(diǎn)數(shù)主要取決于源代碼行數(shù);本分析單元的復(fù)雜度主要依賴于語(yǔ)法樹(shù)中相關(guān)節(jié)點(diǎn)的數(shù)量及程序代碼行數(shù),復(fù)雜度為 Num (srcFiIeLines);
C66、定義使用分析單元為變量的聲明及使用位置生成關(guān)聯(lián)關(guān)系,能夠?yàn)橄嚓P(guān)模式提供數(shù)據(jù)依賴分析的支持;首先根據(jù)步驟C62 C64的分析結(jié)果,按作用域?qū)哟侮P(guān)系依次初始化每個(gè)變量出現(xiàn)的定義或使用信息,并將此初始化定義使用信息綁定到對(duì)應(yīng)的控制流節(jié)點(diǎn), 然后基于步驟C65生成的控制流圖,進(jìn)行流敏感的定義使用信息迭代;定義使用信息迭代的復(fù)雜度取決于控制流節(jié)點(diǎn)數(shù)及每次迭代的復(fù)雜度,迭代復(fù)雜度取決于每個(gè)控制流節(jié)點(diǎn)上變量出現(xiàn)的個(gè)數(shù)(與程序中變量總數(shù)成正比);本分析單元的復(fù)雜度為NunKsrcFileLines)* Num(Var);
C67、文件內(nèi)函數(shù)調(diào)用關(guān)系生成單元的分析原理與步驟C66類(lèi)似,也是通過(guò)作用域?qū)哟侮P(guān)系得到文件內(nèi)的函數(shù)調(diào)用關(guān)系,并創(chuàng)建函數(shù)調(diào)用關(guān)系圖;其復(fù)雜度取決于Num(Proc);
C68、解析函數(shù)分析次序單元與步驟C45類(lèi)似;其復(fù)雜度取決于函數(shù)及函數(shù)調(diào)用的個(gè)數(shù) Num (Proc);C69、區(qū)間分析單元以函數(shù)為單位(Num(Proc)),依次遍歷控制流圖進(jìn)行數(shù)據(jù)流方程迭代在控制流入口節(jié)點(diǎn)將所有外部區(qū)間信息初始化,后續(xù)節(jié)點(diǎn)首先對(duì)前驅(qū)節(jié)點(diǎn)的數(shù)據(jù)流信息進(jìn)行繼承或匯聚,然后根據(jù)當(dāng)前節(jié)點(diǎn)關(guān)聯(lián)語(yǔ)法樹(shù)節(jié)點(diǎn)的類(lèi)型進(jìn)行區(qū)間運(yùn)算;若平均每個(gè)函數(shù)的控制流節(jié)點(diǎn)數(shù)為Num(VexNode),每個(gè)節(jié)點(diǎn)區(qū)間運(yùn)算的復(fù)雜度為O (IntervalAnalysis),則對(duì)單個(gè)函數(shù)進(jìn)行區(qū)間分析的復(fù)雜度為O(Num(VexNode)* IntervalAnalysis);在控制流出口節(jié)點(diǎn),根據(jù)配置是否進(jìn)行函數(shù)間分析,為當(dāng)前函數(shù)計(jì)算其函數(shù)摘要,包括后置條件與前置約束,后置條件需要計(jì)算所有return語(yǔ)句的區(qū)間信息并取并集,其復(fù)雜度決定于Num(VexNode),前置條件需要查詢AST上某種類(lèi)型的節(jié)點(diǎn),復(fù)雜度與Num(ASTNode)有關(guān);得到該區(qū)間分析單元的總復(fù)雜度為=Num(Proc) * (Num(srcFiIeLines)* IntervalAnalysis);
C70、缺陷自動(dòng)機(jī)分析單元根據(jù)步驟A載入的狀態(tài)機(jī)類(lèi)型,根據(jù)每種類(lèi)型狀態(tài)機(jī)的創(chuàng)建條件生成狀態(tài)機(jī)實(shí)例集合如果是非流敏感的狀態(tài)機(jī)實(shí)例,則直接在語(yǔ)法樹(shù)上進(jìn)行狀態(tài)迭代,檢測(cè)該類(lèi)型的缺陷;將所有流敏感的狀態(tài)機(jī)實(shí)例集合置于函數(shù)控制流入口節(jié)點(diǎn)處, 然后根據(jù)控制流順序?qū)γ總€(gè)狀態(tài)機(jī)實(shí)例的缺陷狀態(tài)進(jìn)行狀態(tài)條件更新,如果發(fā)生狀態(tài)遷移且為error狀態(tài)則上報(bào)一個(gè)相應(yīng)類(lèi)型的缺陷,否則狀態(tài)自動(dòng)遷移到end狀態(tài)表示自動(dòng)機(jī)將自動(dòng)銷(xiāo)毀;如果為路徑敏感的缺陷狀態(tài)迭代方法,則狀態(tài)條件需要重新通過(guò)區(qū)間運(yùn)算計(jì)算生成(OantervalAnalysis));每個(gè)函數(shù)創(chuàng)建的狀態(tài)機(jī)實(shí)例數(shù)為Num(FSiOnstances), 每個(gè)控制流節(jié)點(diǎn)關(guān)聯(lián)的缺陷狀態(tài)實(shí)例數(shù)為與其成正比,每個(gè)狀態(tài)條件遷移與否的計(jì)算量為O (FSMTransition),則路徑敏感的缺陷自動(dòng)機(jī)分析復(fù)雜度為Num (Proc) * (Num(FSMInstances) * O(FSMTransition) * O(IntervalAnalysis) )) ; 陷自動(dòng)機(jī)分析復(fù)雜度為 Num(Proc) * (Num(FSMInstances) * O(FSMTransition))); 得到所述正式分析模塊的復(fù)雜度為Num(srcFiles) * (Num(srcFiIeLines) * Num(Var) +Num(Proc)*Num(srcFiIeLines)(IntervalAnalysis)0所述的缺陷檢測(cè)系統(tǒng)的總復(fù)雜度為Num(fsm) +Num(srcFiles) * (Num(srcFiles) * (Num(srcFileLines)氺Num(Var)+Num(Proc)*Num(srcFileLines))。所述的缺陷檢測(cè)系統(tǒng)具有多項(xiàng)式復(fù)雜度,影響其分析效率的因子,主要包括 Num(fsm), O(IntervalAnalysis)和O (FSMTransition),且部分影響因子是待測(cè)程序的復(fù)雜度,如 Num(Proc),Num(ProcCall), Num(Var)決定的。所述缺陷檢測(cè)系統(tǒng)中的各模塊及分析單元的復(fù)雜性較高且可并發(fā)執(zhí)行;將每個(gè)文件的語(yǔ)法樹(shù)、符號(hào)表等信息進(jìn)行緩存,當(dāng)后續(xù)分析需要時(shí)直接獲取,能夠進(jìn)一步降低該分析過(guò)程的復(fù)雜度。本發(fā)明所提供的基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法,具有以下優(yōu)點(diǎn)
采用該分析方法,通過(guò)對(duì)靜態(tài)缺陷檢測(cè)系統(tǒng)進(jìn)行模塊分解,并對(duì)每個(gè)模塊及其子分析單元進(jìn)行全面、系統(tǒng)的復(fù)雜度分析,尤其對(duì)影響DTS復(fù)雜性的關(guān)鍵技術(shù)如數(shù)據(jù)流迭代框架、 區(qū)間運(yùn)算、缺陷狀態(tài)自動(dòng)機(jī)迭代進(jìn)行了分析,分析得出的復(fù)雜度較高的單元意味著系統(tǒng)性能瓶頸,并對(duì)分析算法中無(wú)依賴關(guān)系的模塊可以通過(guò)并行分析技術(shù)進(jìn)行優(yōu)化??朔爽F(xiàn)有復(fù)雜性分析評(píng)估方法不夠系統(tǒng)全面、對(duì)影響系統(tǒng)復(fù)雜性的關(guān)鍵技術(shù)分析不足等缺點(diǎn),還為發(fā)現(xiàn)并解決DTS性能瓶頸、優(yōu)化分布式(并行化)缺陷檢測(cè)任務(wù)提供了可行的技術(shù)路線。
圖1為本發(fā)明基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析流程及模塊分解過(guò)程示意圖2為本發(fā)明所述全局函數(shù)調(diào)用關(guān)系生成單元的子分析單元執(zhí)行分解過(guò)程示意圖; 圖3為本發(fā)明所述線程分析單元的子分析單元分解過(guò)程示意圖。
具體實(shí)施例方式下面結(jié)合附圖及本發(fā)明的實(shí)施例對(duì)本發(fā)明的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法作進(jìn)一步詳細(xì)的說(shuō)明。本發(fā)明基于模塊分解技術(shù)的缺陷檢測(cè)系統(tǒng)(DTS)的復(fù)雜性分析方法,包括 步驟一,根據(jù)軟件DTS的缺陷檢測(cè)原理,可將其分析流程利用抽象為邏輯上彼此獨(dú)
立的三個(gè)模塊(Module)(即前端輸入預(yù)處理模塊(Input Preprocessor )、預(yù)分析模塊 (Pre-Analysis)和正式分析模塊(Formal Analysis))來(lái)完成,即由前端輸入預(yù)處理模塊 (Input Pr印rocessor)完成前端輸入預(yù)處理步驟、由預(yù)分析模塊(Pre-Analysis)完成預(yù)分析的步驟、由正式分析模塊(Formal Analysis)完成正式分析的步驟。步驟二,對(duì)所述的每個(gè)模塊的內(nèi)部所有分析單元(Unit)的調(diào)用順序及依賴關(guān)系依次分析其復(fù)雜度,得到每個(gè)分析單元復(fù)雜性分布的性質(zhì)和規(guī)律。步驟三,根據(jù)上述步驟二的分析結(jié)果,進(jìn)一步統(tǒng)計(jì)得出整個(gè)缺陷檢測(cè)系統(tǒng)的復(fù)雜性分布情況。將所述各模塊進(jìn)一步分為如下分析單元(Unit),具體如下
將所述輸入預(yù)處理模塊分為載入缺陷狀態(tài)機(jī)單元、源文件收集單元和程序轉(zhuǎn)換單
元;
將所述預(yù)分析模塊分為全局函數(shù)調(diào)用關(guān)系生成單元和文件分析次序解析單元; 將所述正式分析模塊分為線程分析單元和缺陷檢測(cè)結(jié)果輸出單元。圖1為本發(fā)明基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析流程及模塊分解過(guò)程示意1、對(duì)前端預(yù)輸入處理模塊的分析單元進(jìn)行復(fù)雜度分析,具體包括 步驟11、將待測(cè)試的程序源文件載入缺陷狀態(tài)機(jī)單元,根據(jù)預(yù)先配置的待掃描缺陷狀態(tài)機(jī)類(lèi)型,讀入對(duì)應(yīng)的狀態(tài)機(jī)描述XML文件;復(fù)雜度取決于待掃描缺陷狀態(tài)機(jī)種類(lèi)數(shù) Num (fsm);
步驟12、收集待進(jìn)行缺陷檢測(cè)的源文件,如果以工程為單位進(jìn)行檢測(cè),則根據(jù)工程配置文件搜索待分析源文件;否則,直接搜索待掃描目錄,收集所有待檢測(cè)源文件;復(fù)雜度取決于待分析源文件數(shù)量Num(srcFiIes);
步驟13、根據(jù)待測(cè)源文件的類(lèi)型執(zhí)行程序轉(zhuǎn)換,具體為
通過(guò)程序轉(zhuǎn)換單元,根據(jù)待檢測(cè)源文件類(lèi)型,調(diào)用相應(yīng)的編譯器進(jìn)行預(yù)處理,得到預(yù)處理后的中間文件,作為后續(xù)分析的輸入;如果是JAVA語(yǔ)言,需要調(diào)用JVM (Java虛擬機(jī))將源文件(.java)編譯為字節(jié)碼文件(.class);其復(fù)雜度取決于JVM的編譯器效率。如果是 C或CPP語(yǔ)言,需要調(diào)用相應(yīng)的編譯器(gcc,cl)將源文件(.c,.cpp)預(yù)處理為中間文件(.i),其復(fù)雜度取決于編譯器的效率。因此,本分析單元的復(fù)雜度是不可控的,本發(fā)明中將此類(lèi)不可控分析單元的復(fù)雜度標(biāo)記為0(⑴),并且此類(lèi)復(fù)雜度不計(jì)入最終的復(fù)雜度統(tǒng)計(jì)結(jié)
果ο2、對(duì)預(yù)分析模塊的分析單元進(jìn)行復(fù)雜度分析的過(guò)程,包括步驟14 步驟15 具體如下
步驟14、通過(guò)全局函數(shù)調(diào)用關(guān)系生成單元,首先進(jìn)行預(yù)分析,生成全局函數(shù)調(diào)用關(guān)系, 然后按字母順序遍歷所有源文件,查找所有需要分析的函數(shù)(用戶自定義函數(shù))并建立全局函數(shù)表,保存函數(shù)間調(diào)用關(guān)系。同時(shí),還可根據(jù)需要生成庫(kù)函數(shù)摘要。步驟15、利用文件分析次序解析單元,根據(jù)所述全局函數(shù)表及調(diào)用關(guān)系,對(duì)文件調(diào)用關(guān)系進(jìn)行拓?fù)渑判?,最終的文件分析次序?yàn)橥負(fù)渑判虻哪嫘颍辉摲治鰡卧膹?fù)雜度取決于全局函數(shù)表中的函數(shù)個(gè)數(shù)Num(Proc)及每個(gè)函數(shù)調(diào)用其他函數(shù)的平均次數(shù) Num(ProcCall),因此本分析單元的復(fù)雜度取決于二者之積Num(Proc) *Num(ProcCall)。3、對(duì)正式分析模塊的分析單元進(jìn)行復(fù)雜度分析的過(guò)程,包括步驟16 步驟17 具體如下
步驟16、利用線程分析單元,根據(jù)上述步驟15中得到的文件分析次序,為每個(gè)文件依次生成分析線程,同時(shí)監(jiān)測(cè)線程執(zhí)行過(guò)程中是否出現(xiàn)異常(如分析超時(shí),內(nèi)存溢出等)以便及時(shí)結(jié)束線程。步驟17、最后,再通過(guò)缺陷檢測(cè)結(jié)果輸出單元,將所述步驟16的輸出檢測(cè)結(jié)果,并將其寫(xiě)入數(shù)據(jù)庫(kù)中。其復(fù)雜度取決于待分析文件數(shù)NunKsrcFiles)及每個(gè)文件的平均缺陷數(shù) Num(IP),因此復(fù)雜度依賴于 Num(srcFiles)*Num(IP)。圖2為本發(fā)明所述全局函數(shù)調(diào)用關(guān)系生成單元(預(yù)分析模塊)的子分析單元執(zhí)行分解過(guò)程示意圖,如圖2所示,步驟14中5個(gè)子分析單元的每個(gè)子單元的復(fù)雜度分析過(guò)程,包括
步驟141、語(yǔ)法樹(shù)生成包括詞法分析及語(yǔ)法分析兩個(gè)階段詞法分析的復(fù)雜度取決于源文件的平均行數(shù)NunKsrcFileLines),語(yǔ)法分析的復(fù)雜度取決于源文件的語(yǔ)法復(fù)雜程度, 均為不可控的。因此,其語(yǔ)法樹(shù)生成單元的復(fù)雜度為NunKsrcFileLines)。步驟142、作用域和聲明分析單元為單個(gè)文件生成SourceFil必cope, ClassScope, MethodScope及LocalScope作用域?qū)哟侮P(guān)系,及每個(gè)作用域下的變量聲明集合 VariableNamesDeclarations 禾口函數(shù)聲明(定義)集合 MethodNameDeclarations,并且為每個(gè)變量及函數(shù)創(chuàng)建類(lèi)型信息。由于本步驟所生成的信息是遍歷語(yǔ)法樹(shù)的相關(guān)節(jié)點(diǎn)(變量聲明為ASTDeclaraion節(jié)點(diǎn),函數(shù)聲明為ASTFunctionDeclaration節(jié)點(diǎn))得到的,因此復(fù)雜性主要依賴于語(yǔ)法樹(shù)中相關(guān)節(jié)點(diǎn)的數(shù)量。假定其與文件行數(shù)成正比,則本分析單元復(fù)雜度為 Num(srcFiIeLines)。步驟143、表達(dá)式類(lèi)型分析單元為程序中的各種表達(dá)式生成類(lèi)型信息,為后續(xù)的區(qū)間分析(生成該表達(dá)式運(yùn)算后的區(qū)間類(lèi)型)及缺陷模式計(jì)算(確定某表達(dá)式的類(lèi)型是否允許某種操作,如移位,與O比較等)提供類(lèi)型支持。與步驟142類(lèi)似,本分析單元的復(fù)雜度也依賴于語(yǔ)法樹(shù)中相關(guān)節(jié)點(diǎn)的數(shù)量,因此復(fù)雜度為NunKsrcFileLines)。步驟144、標(biāo)志符出現(xiàn)分析單元將所有標(biāo)識(shí)符的出現(xiàn)與其正確的聲明相關(guān)聯(lián),并且將這種關(guān)聯(lián)關(guān)系添加到具體的作用域中,以方便后續(xù)的文件內(nèi)函數(shù)調(diào)用關(guān)系生成;標(biāo)識(shí)符的出現(xiàn)分為變量使用和函數(shù)調(diào)用,因此本分析單元的復(fù)雜度取決于程序中變量和函數(shù)的聲明及使用數(shù)量 Num (Var) +Num (Proc)。步驟145、函數(shù)調(diào)用關(guān)系分析單元遍歷程序中所有函數(shù)定義節(jié)點(diǎn) (ASTFimctionDefinition),查找該函數(shù)作用域中的所有函數(shù)調(diào)用(出現(xiàn)),為當(dāng)前函數(shù)定義節(jié)點(diǎn)生成“一對(duì)多”的調(diào)用關(guān)系,隨著遍歷的進(jìn)行便生成了函數(shù)調(diào)用關(guān)系圖。該分析單元的復(fù)雜度主要依賴于每個(gè)文件中函數(shù)平均個(gè)數(shù)Num(ftx)C),及每個(gè)函數(shù)調(diào)用其他函數(shù)的平均個(gè)數(shù) Num(ProcCall),因此復(fù)雜度為 Num(Proc) * Num(ProcCall)。故,步驟14中所述的全局函數(shù)調(diào)用關(guān)系生成單元其復(fù)雜度為Num(SrcFileS)* (Num(srcFileLines)+ Num(Var) + Num(Proc))。圖3為本發(fā)明所述線程分析單元(正式分析模塊)的子分析單元分解過(guò)程示意圖, 根據(jù)線程分析單元的檢測(cè)原理,該線程分析單元(正式分析模塊)又分為10個(gè)子分析單元, 每個(gè)子單元的復(fù)雜度分析過(guò)程,分別為
步驟16廣步驟164的復(fù)雜度分析與步驟14中步驟141 步驟144子分析單元的分析方法類(lèi)似,這里不再贅述。步驟165、利用控制流圖生成單元遍歷語(yǔ)法樹(shù)相關(guān)節(jié)點(diǎn),分別生成控制流圖節(jié)點(diǎn)和邊;控制流圖中節(jié)點(diǎn)與邊的數(shù)量是等數(shù)量級(jí)的(邊e與節(jié)點(diǎn)η的關(guān)系為e=n-l),且節(jié)點(diǎn)數(shù)主要取決于源代碼行數(shù)(除while,if, try-catch外,其他語(yǔ)句基本上與節(jié)點(diǎn)為1:1關(guān)系)。 因此本分析單元的復(fù)雜度主要依賴于語(yǔ)法樹(shù)中相關(guān)節(jié)點(diǎn)的數(shù)量及程序代碼行數(shù)(仍然假設(shè)二者是正比關(guān)系),則復(fù)雜度為NunKsrcFileLines)。步驟166、定義使用分析單元為變量的聲明及使用位置生成關(guān)聯(lián)關(guān)系,可以為相關(guān)模式提供數(shù)據(jù)依賴分析的支持(如變量使用前有多次定義的缺陷模式);首先根據(jù)步驟 162 步驟164的分析結(jié)果,按作用域?qū)哟侮P(guān)系依次初始化每個(gè)變量出現(xiàn)的定義或使用信息,并將此初始化定義使用信息綁定到對(duì)應(yīng)的控制流節(jié)點(diǎn),然后基于步驟165生成的控制流圖,進(jìn)行流敏感的定義使用信息迭代;定義使用信息迭代的復(fù)雜度取決于控制流節(jié)點(diǎn)數(shù)及每次迭代的復(fù)雜度,迭代復(fù)雜度取決于每個(gè)控制流節(jié)點(diǎn)上變量出現(xiàn)的個(gè)數(shù)(與程序中變量總數(shù)成正比),因此本分析單元的復(fù)雜度為Num(srcFiIeLines)* Num(Var)。步驟167、文件內(nèi)函數(shù)調(diào)用關(guān)系生成單元的分析原理與步驟166類(lèi)似,也是通過(guò)作用域?qū)哟侮P(guān)系得到文件內(nèi)的函數(shù)調(diào)用關(guān)系,并創(chuàng)建函數(shù)調(diào)用關(guān)系圖,因此復(fù)雜度取決于 Num(Proc)。步驟168、解析函數(shù)分析次序單元與步驟145類(lèi)似,復(fù)雜度取決于函數(shù)及函數(shù)調(diào)用的個(gè)數(shù) Num (Proc)。步驟169、區(qū)間分析單元以函數(shù)為單位(Num(Proc)),依次遍歷控制流圖進(jìn)行數(shù)據(jù)流方程迭代在控制流入口節(jié)點(diǎn)將所有外部區(qū)間信息初始化(參數(shù),全局變量),后續(xù)節(jié)點(diǎn)首先對(duì)前驅(qū)節(jié)點(diǎn)的數(shù)據(jù)流信息進(jìn)行繼承(順序節(jié)點(diǎn))或匯聚(分支合并節(jié)點(diǎn)),然后根據(jù)當(dāng)前節(jié)點(diǎn)關(guān)聯(lián)語(yǔ)法樹(shù)節(jié)點(diǎn)的類(lèi)型進(jìn)行區(qū)間運(yùn)算(新數(shù)據(jù)流生成Gen及舊數(shù)據(jù)流更新Update或刪除 Kill)。假設(shè)平均每個(gè)函數(shù)的控制流節(jié)點(diǎn)數(shù)為Num(VexNode),每個(gè)節(jié)點(diǎn)區(qū)間運(yùn)算的復(fù)雜度為0 antervalAnalysis),則對(duì)單個(gè)函數(shù)進(jìn)行區(qū)間分析的復(fù)雜度為0(Num(VexNode)* IntervalAnalysis) 0在控制流出口節(jié)點(diǎn),根據(jù)配置是否進(jìn)行函數(shù)間分析,為當(dāng)前函數(shù)計(jì)算其函數(shù)摘要,包括后置條件(生成返回值區(qū)間信息,及對(duì)全局變量的數(shù)據(jù)流影響)與前置約束(根據(jù)步驟11中載入的狀態(tài)機(jī)類(lèi)型,創(chuàng)建調(diào)用當(dāng)前函數(shù)時(shí)的前置約束),后置條件需要計(jì)算所有return語(yǔ)句的區(qū)間信息并取并集,復(fù)雜度決定于Num(VexNode),前置條件一般來(lái)說(shuō)需要查詢AST上某種類(lèi)型的節(jié)點(diǎn),復(fù)雜度與Num(ASTNode)有關(guān)。因此,區(qū)間分析單元的總復(fù)雜度為:Num(Proc) * (Num(srcFiIeLines) * IntervalAnalysis)。步驟170、缺陷自動(dòng)機(jī)分析單元根據(jù)步驟11中載入的狀態(tài)機(jī)類(lèi)型(分為文件作用域與函數(shù)作用域,或者流敏感與非流敏感),根據(jù)每種類(lèi)型狀態(tài)機(jī)的創(chuàng)建條件生成狀態(tài)機(jī)實(shí)例集合如果是非流敏感的狀態(tài)機(jī)實(shí)例,則直接在語(yǔ)法樹(shù)上進(jìn)行狀態(tài)迭代,檢測(cè)該類(lèi)型的缺陷;將所有流敏感的狀態(tài)機(jī)實(shí)例集合置于函數(shù)控制流入口節(jié)點(diǎn)處,然后根據(jù)控制流順序?qū)γ總€(gè)狀態(tài)機(jī)實(shí)例的缺陷狀態(tài)進(jìn)行狀態(tài)條件更新,如果發(fā)生狀態(tài)遷移且為錯(cuò)誤(error)狀態(tài), 則上報(bào)一個(gè)相應(yīng)類(lèi)型的缺陷,否則狀態(tài)自動(dòng)遷移到結(jié)束(end)狀態(tài),表示自動(dòng)機(jī)將自動(dòng)銷(xiāo)毀。特殊情況下,如果為路徑敏感的缺陷狀態(tài)迭代方法,則狀態(tài)條件需要重新通過(guò)區(qū)間運(yùn)算計(jì)算生成(OantervalAnalysis))。每個(gè)函數(shù)創(chuàng)建的狀態(tài)機(jī)實(shí)例數(shù)為 Num(FSMhstances),每個(gè)控制流節(jié)點(diǎn)關(guān)聯(lián)的缺陷狀態(tài)實(shí)例數(shù)為與其成正比,每個(gè)狀態(tài)條件遷移與否的計(jì)算量為O(FSMTransiti0n),則路徑敏感的缺陷自動(dòng)機(jī)分析復(fù)雜度為 Num(Proc) * (Num(FSMInstances) * O(FSMTransition) * O(IntervalAnalysis) )),非路徑敏感的缺陷自動(dòng)機(jī)分析復(fù)雜度為Num (Proc) * (Num (FSMInstances) * O(FSMTransition)))。因此,步驟F正式分析模塊的總復(fù)雜度為
Num(srcFiles) *(Num(srcFiIeLines)*Num(Var)+Num (Proc) *Num(srcFiIeLines)(IntervalAnalysis)。所以,整個(gè)缺陷檢測(cè)的復(fù)雜度為Num(fsm)+Num(srcFiles)*(Num(srcFiles) * (Num(srcFiIeLines)^Num(Var)+Num(Proc)*Num (srcFiIeLines))。本發(fā)明所提供的基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法表明,該缺陷檢測(cè)系統(tǒng)具有多項(xiàng)式復(fù)雜度,影響其效率的因子很多,且部分影響因子是待測(cè)程序的復(fù)雜度決定的(例如Num(Proc),Num(ProcCall), Num(Var)等)。對(duì)組成多項(xiàng)式的各項(xiàng)因子分析發(fā)現(xiàn),可控的復(fù)雜度影響因子包括Num (fsm),O (IntervalAnalysis), O(FSMTransiti0n),在設(shè)計(jì)相應(yīng)的區(qū)間運(yùn)算算法及缺陷迭代判斷時(shí)應(yīng)考慮如何提高其效率?;谏鲜瞿K分解技術(shù)的復(fù)雜度分析方法也可以看出,各模塊及分析單元的復(fù)雜性較高且可以并發(fā)進(jìn)行,如拓?fù)渑判蚝蟮玫降奈募蕾囮P(guān)系圖及函數(shù)調(diào)用關(guān)系圖,由于我們的算法是按照自底向上進(jìn)行單文件或單函數(shù)分析的,因此在依賴圖中出度為O (葉子節(jié)點(diǎn))的文件或函數(shù)可以并發(fā)檢測(cè),且該類(lèi)型的文件或函數(shù)檢測(cè)完畢后,又會(huì)生成新的葉子節(jié)點(diǎn),從而可以用上述算法繼續(xù)進(jìn)行并發(fā)檢測(cè)。通過(guò)對(duì)整個(gè)的分析流程觀察可以發(fā)現(xiàn),語(yǔ)法樹(shù)、符號(hào)表是整個(gè)缺陷檢測(cè)的基礎(chǔ),因此可以考慮將每個(gè)文件的此類(lèi)信息進(jìn)行緩存(例如,緩存到本地硬盤(pán)文件系統(tǒng)中),當(dāng)后續(xù)分析需要時(shí)直接可以獲取,從而進(jìn)一步降低復(fù)雜度。
以上所述,僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法,其特征在于,該分析方法包括A、根據(jù)所述缺陷檢測(cè)系統(tǒng)DTS缺陷檢測(cè)原理,將該分析方法的流程包括由前端輸入預(yù)處理模塊完成的前端輸入預(yù)處理步驟、由預(yù)分析模塊完成預(yù)分析的步驟、由正式分析模塊完成正式分析的步驟;B、對(duì)所述的前端輸入預(yù)處理模塊、預(yù)分析模塊和正式分析模塊的內(nèi)部所有分析單元, 按其調(diào)用順序及依賴關(guān)系依次分析其復(fù)雜度,得到每個(gè)分析單元復(fù)雜性分布的性質(zhì)和規(guī)律;C、根據(jù)步驟B的分析結(jié)果,統(tǒng)計(jì)得出整個(gè)DTS系統(tǒng)的復(fù)雜性分布情況。
2.根據(jù)權(quán)利要求1所述的基于模塊分解技術(shù)的缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法,其特征在于,將步驟B所述前端輸入預(yù)處理模塊、預(yù)分析模塊和正式分析模塊分別進(jìn)一步分為將所述前端輸入預(yù)處理模塊分為載入缺陷狀態(tài)機(jī)單元、源文件收集單元和程序轉(zhuǎn)換單元;將所述預(yù)分析模塊分為全局函數(shù)調(diào)用關(guān)系生成單元和文件分析次序解析單元;以及將正式分析模塊分為線程分析單元和缺陷檢測(cè)結(jié)果輸出單元。
3.根據(jù)權(quán)利要求1所述基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法,其特征在于,步驟C所述得出整個(gè)DTS系統(tǒng)的復(fù)雜性分布情況的過(guò)程,包括對(duì)前端預(yù)輸入處理模塊的分析單元進(jìn)行復(fù)雜度分析,具體如下Cl、將待測(cè)試的程序源文件載入缺陷狀態(tài)機(jī)單元,根據(jù)預(yù)先配置的待掃描缺陷狀態(tài)機(jī)類(lèi)型,讀入對(duì)應(yīng)的狀態(tài)機(jī)描述XML文件;復(fù)雜度取決于待掃描缺陷狀態(tài)機(jī)種類(lèi)數(shù) Num (fsm);C2、收集待進(jìn)行缺陷檢測(cè)的源文件,如果以工程為單位進(jìn)行檢測(cè),則根據(jù)工程配置文件搜索待分析源文件;否則,直接搜索待掃描目錄,收集所有待檢測(cè)源文件;復(fù)雜度取決于待分析源文件數(shù)量Num(srcFiles);C3、根據(jù)待測(cè)源文件的類(lèi)型執(zhí)行程序轉(zhuǎn)換,具體為通過(guò)程序轉(zhuǎn)換單元,根據(jù)待檢測(cè)源文件類(lèi)型,調(diào)用相應(yīng)的編譯器進(jìn)行預(yù)處理,得到預(yù)處理后的中間文件,作為后續(xù)分析的輸入;如果是JAVA語(yǔ)言,需要調(diào)用JVM將源文件(.java)編譯為字節(jié)碼文件(.class);其復(fù)雜度取決于JVM的編譯器效率;如果是C或CPP語(yǔ)言,需要調(diào)用相應(yīng)的編譯器(gcc,cl)將源文件(.c,.cpp)預(yù)處理為中間文件(.i);其復(fù)雜度取決于編譯器的效率;最后,將該類(lèi)不可控分析單元的復(fù)雜度標(biāo)記為0(⑴)。
4.根據(jù)權(quán)利要求1所述的基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法, 其特征在于,步驟C所述得出整個(gè)DTS系統(tǒng)的復(fù)雜性分布情況的過(guò)程,對(duì)預(yù)分析模塊的分析單元進(jìn)行復(fù)雜度分析,具體如下C4、通過(guò)全局函數(shù)調(diào)用關(guān)系生成單元,首先進(jìn)行預(yù)分析,生成全局函數(shù)調(diào)用關(guān)系,然后按字母順序遍歷所有源文件,查找所有需要分析的函數(shù)并建立全局函數(shù)表,保存函數(shù)間調(diào)用關(guān)系;同時(shí),還能夠根據(jù)需要生成庫(kù)函數(shù)摘要;C5、利用文件分析次序解析單元,根據(jù)所述全局函數(shù)表及調(diào)用關(guān)系,對(duì)文件調(diào)用關(guān)系進(jìn)行拓?fù)渑判?,最終的文件分析次序?yàn)橥負(fù)渑判虻哪嫘?;該分析單元的?fù)雜度取決于全局函數(shù)表中的函數(shù)個(gè)數(shù)Num(Proc)及每個(gè)函數(shù)調(diào)用其他函數(shù)的平均次數(shù)NumQ^ocCall),得出該分析單元的復(fù)雜度Num(Proc) *Num(ProcCal 1)。
5.根據(jù)權(quán)利要求1所述的基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法, 其特征在于,步驟C所述得出整個(gè)DTS系統(tǒng)的復(fù)雜性分布情況的過(guò)程,對(duì)正式分析模塊的分析單元進(jìn)行復(fù)雜度分析,具體如下C6、利用線程分析單元,根據(jù)上述步驟C5中得到的文件分析次序,為每個(gè)文件依次生成分析線程,同時(shí)檢測(cè)線程執(zhí)行過(guò)程中是否出現(xiàn)異常以便及時(shí)結(jié)束線程;C7、通過(guò)缺陷檢測(cè)結(jié)果輸出單元,將所述步驟C6的輸出檢測(cè)結(jié)果寫(xiě)入數(shù)據(jù)庫(kù)中;其復(fù)雜度取決于待分析文件數(shù)Num(srCFiles)及每個(gè)文件的平均缺陷數(shù)Num(IP),復(fù)雜度依賴于 Num(srcFiles) *Num(IP)。
6.根據(jù)權(quán)利要求4所述基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法,其特征在于,根據(jù)全局函數(shù)調(diào)用關(guān)系生成單元的原理,將所述步驟C4分為五個(gè)子分析單元, 然后對(duì)每個(gè)子單元的復(fù)雜度分析,具體包括C41、語(yǔ)法樹(shù)生成包括詞法分析及語(yǔ)法分析兩個(gè)階段詞法分析復(fù)雜度取決于源文件的平均行數(shù)NunKsrcFileLines),語(yǔ)法分析的復(fù)雜度取決于源文件的語(yǔ)法復(fù)雜程度,均為不可控的;其語(yǔ)法樹(shù)生成單元的復(fù)雜度為NunKsrcFileLines);C42、作用域和聲明分析單元為單個(gè)文件生成SourceFil必cope, ClassScope, MethodScope及LocalScope作用域?qū)哟侮P(guān)系,及每個(gè)作用域下的變量聲明集合 VariableNamesDeclarations 禾口函數(shù)聲明集合 MethodNameDeclarations,并且為每個(gè)變量及函數(shù)創(chuàng)建類(lèi)型信息;其復(fù)雜度主要依賴于語(yǔ)法樹(shù)中相關(guān)節(jié)點(diǎn)的數(shù)量,若其與文件行數(shù)成正比,則本分析單元復(fù)雜度為Num(srcFiIeLines);C43、表達(dá)式類(lèi)型分析單元為程序中的各種表達(dá)式生成類(lèi)型信息,為后續(xù)的區(qū)間分析及缺陷模式計(jì)算提供類(lèi)型支持;本分析單元的復(fù)雜度也依賴于語(yǔ)法樹(shù)中相關(guān)節(jié)點(diǎn)的數(shù)量,若其與文件行數(shù)成正比,則本分析單元復(fù)雜度為NunKsrcFileLines);C44、標(biāo)志符出現(xiàn)分析單元將所有標(biāo)識(shí)符的出現(xiàn)與其正確的聲明相關(guān)聯(lián),并且將這種關(guān)聯(lián)關(guān)系添加到具體的作用域中,以方便后續(xù)的文件內(nèi)函數(shù)調(diào)用關(guān)系生成;標(biāo)識(shí)符的出現(xiàn)分為變量使用和函數(shù)調(diào)用,本分析單元的復(fù)雜度取決于程序中變量和函數(shù)的聲明及使用數(shù)量 Num(Var)+Num(Proc);C45、函數(shù)調(diào)用關(guān)系分析單元遍歷程序中所有函數(shù)定義節(jié)點(diǎn) (ASTFimctionDefinition),查找該函數(shù)作用域中的所有函數(shù)調(diào)用,為當(dāng)前函數(shù)定義節(jié)點(diǎn)生成“一對(duì)多”的調(diào)用關(guān)系,隨著遍歷的進(jìn)行生成函數(shù)調(diào)用關(guān)系圖;本分析單元復(fù)雜度主要依賴于每個(gè)文件中函數(shù)平均個(gè)數(shù)Num(Proc),及每個(gè)函數(shù)調(diào)用其他函數(shù)的平均個(gè)數(shù) Num(ProcCall),其復(fù)雜度為 Num(Proc) * Num(ProcCall);所述的全局函數(shù)調(diào)用關(guān)系生成單元,其復(fù)雜度為Num(srcFiles)* (Num(srcFileLines) + Num(Var) + Num(Proc))。
7.根據(jù)權(quán)利要求5所述基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法,其特征在于,根據(jù)線程分析單元的檢測(cè)原理,將所述步驟C6進(jìn)一步分為十個(gè)子分析單元,對(duì)每個(gè)子單元的復(fù)雜度分析步驟為C61 C64、其復(fù)雜度分析過(guò)程與C41 C44的類(lèi)似;C65、利用控制流圖生成單元遍歷語(yǔ)法樹(shù)相關(guān)節(jié)點(diǎn),分別生成控制流圖節(jié)點(diǎn)和邊; 所述控制流圖中節(jié)點(diǎn)與邊的數(shù)量為等數(shù)量級(jí)的,且節(jié)點(diǎn)數(shù)主要取決于源代碼行數(shù);本分析單元的復(fù)雜度主要依賴于語(yǔ)法樹(shù)中相關(guān)節(jié)點(diǎn)的數(shù)量及程序代碼行數(shù),復(fù)雜度為 Num (srcFiIeLines);C66、定義使用分析單元為變量的聲明及使用位置生成關(guān)聯(lián)關(guān)系,能夠?yàn)橄嚓P(guān)模式提供數(shù)據(jù)依賴分析的支持;首先根據(jù)步驟C62 C64的分析結(jié)果,按作用域?qū)哟侮P(guān)系依次初始化每個(gè)變量出現(xiàn)的定義或使用信息,并將此初始化定義使用信息綁定到對(duì)應(yīng)的控制流節(jié)點(diǎn), 然后基于步驟C65生成的控制流圖,進(jìn)行流敏感的定義使用信息迭代;定義使用信息迭代的復(fù)雜度取決于控制流節(jié)點(diǎn)數(shù)及每次迭代的復(fù)雜度,迭代復(fù)雜度取決于每個(gè)控制流節(jié)點(diǎn)上變量出現(xiàn)的個(gè)數(shù)(與程序中變量總數(shù)成正比);本分析單元的復(fù)雜度為NunKsrcFileLines)* Num(Var);C67、文件內(nèi)函數(shù)調(diào)用關(guān)系生成單元的分析原理與步驟C66類(lèi)似,也是通過(guò)作用域?qū)哟侮P(guān)系得到文件內(nèi)的函數(shù)調(diào)用關(guān)系,并創(chuàng)建函數(shù)調(diào)用關(guān)系圖;其復(fù)雜度取決于Num(Proc);C68、解析函數(shù)分析次序單元與步驟C45類(lèi)似;其復(fù)雜度取決于函數(shù)及函數(shù)調(diào)用的個(gè)數(shù) Num (Proc);C69、區(qū)間分析單元以函數(shù)為單位(Num(Proc)),依次遍歷控制流圖進(jìn)行數(shù)據(jù)流方程迭代在控制流入口節(jié)點(diǎn)將所有外部區(qū)間信息初始化,后續(xù)節(jié)點(diǎn)首先對(duì)前驅(qū)節(jié)點(diǎn)的數(shù)據(jù)流信息進(jìn)行繼承或匯聚,然后根據(jù)當(dāng)前節(jié)點(diǎn)關(guān)聯(lián)語(yǔ)法樹(shù)節(jié)點(diǎn)的類(lèi)型進(jìn)行區(qū)間運(yùn)算;若平均每個(gè)函數(shù)的控制流節(jié)點(diǎn)數(shù)為Num(VexNode),每個(gè)節(jié)點(diǎn)區(qū)間運(yùn)算的復(fù)雜度為O (IntervalAnalysis),則對(duì)單個(gè)函數(shù)進(jìn)行區(qū)間分析的復(fù)雜度為O(Num(VexNode)* IntervalAnalysis);在控制流出口節(jié)點(diǎn),根據(jù)配置是否進(jìn)行函數(shù)間分析,為當(dāng)前函數(shù)計(jì)算其函數(shù)摘要,包括后置條件與前置約束,后置條件需要計(jì)算所有return語(yǔ)句的區(qū)間信息并取并集,其復(fù)雜度決定于Num(VexNode),前置條件需要查詢AST上某種類(lèi)型的節(jié)點(diǎn),復(fù)雜度與Num(ASTNode)有關(guān);得到該區(qū)間分析單元的總復(fù)雜度為=Num(Proc) * (Num(srcFiIeLines)* IntervalAnalysis);C70、缺陷自動(dòng)機(jī)分析單元根據(jù)步驟A載入的狀態(tài)機(jī)類(lèi)型,根據(jù)每種類(lèi)型狀態(tài)機(jī)的創(chuàng)建條件生成狀態(tài)機(jī)實(shí)例集合如果是非流敏感的狀態(tài)機(jī)實(shí)例,則直接在語(yǔ)法樹(shù)上進(jìn)行狀態(tài)迭代,檢測(cè)該類(lèi)型的缺陷;將所有流敏感的狀態(tài)機(jī)實(shí)例集合置于函數(shù)控制流入口節(jié)點(diǎn)處, 然后根據(jù)控制流順序?qū)γ總€(gè)狀態(tài)機(jī)實(shí)例的缺陷狀態(tài)進(jìn)行狀態(tài)條件更新,如果發(fā)生狀態(tài)遷移且為error狀態(tài)則上報(bào)一個(gè)相應(yīng)類(lèi)型的缺陷,否則狀態(tài)自動(dòng)遷移到end狀態(tài)表示自動(dòng)機(jī)將自動(dòng)銷(xiāo)毀;如果為路徑敏感的缺陷狀態(tài)迭代方法,則狀態(tài)條件需要重新通過(guò)區(qū)間運(yùn)算計(jì)算生成(OantervalAnalysis));每個(gè)函數(shù)創(chuàng)建的狀態(tài)機(jī)實(shí)例數(shù)為Num(FSiOnstances), 每個(gè)控制流節(jié)點(diǎn)關(guān)聯(lián)的缺陷狀態(tài)實(shí)例數(shù)為與其成正比,每個(gè)狀態(tài)條件遷移與否的計(jì)算量為O (FSMTransition),則路徑敏感的缺陷自動(dòng)機(jī)分析復(fù)雜度為Num (Proc) * (Num(FSMInstances) * O(FSMTransition) * O(IntervalAnalysis) )) ; 陷自動(dòng)機(jī)分析復(fù)雜度為 Num(Proc) * (Num(FSMInstances) * O(FSMTransition)));得到所述正式分析模塊的復(fù)雜度為Num(srcFiles) * (Num(srcFiIeLines) *Num(Var) +Num(Proc)*Num(srcFiIeLines)(IntervalAnalysis)0
8.根據(jù)權(quán)利要求7所述基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法,其特征在于,所述的缺陷檢測(cè)系統(tǒng)的總復(fù)雜度為Num(fsm) +Num(srcFiles)*(Num(srcFiles) 氺(Num(srcFileLines)氺Num(Var)+Num(Proc)*Num(srcFileLines))。
9.根據(jù)權(quán)利要求7所述基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法, 其特征在于,所述的缺陷檢測(cè)系統(tǒng)具有多項(xiàng)式復(fù)雜度,影響其分析效率的因子,主要包括 Num(fsm), O(IntervalAnalysis)和0 (FSMTransition),且部分影響因子是待測(cè)程序的復(fù)雜度,如 Num(Proc),Num(ProcCall), Num(Var)決定的。
10.根據(jù)權(quán)利要求7所述基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)的復(fù)雜性分析方法, 其特征在于,所述缺陷檢測(cè)系統(tǒng)中的各模塊及分析單元的復(fù)雜性較高且可并發(fā)執(zhí)行;將每個(gè)文件的語(yǔ)法樹(shù)、符號(hào)表等信息進(jìn)行緩存,當(dāng)后續(xù)分析需要時(shí)直接獲取,能夠進(jìn)一步降低該分析過(guò)程的復(fù)雜度。
全文摘要
本發(fā)明公開(kāi)一種基于模塊分解技術(shù)的軟件缺陷檢測(cè)系統(tǒng)(DTS)的復(fù)雜性分析方法,包括A,根據(jù)所述DTS缺陷檢測(cè)原理,將該分析方法的流程包括由前端輸入預(yù)處理模塊完成的前端輸入預(yù)處理步驟、由預(yù)分析模塊完成預(yù)分析的步驟、由正式分析模塊完成正式分析的步驟;B,對(duì)所述的前端輸入預(yù)處理模塊、預(yù)分析模塊和正式分析模塊的內(nèi)部所有分析單元,按其調(diào)用順序及依賴關(guān)系依次分析其復(fù)雜度,得到每個(gè)分析單元復(fù)雜性分布的性質(zhì)和規(guī)律;C,根據(jù)步驟B的分析結(jié)果,統(tǒng)計(jì)得出整個(gè)DTS系統(tǒng)的復(fù)雜性分布情況。采用本發(fā)明,通過(guò)對(duì)每個(gè)模塊內(nèi)部的分析單元的復(fù)雜性分析,統(tǒng)計(jì)得出DTS的復(fù)雜性分布情況,克服了現(xiàn)有復(fù)雜性分析方法不夠系統(tǒng)全面等的缺點(diǎn)。
文檔編號(hào)G06F11/36GK102521126SQ20111039821
公開(kāi)日2012年6月27日 申請(qǐng)日期2011年12月5日 優(yōu)先權(quán)日2011年12月5日
發(fā)明者宮云戰(zhàn), 肖慶, 趙云山, 金大海 申請(qǐng)人:北京郵電大學(xué)