軟件分析技術(shù)進(jìn)展_第1頁
軟件分析技術(shù)進(jìn)展_第2頁
軟件分析技術(shù)進(jìn)展_第3頁
軟件分析技術(shù)進(jìn)展_第4頁
軟件分析技術(shù)進(jìn)展_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

軟件分析技術(shù)進(jìn)展*資助*資助項(xiàng)目:國家重點(diǎn)基礎(chǔ)研究發(fā)展規(guī)劃973項(xiàng)目(No.2023CB320703);國家自然科學(xué)基金委創(chuàng)新研究群體研究科學(xué)基金項(xiàng)目(No:60821003);國家863高技術(shù)項(xiàng)目(No.2023AA01Z175)梅宏1王千祥1張路1王戟21.北京大學(xué)信息科學(xué)技術(shù)學(xué)院,高可信軟件教育部重點(diǎn)實(shí)驗(yàn)室,北京1008712.國防科技大學(xué)計(jì)算機(jī)學(xué)院,并行與分布解決國防科技重點(diǎn)實(shí)驗(yàn)室,長沙410073摘要軟件分析技術(shù)的研究已有較長歷史,相關(guān)成果也在軟件生命周期的不同階段中得到了廣泛應(yīng)用。軟件生命周期中不同活動(dòng)所需要的軟件分析技術(shù)既不完全相同,又有許多交疊,且不同的分析技術(shù)之間互相影響。文章在討論了軟件分析的基本概念之后,重要從靜態(tài)分析與動(dòng)態(tài)分析兩個(gè)方面介紹了一些重要的軟件分析技術(shù),以及部分相關(guān)分析工具。結(jié)合軟件的質(zhì)量問題,文章還探討了一些分析技術(shù)與軟件質(zhì)量屬性的相關(guān)性,以便于人們?cè)诜治鎏囟ǖ能浖|(zhì)量屬性時(shí),選取合適的技術(shù)與工具。最后,文章展望了軟件分析技術(shù)的發(fā)展趨勢(shì)。關(guān)鍵詞軟件分析,靜態(tài)分析,動(dòng)態(tài)分析,軟件質(zhì)量中圖法分類號(hào) TP301引言軟件是一種十分特殊的人工制品:它是人類“智力活動(dòng)”的產(chǎn)物,是對(duì)客觀事物的虛擬反映,是知識(shí)的固化與凝練。盡管軟件迄今已有50數(shù)年的發(fā)展歷史,但目前人們對(duì)于軟件的許多結(jié)識(shí)還十分有限。例如:對(duì)于任何一個(gè)給定的軟件,我們能否完全了解它的特性?軟件分析就是一個(gè)以軟件特性為關(guān)注點(diǎn)的研究領(lǐng)域?!胺治觥?,通俗來說,是以某種方式將復(fù)雜對(duì)象分解為更小的部分,以更好地理解該對(duì)象的過程。分析技術(shù)很早就被應(yīng)用于數(shù)學(xué)、邏輯等方面的研究,近代以來逐步被更多的學(xué)科(例如:化學(xué)、物理等)所大量采用。軟件作為一個(gè)新發(fā)展起來的學(xué)科,在研究過程中引入分析技術(shù)是十分自然的。目前軟件生命周期中的許多活動(dòng)(分析、設(shè)計(jì)、實(shí)現(xiàn)、測(cè)試、部署、維護(hù)等)都離不開分析技術(shù)。然而,軟件分析的能力是有限的:對(duì)于任何一個(gè)有一定規(guī)模的軟件,希望獲得關(guān)于它的完備描述通常是不現(xiàn)實(shí)的[18]。特別是,對(duì)于自動(dòng)分析而言,許多問題是不可鑒定的。其中最典型的例子是停機(jī)不可鑒定問題:不存在一個(gè)這樣的算法,對(duì)于任意的圖靈機(jī)以及任意的輸入,可以判斷該圖靈機(jī)是否停機(jī)[64]。但從軟件分析這么數(shù)年所取得的進(jìn)展可以看出,盡管軟件分析的能力有限,它仍然是軟件領(lǐng)域十分有用的技術(shù):將程序從高級(jí)語言向機(jī)器語言的翻譯過程需要分析,判斷一個(gè)程序是否符合需求規(guī)約需要分析技術(shù),想了解程序是否存在安全漏洞需要分析技術(shù),維護(hù)過程更是需要大量的分析技術(shù),等等。本文將軟件分析定義為“對(duì)軟件進(jìn)行人工或者自動(dòng)分析,以驗(yàn)證、確認(rèn)、或發(fā)現(xiàn)軟件性質(zhì)(或者規(guī)約、約束)的過程或活動(dòng)”。下面對(duì)上述定義中幾個(gè)術(shù)語進(jìn)行解釋。一方面是“軟件”:軟件最初重要是指程序,后來逐步擴(kuò)大到文檔等其它形態(tài)軟件制品。軟件分析也從程序分析發(fā)展到了更大的范圍,例如:對(duì)文檔(含需求規(guī)約、設(shè)計(jì)文檔、代碼注釋等)的分析、對(duì)運(yùn)營程序的分析,等等?!白詣?dòng)”也是很重要的概念:軟件分析的歷史幾乎與軟件的歷史同樣長:自從有了軟件就有了軟件分析。最初的分析重要是人工進(jìn)行的,但人工分析往往需要花費(fèi)大量的時(shí)間與精力,因此,后來人們?cè)絹碓蕉嗟仃P(guān)注自動(dòng)分析。其中,編譯技術(shù)的發(fā)展大大帶動(dòng)了軟件的自動(dòng)分析技術(shù),目前的許多分析技術(shù)都可以在編譯技術(shù)中找到基本雛形。所謂“驗(yàn)證”(Verification),是要回答“軟件制品是否與軟件需求規(guī)約一致”的問題,而“確認(rèn)”(Validation)則要回答“軟件的特性是否符合用戶需求”的問題。在英文中,人們經(jīng)常用“Dothethingright”來解釋“驗(yàn)證”,而用“Dotherightthing”來解釋“確認(rèn)”?!鞍l(fā)現(xiàn)”(Discover)是指在沒有事先設(shè)定軟件某個(gè)性質(zhì)的前提下,通過度析發(fā)現(xiàn)軟件的某種性質(zhì)。之所以強(qiáng)調(diào)“性質(zhì)”,是由于分析的結(jié)果通常表達(dá)為軟件是否符合或者具有某種性質(zhì)(或者規(guī)約、約束),而這種性質(zhì)不是軟件自身自明的。在本文討論的軟件分析中,分析對(duì)象僅限于軟件制品,不涉及對(duì)軟件過程、軟件人員與軟件組織等的分析。目前與軟件分析相關(guān)的綜述性文獻(xiàn)中,多數(shù)只對(duì)軟件分析的一個(gè)子集進(jìn)行比較進(jìn)一步的介紹。例如[1]集中在對(duì)源代碼分析的介紹,[2]重要介紹形式化的分析方法,[53]著重從語義的角度介紹程序分析,[54]集中在模型為中心的程序分析上。本文在這些工作的基礎(chǔ)之上,嘗試對(duì)軟件分析涉及的重要方法進(jìn)行盡也許全面的總結(jié)、分類。此外,考慮到近年來軟件質(zhì)量為人們所熱切關(guān)注,本文在介紹分析技術(shù)之外,特別關(guān)注那些與質(zhì)量相關(guān)的分析技術(shù),并結(jié)合不同的軟件質(zhì)量屬性,探討不同的質(zhì)量屬性適合運(yùn)用什么類型的分析技術(shù)。最后,文章結(jié)合軟件形態(tài)、軟件運(yùn)營環(huán)境等幾個(gè)驅(qū)動(dòng)力對(duì)軟件分析技術(shù)的發(fā)展趨勢(shì)進(jìn)行展望。軟件分析技術(shù)軟件分析通常是此外一個(gè)更大的軟件生命周期活動(dòng)(例如:開發(fā)、維護(hù)、復(fù)用等)的一部分,是實(shí)行這些過程的一個(gè)重要環(huán)節(jié):a)在開發(fā)階段,對(duì)正在開發(fā)的軟件進(jìn)行分析,以快速地開發(fā)出高質(zhì)量的軟件,例如:了解開發(fā)進(jìn)展、預(yù)測(cè)開發(fā)行為、消除軟件缺陷、程序變換等等;b)在維護(hù)階段,對(duì)已經(jīng)開發(fā)、部署、運(yùn)營的某個(gè)軟件進(jìn)行分析,以準(zhǔn)確地理解軟件、有效地維護(hù)該軟件,從而使軟件提供更好的服務(wù);c)在復(fù)用階段,對(duì)以前開發(fā)的軟件進(jìn)行分析,以復(fù)用其中有價(jià)值的成分。上述各過程差異較大,需要的分析技術(shù)也多種多樣。這導(dǎo)致目前的軟件分析內(nèi)容十分豐富,且互相之間的界線也不甚清楚:有些分析過程需要此外某個(gè)或某些分析的支持;有些分析針對(duì)具體的性質(zhì)開展,而有些分析方法則可以支持多種性質(zhì)的分析。軟件分析分類為了對(duì)軟件分析有個(gè)比較全面的了解,對(duì)其進(jìn)行合理的分類是十分必要的。對(duì)軟件分析進(jìn)行分類的維度有很多。其中,分析對(duì)象是最重要的準(zhǔn)則之一,即軟件分析是對(duì)什么制品進(jìn)行分析?從大的方面看,軟件分析可以對(duì)代碼進(jìn)行,也可以對(duì)模型(需求規(guī)約、設(shè)計(jì)模型、體系結(jié)構(gòu)等)、文檔甚至注釋進(jìn)行。代碼可以進(jìn)一步分為源碼與目的碼,目的代碼又具有靜態(tài)與運(yùn)營態(tài)兩種存在方式,而運(yùn)營態(tài)的代碼又可以進(jìn)一步區(qū)分為離線的運(yùn)營與在線的運(yùn)營。除分析對(duì)象維度之外,還可以從方法學(xué)(結(jié)構(gòu)化軟件、面向?qū)ο筌浖?、面向?gòu)件軟件等)、并行限度(串行軟件、并行軟件)等其它維度劃分軟件分析的內(nèi)容。本文一方面以分析過程“是否需要運(yùn)營軟件”為準(zhǔn)則,將軟件分析技術(shù)劃分為靜態(tài)分析技術(shù)與動(dòng)態(tài)分析技術(shù)兩大類,然后又在每一大類技術(shù)下面做進(jìn)一步的劃分。圖1是綜合考慮靜態(tài)、動(dòng)態(tài)分析技術(shù)給出的一個(gè)分析過程示意圖。圖1靜態(tài)分析與動(dòng)態(tài)分析的基本過程靜態(tài)分析靜態(tài)分析是指在不運(yùn)營軟件前提下進(jìn)行的分析過程。靜態(tài)分析的對(duì)象一般是程序源代碼,也可以是目的碼(例如JAVA的bytecode),甚至可以是設(shè)計(jì)模型等形態(tài)的制品。靜態(tài)代碼分析重要可以應(yīng)用于如下幾個(gè)過程:1)查找缺陷,以消除軟件中存在的缺陷;2)程序轉(zhuǎn)換,以實(shí)行編譯、優(yōu)化等過程;3)后期的演化與維護(hù);4)動(dòng)態(tài)分析,等等。根據(jù)各種分析方法使用的廣泛限度以及分析方法的相近性,本文將重要的代碼靜態(tài)分析劃分為四類:基本分析、基于形式化方法的分析、指向分析與其它輔助分析(見圖2)。其中,基本分析是一些常見的分析,例如語法分析、類型分析、控制流分析、數(shù)據(jù)流分析等,是多數(shù)編譯器都包含的分析過程(詞法分析由于相對(duì)簡樸而沒有引入);而基于形式化方法的分析則在分析過程中大量采用一些數(shù)學(xué)上比較成熟的形式化方法,以獲得關(guān)于代碼的一些更精確或者更廣泛的性質(zhì)。指向分析多數(shù)與指針密切相關(guān),由于在靜態(tài)分析中長期受到較多的關(guān)注,因此單獨(dú)作為一類。其它輔助分析則包含了一些單獨(dú)分析的目的性不是很強(qiáng),但可認(rèn)為前面幾類分析提供支持的一些分析方法。需要指出的是,這不是一個(gè)嚴(yán)格的分類,而僅僅是為了便于人們比較全面地了解靜態(tài)分析,對(duì)一些重要的、具有共性的靜態(tài)分析進(jìn)行歸類而得到的一個(gè)結(jié)果。圖2重要的靜態(tài)分析技術(shù)基本分析1)語法分析(SyntaxAnalysis)。語法分析是按具體編程語言的語法規(guī)則分析和解決詞法分析程序產(chǎn)生的結(jié)果并生成語法分析樹的過程。這個(gè)過程可以判斷程序在結(jié)構(gòu)上是否與預(yù)先定義的BNF范式相一致,即程序中是否存在語法錯(cuò)誤。程序的BNF范式一般由上下文無關(guān)文法描述。支持語法分析的重要技術(shù)涉及算符優(yōu)先分析法(自底向上)、遞歸下降分析法(自頂向下)和LR分析法(自左至右、自底向上)等。語法分析是編譯過程中的重要環(huán)節(jié),也是多數(shù)其它分析的基礎(chǔ):假如一個(gè)程序連語法分析都沒有通過,則對(duì)其進(jìn)行其它的分析往往沒故意義。2)類型分析(TypeAnalysis)。類型分析重要是指類型檢查(TypeChecking)。類型檢查的目的是分析程序中是否存在類型錯(cuò)誤。類型錯(cuò)誤通常是指違反類型約束的操作,例如讓兩個(gè)字符串相乘,數(shù)組的越界訪問,等等。類型檢查通常是靜態(tài)進(jìn)行的,但也可以動(dòng)態(tài)進(jìn)行。編譯時(shí)刻進(jìn)行的類型檢查是靜態(tài)檢查。對(duì)類型分析的支持限度是劃分編程語言種類的準(zhǔn)則之一:對(duì)于一種編程語言,假如它的所有表達(dá)式類型可以通過靜態(tài)分析擬定下來,進(jìn)而消除類型錯(cuò)誤,則這個(gè)語言是靜態(tài)類型語言(也是強(qiáng)類型語言)。運(yùn)用靜態(tài)類型語言開發(fā)出的程序可以在運(yùn)營程序之前消除許多錯(cuò)誤,因此程序質(zhì)量的保障相對(duì)容易一些(但表達(dá)的靈活性弱一些)。3)控制流分析(ControlFlowAnalysis)。控制流分析的目的是得到程序的一個(gè)控制流圖(ControlFlowGraph)??刂屏鲌D是對(duì)程序執(zhí)行時(shí)也許通過的所有途徑的圖形化表達(dá)。通過根據(jù)不同語句之間的關(guān)系,特別是考慮由“條件轉(zhuǎn)移”、“循環(huán)”等引入的分支關(guān)系,對(duì)過程內(nèi)的一些語句進(jìn)行合并,可以得到關(guān)于程序結(jié)構(gòu)的一些結(jié)果。一個(gè)控制流圖是一個(gè)有向圖:圖中的結(jié)點(diǎn)相應(yīng)于程序中通過合并的基本語句塊,圖中的邊相應(yīng)于也許的分支方向,例如:條件轉(zhuǎn)移、循環(huán)等等,這些都是分析程序行為的重要信息。4)數(shù)據(jù)流分析(DataFlowAnalysis)。數(shù)據(jù)流分析試圖擬定在程序的某一點(diǎn)(語句),關(guān)于各個(gè)變量的使用或者也許取值情況。數(shù)據(jù)流分析一般從程序的一個(gè)控制流圖開始。數(shù)據(jù)流分析重要有前向分析(ForwardAnalysis)、后向分析(BackwardAnalysis)兩種方法。前向分析的一個(gè)例子是可達(dá)定義(reachingdefinitions)。它計(jì)算對(duì)于程序的每一點(diǎn),也許到達(dá)該點(diǎn)的定義的集合。后向分析的一個(gè)例子是活躍變量(livevariables)。它計(jì)算對(duì)于程序的每一點(diǎn),程序后面的語句也許讀取且沒有再次修改的變量。這個(gè)結(jié)果對(duì)于消除死代碼(deadcode)很有用:假如一個(gè)變量在某個(gè)階段被定義后,后面的語句一直不會(huì)用到這個(gè)定義,那么這個(gè)定義就是死代碼,應(yīng)當(dāng)從程序中刪除。基于格(lattice)與不動(dòng)點(diǎn)(\o"Fixpoint"fixpoint)理論的數(shù)據(jù)流分析是目前被廣泛使用的技術(shù):一方面對(duì)控制流圖中的每個(gè)節(jié)點(diǎn)建立一個(gè)數(shù)據(jù)流等式(equations),并根據(jù)分析目的構(gòu)造一個(gè)具有有限高度的格L,然后不斷反復(fù)計(jì)算每個(gè)節(jié)點(diǎn)的輸出,直到達(dá)成格的一個(gè)不動(dòng)點(diǎn)。許多編譯器為了進(jìn)行編譯優(yōu)化而引入了數(shù)據(jù)流分析技術(shù)。由于上述四種基本分析是多數(shù)編譯器包含的內(nèi)容,因此很早就得到了較進(jìn)一步的研究[62]。這些分析過程尚有一個(gè)共同特點(diǎn)是分析的輸入僅僅是軟件代碼,不需要提供圖1中的“系統(tǒng)性質(zhì)”?;蛘哒f,基本分析技術(shù)所需要的“系統(tǒng)性質(zhì)”都是最基本的性質(zhì)。例如語法分析相應(yīng)的“系統(tǒng)性質(zhì)”就是編程語言的BNF范式,類型分析相應(yīng)的“系統(tǒng)性質(zhì)”是預(yù)先定義的類型約束,數(shù)據(jù)流分析相應(yīng)的“系統(tǒng)性質(zhì)”是編程語言的基本約定,等等。而下面要講到的形式化分析、指向分析則通常要事先提供待驗(yàn)證的性質(zhì),例如:某個(gè)變量的取值是否在某個(gè)范圍內(nèi)、某兩個(gè)變量名是否指向相同的內(nèi)存實(shí)例、等等。基于形式化方法的分析為了提高分析的準(zhǔn)確度,獲取關(guān)于程序的更多性質(zhì),許多研究人員借用形式化方法來擴(kuò)展基本分析技術(shù)。代表性技術(shù)有模型檢查、定理證明、約束求解、抽象解釋等。1)模型檢查(ModelChecking)。模型檢查用狀態(tài)遷移系統(tǒng)表達(dá)系統(tǒng)的行為,用模態(tài)/時(shí)序邏輯公式描述系統(tǒng)的性質(zhì),然后用數(shù)學(xué)問題“狀態(tài)遷移系統(tǒng)是否是該邏輯公式的一個(gè)模型”來鑒定“系統(tǒng)是否具有所盼望的性質(zhì)”[32]。模型檢查雖然在檢查硬件設(shè)計(jì)錯(cuò)誤方面簡樸明了且自動(dòng)化限度高,然而被應(yīng)用在軟件程序分析與驗(yàn)證時(shí)卻存在著難以解決的狀態(tài)空間爆炸問題。此外,由于模型檢查所針對(duì)的檢核對(duì)象是模型而非程序自身,任何在將程序向模型轉(zhuǎn)化的過程中所使用的抽象技術(shù)以及轉(zhuǎn)化工作都有也許使模型與程序不一致或者存在偏差,從而導(dǎo)致最終的檢查結(jié)果無法準(zhǔn)確反映實(shí)際程序中存在的錯(cuò)誤情況。更多關(guān)于模型檢查的進(jìn)一步討論可以參見[32]。支持模型檢查的代表性軟件分析工具為SLAM[23]、MOPS[24]、Bandera[25]和JavaPathFinder2[26]。2)定理證明(TheoremProving)。自動(dòng)定理證明通過將驗(yàn)證問題轉(zhuǎn)換為數(shù)學(xué)上的定理證明問題來判斷待分析程序是否滿足指定屬性[1],是眾多分析方法中最復(fù)雜最準(zhǔn)確的方法。然而,一階邏輯是半可鑒定的,理論分析結(jié)果表白,機(jī)械化的定理證明過程并不保證停機(jī)。此外,為了獲取指定的屬性以實(shí)現(xiàn)有效的證明,這些工具都規(guī)定程序員通過向源程序中添加特殊形式的注釋來描述程序的前置條件、后置條件以及循環(huán)不變量。這無疑增長了程序員的工作量,也導(dǎo)致該方法難以廣泛應(yīng)用于大型應(yīng)用程序。使用定理證明的代表性軟件分析工具為ESC[27]和ESC/Java[28]。3)約束求解(ConstraintSolving)?;诩s束求解的程序分析技術(shù)將程序代碼轉(zhuǎn)化為一組約束,并通過約束求解器獲得滿足約束的解[48]。初期的研究表白,面向途徑的測(cè)試數(shù)據(jù)生成可以很好地歸結(jié)為約束求解問題。后來,學(xué)者們又發(fā)現(xiàn)程序中不變式的分析也可以歸結(jié)為約束求解問題。最新的研究表白,許多其的程序分析問題也可以歸結(jié)為約束求解問題:由于從程序獲得的約束通常采用一階或二階的形式表達(dá),可以進(jìn)一步將其轉(zhuǎn)換成約束求解器可解決的形式。支持約束求解的代表性軟件分析工具為SAT/SMTSolver[49]。4)抽象解釋(AbstractInterpretation)。程序的抽象解釋就是使用抽象對(duì)象域上的計(jì)算逼近程序指稱的對(duì)象域上的計(jì)算,使得程序抽象執(zhí)行的結(jié)果可以反映出程序真實(shí)運(yùn)營的部分信息。抽象解釋本質(zhì)上是在計(jì)算效率和計(jì)算精度之間取得均衡,以損失計(jì)算精度求得計(jì)算可行性,再通過迭代計(jì)算增強(qiáng)計(jì)算精度的一種抽象逼近方法。通過不斷迭代,抽象解釋最終為程序建立一個(gè)抽象模型。假如抽象模型中不存在錯(cuò)誤,就證明其相應(yīng)的源程序中也不存在錯(cuò)誤。具有抽象解釋分析功能的代表性分析工具為Proverif[29]和ASTREE[30]。形式化支持的分析技術(shù)在分析軟件的某個(gè)性質(zhì)時(shí),需要一方面對(duì)該性質(zhì)進(jìn)行形式化的描述,然后將這個(gè)描述與軟件制品一起作為輸入提供應(yīng)分析工具。其中,模型檢查一方面被用于對(duì)軟件的模型進(jìn)行分析,后來有研究人員通過從代碼中提取模型,然后將模型檢查技術(shù)應(yīng)用于代碼分析。定理證明重要對(duì)靜態(tài)代碼比較合用。約束求解多用于輸入數(shù)據(jù)的生成。基于抽象解釋理論的形式化方法是對(duì)大規(guī)模軟件、硬件系統(tǒng)進(jìn)行自動(dòng)化分析與驗(yàn)證的有效途徑之一,已經(jīng)被廣泛地應(yīng)用于大型軟件與硬件系統(tǒng)的驗(yàn)證研究中。指向分析1)別名分析(AliasAnalysis)。別名分析重要用于擬定程序中不同的內(nèi)存引用(reference)是否指向內(nèi)存的相同區(qū)域。在編譯過程中,這可以幫助判斷一個(gè)語句將影響什么變量。例如,考慮如下的代碼:...;p.foo=1;q.foo=2;i=p.foo+3;...。假如p和q不是別名,那么i=p.foo+3;等價(jià)于i=4;假如p和q是別名,那么i=p.foo+3;等價(jià)于i=5;這樣就可以對(duì)代碼進(jìn)行等價(jià)優(yōu)化。別名分析又可以分為基于類型的分析與基于流的分析。前者重要用于類型安全(typesafe)的語言,后者則重要用于具有大量引用與類型轉(zhuǎn)換的語言[3]。2)指針分析(PointerAnalysis)。指針分析試圖擬定一個(gè)指針到底指向哪些對(duì)象或者存儲(chǔ)位置,特別是,在某個(gè)語句處是否也許為空。由于受到可鑒定性問題的限制,加上分析過程中時(shí)間、存儲(chǔ)等的限制,多數(shù)的指針分析方法都在分析過程中進(jìn)行“近似”或者“簡化”,并導(dǎo)致分析結(jié)果精確性不夠。事實(shí)上,上面的別名分析與下面的形態(tài)分析、逃逸分析都與指針分析密切相關(guān)。3)形態(tài)分析(ShapeAnalysis)。形態(tài)分析重要用于發(fā)現(xiàn)或者驗(yàn)證程序中動(dòng)態(tài)分派結(jié)構(gòu)的性質(zhì)。對(duì)于一個(gè)具體的程序,形態(tài)分析將為其構(gòu)造一個(gè)形態(tài)圖(shapegraph),用于列出每個(gè)指針也許指向的目的,以及目的之間的關(guān)系。形態(tài)分析可以認(rèn)為是指針分析的一種,但比一般的指針分析精確:形態(tài)分析可以擬定一個(gè)小一些但是更精確的指向集合。例如在Java程序中,可用來保證一個(gè)排序算法對(duì)的地對(duì)列表進(jìn)行了排序;在C程序中,可以用來分析一個(gè)內(nèi)存是否被對(duì)的地釋放。盡管形態(tài)分析很強(qiáng)大,但往往需要花費(fèi)較多的時(shí)間[4]。4)逃逸分析(EscapeAnalysis)。逃逸分析計(jì)算變量的可達(dá)邊界。對(duì)于一個(gè)方法m中的一個(gè)變量,假如變量是在調(diào)用方法m時(shí)創(chuàng)建的,但在m的生命周期之外可以獲得該變量,我們就說這個(gè)變量逃逸了方法m。類似地,一個(gè)變量逃逸了一個(gè)線程t,假如在t之外的一個(gè)點(diǎn)能通過一個(gè)引用訪問到該變量。逃逸分析傳統(tǒng)上被用于查找一些變量,它們只存在于為它們分派內(nèi)存的方法或線程的生命周期內(nèi):前者允許變量在運(yùn)營時(shí)的棧(stack)上,而不是堆(heap)上分派內(nèi)存,這樣就可以減少堆的碎片與垃圾回收負(fù)載。后者被用于進(jìn)行優(yōu)化,以避免高成本的異步操作。逃逸分析檢查引用的賦值與使用(assignmentsanduses)以計(jì)算每個(gè)變量的逃逸狀態(tài)。每個(gè)變量可以被賦予3個(gè)也許逃逸狀態(tài)中的一個(gè):全局逃逸、參數(shù)逃逸或者捕獲。當(dāng)一個(gè)變量是全局可達(dá)的(例如被賦值給了一個(gè)靜態(tài)域)時(shí),這個(gè)變量被標(biāo)記為全局逃逸;假如變量是通過參數(shù)或者被返回給調(diào)用者方法,它被標(biāo)記為參數(shù)逃逸;一個(gè)不逃逸的變量被標(biāo)記為捕獲。逃逸分析重要用于效率分析[22]。與基本分析技術(shù)相比,指向分析通常與應(yīng)用程序的某個(gè)特定性質(zhì)密切相關(guān)。這類分析一般是以基本分析(特別是數(shù)據(jù)流分析)為重要分析框架,為了提高分析精度而提出的技術(shù),且分別結(jié)合了編程語言的不同特點(diǎn)。例如:別名分析運(yùn)用的變量引用、形態(tài)分析運(yùn)用的指針等等。這也導(dǎo)致了這些分析技術(shù)分別適合由不同編程語言實(shí)現(xiàn)的程序。此外,這些分析技術(shù)盡管可以自動(dòng)進(jìn)行,但在分析之前通常需要較多的人工介入,例如,指定對(duì)哪些變量進(jìn)行分析、提供對(duì)什么性質(zhì)進(jìn)行分析等等。其它輔助分析1)符號(hào)執(zhí)行(SymbolicExecution)。符號(hào)執(zhí)行通過使用抽象的符號(hào)表達(dá)程序中變量的值來模擬程序的執(zhí)行[14,31]。其特點(diǎn)在于通過跟蹤被模擬的各條執(zhí)行途徑上變量的實(shí)際取值,把分析工作局限在實(shí)際可達(dá)的途徑上,從而使得到的結(jié)果更貼近程序?qū)嶋H執(zhí)行情況,并為程序員提供更為準(zhǔn)確的與檢出的缺陷相關(guān)的上下文信息。但是由于需要窮舉各條也許執(zhí)行的途徑,該技術(shù)需要解決的工作量隨著程序規(guī)模的增大而呈指數(shù)級(jí)別增長。雖然符號(hào)執(zhí)行方法可以被應(yīng)用于大型程序的分析,其分析結(jié)果的可靠性仍依賴于所允許的分析時(shí)間和對(duì)途徑及其數(shù)目的選擇等方面。2)切片分析(SlicingAnalysis)。切片分析用于從源程序中抽取對(duì)程序中愛好點(diǎn)上的特定變量有影響的語句和謂詞,組成新的程序(稱作切片),然后通過度析切片來分析源程序的行為[42]。計(jì)算程序切片的方法重要有兩種:根據(jù)數(shù)據(jù)流方程計(jì)算和根據(jù)依賴圖關(guān)系計(jì)算。切片分析技術(shù)已被廣泛應(yīng)用于程序分析、理解、調(diào)試、測(cè)試、軟件維護(hù)等過程[38,39]。3)結(jié)構(gòu)分析(StructureAnalysis)。結(jié)構(gòu)分析的目的是獲得程序的調(diào)用關(guān)系圖(CallGraph),以展示程序中各個(gè)函數(shù)之間的調(diào)用關(guān)系。把程序中每個(gè)函數(shù)當(dāng)作一個(gè)節(jié)點(diǎn),再分析每個(gè)函數(shù)調(diào)用了哪些其他函數(shù),并在存在調(diào)用關(guān)系的函數(shù)間建立一條邊,就可以得到調(diào)用關(guān)系圖。調(diào)用關(guān)系圖通常用于輔助開發(fā)人員理解程序。對(duì)于面向?qū)ο蟪绦?,程序的結(jié)構(gòu)分析還涉及從程序中獲取類圖(classdiagram)等。除了一些編譯器支持結(jié)構(gòu)分析外,目前軟件開發(fā)過程中的一些工具,例如IBMRationalRose等也可以對(duì)以開發(fā)出的代碼進(jìn)行結(jié)構(gòu)分析。4)克隆分析(CloneAnalysis)。代碼克隆(Codeclone)是指軟件開發(fā)中由于復(fù)制、粘貼引起的反復(fù)代碼現(xiàn)象。研究指出,一般商業(yè)軟件中存在5%至20%的反復(fù)代碼[1]。由于克隆代碼的普遍性以及克隆代碼對(duì)代碼質(zhì)量的重要影響,代碼克隆相關(guān)研究是靜態(tài)代碼分析領(lǐng)域近年來一個(gè)十分活躍的研究分支。重要研究內(nèi)容涉及:克隆代碼檢測(cè)、由代碼克隆引起的代碼缺陷診斷、通過代碼重構(gòu)來減少代碼克隆、克隆代碼跟蹤、基于代碼克隆的源代碼演化分析等等。代碼克隆分析有十分豐富的實(shí)際應(yīng)用價(jià)值,比如缺陷診斷、重構(gòu)、代碼理解、源代碼演化分析和代碼抄襲檢查等等。克隆代碼可以分為如下四類:1)除空格、回車以及注解之外完全相同的代碼片段;2)除空格、回車、注解以及變量名及常量值替換外,語法結(jié)構(gòu)完全相同的代碼片段;3)除空格、回車、注解以及變量名及常量值替換外,語法結(jié)構(gòu)基本相同,但具有少量語句的增長、刪除或修改的代碼片段;4)兩段或多段代碼具有相同或相似的功能,或者說相似的輸入、輸出條件。其中,最后一類比較特殊,是語義(功能)相似性,其它三類都是文本相似性[5-17]。動(dòng)態(tài)分析動(dòng)態(tài)分析是通過運(yùn)營具體程序并獲取程序的輸出或者內(nèi)部狀態(tài)等信息來驗(yàn)證或者發(fā)現(xiàn)軟件性質(zhì)的過程。與靜態(tài)分析相比,動(dòng)態(tài)分析具有如下幾方面特點(diǎn):1)需要運(yùn)營系統(tǒng),因此通常要向系統(tǒng)輸入具體的數(shù)據(jù);2)由于有具體的數(shù)據(jù),因此分析結(jié)果更精確,但同時(shí)只是對(duì)于特定輸入情況精確,對(duì)于其它輸入的情況則不能保證。本文從運(yùn)營信息的獲得途徑與獲得時(shí)機(jī)兩個(gè)方面對(duì)動(dòng)態(tài)分析進(jìn)行介紹。在信息獲得的時(shí)機(jī)上,又根據(jù)軟件是否已經(jīng)上線投入使用將軟件的動(dòng)態(tài)分析劃分為兩大類:離線動(dòng)態(tài)測(cè)試/驗(yàn)證(OfflineDynamicTesting/Verification)與在線監(jiān)測(cè)(OnlineMonitoring)。所謂離線動(dòng)態(tài)測(cè)試/驗(yàn)證,是指在系統(tǒng)還沒有正式上線時(shí)對(duì)軟件進(jìn)行運(yùn)營、分析,分析過程中可以隨意輸入數(shù)據(jù),并盡量模擬實(shí)際用戶的操作。所謂在線監(jiān)測(cè),是指在系統(tǒng)已經(jīng)上線后對(duì)軟件系統(tǒng)進(jìn)行分析,監(jiān)測(cè)過程中一般不能隨意輸入數(shù)據(jù),所有數(shù)據(jù)都是真實(shí)的。離線動(dòng)態(tài)測(cè)試/驗(yàn)證、在線監(jiān)測(cè)與運(yùn)營信息獲取之間的基本關(guān)系見圖3。圖3動(dòng)態(tài)分析涉及的重要技術(shù)運(yùn)營信息的獲取途徑從程序的正常輸出中獲取信息每個(gè)程序在運(yùn)營過程中都會(huì)產(chǎn)生許多輸出信息。有些輸出是程序運(yùn)營中間或者結(jié)束時(shí)輸出的正常結(jié)果,有些是一些提醒信息,尚有一些是日記信息。通過將最終得到的實(shí)際輸出結(jié)果與事先設(shè)定的盼望輸出結(jié)果進(jìn)行對(duì)比、分析,就可以得到關(guān)于軟件的有價(jià)值信息。通過插裝代碼獲取信息僅僅通過觀測(cè)程序的正常輸出對(duì)于了解軟件的運(yùn)營信息往往是不夠的。例如,軟件運(yùn)營過程中內(nèi)部變量的狀態(tài)信息、某個(gè)特定類型的實(shí)例信息、模塊之間的交互信息等等。這些信息對(duì)于發(fā)現(xiàn)缺陷,以及定位缺陷特別重要。獲得這些內(nèi)部信息的自然方式是在軟件中插裝監(jiān)測(cè)代碼(MonitoringCode),通過這些監(jiān)測(cè)代碼就可以獲得相應(yīng)的信息。重要的監(jiān)測(cè)代碼插裝方法可以分為如下三類:源碼插裝。這是最自然的插裝方式,即在編寫應(yīng)用系統(tǒng)時(shí),在需要監(jiān)測(cè)的地方直接加上監(jiān)測(cè)代碼,例如,增長輸出信息語句、增長日記語句等等。AOP(AspectOrientedProgramming)技術(shù)出現(xiàn)之后,人們發(fā)現(xiàn)AOP可以被很好地用于代碼插裝,以有效地分離系統(tǒng)的業(yè)務(wù)邏輯與監(jiān)測(cè)邏輯[43]。靜態(tài)目的碼插裝。近年來字節(jié)碼插裝技術(shù)在Java社區(qū)中十分流行。字節(jié)碼插裝可以在靜態(tài)直接更改中間代碼文獻(xiàn)(例如Java的.class文獻(xiàn))或在裝載時(shí)刻進(jìn)行字節(jié)碼插裝。字節(jié)碼插裝所具有的執(zhí)行效率高、插裝點(diǎn)靈活、應(yīng)用范圍廣等特點(diǎn),使其被廣泛應(yīng)用于AOP等研究領(lǐng)域,并陸續(xù)出現(xiàn)了BCEL[64]、Javassist[65]、ASM[66]等多種字節(jié)碼操縱工具。基于截取器(Interceptor)的獲取方式。截取器處在調(diào)用者和被調(diào)用者之間,可以截獲兩者之間傳遞的消息,從而完畢一些特定的解決工作。由于這種獲取方式不需要直接修改目的程序,代碼侵入性較弱,甚至可以在運(yùn)營階段部署,因此得到了越來越廣泛的使用。Tomcat服務(wù)器、EJB3規(guī)范、Spring框架中都有截取器的實(shí)現(xiàn)[40]。通過平臺(tái)接口獲取信息向目的系統(tǒng)插裝監(jiān)測(cè)代碼可以很方便地獲得內(nèi)部信息。假如底層的運(yùn)營平臺(tái)(操作系統(tǒng)、JVM、中間件、或者數(shù)據(jù)庫管理系統(tǒng)等)提供很好的支持,則許多信息獲取起來就更加方便。例如,許多研究人員通過開發(fā)特殊的JAVA虛擬機(jī)來獲取所需要的監(jiān)測(cè)信息。JPF[50]、QVM[51]等就是典型代表。目前標(biāo)準(zhǔn)的JVM自身也提供了許多供調(diào)試、監(jiān)測(cè)的接口,例如JVMTI[52]等等。離線動(dòng)態(tài)測(cè)試/驗(yàn)證離線的動(dòng)態(tài)測(cè)試與動(dòng)態(tài)驗(yàn)證都需要在離線的情況下運(yùn)營程序,并獲取、分析運(yùn)營信息,因此兩者有比較密切的聯(lián)系。不僅如此,為發(fā)現(xiàn)更多的軟件缺陷,離線動(dòng)態(tài)驗(yàn)證與動(dòng)態(tài)測(cè)試都需要仔細(xì)準(zhǔn)備輸入數(shù)據(jù)。此外,假如將程序的輸出與輸入之間的關(guān)系看作一種約束需求,或者在分析測(cè)試結(jié)果時(shí)也收集日記等內(nèi)部信息的話,兩者就更接近了。從不同之處看,離線動(dòng)態(tài)驗(yàn)證一般比測(cè)試收集更多的內(nèi)部信息、關(guān)注更多的約束需求,并且往往運(yùn)用一些輕權(quán)(lightweight)的形式化方法來描述這些需求。從研究內(nèi)容看,離線動(dòng)態(tài)測(cè)試/驗(yàn)證重要關(guān)注三個(gè)方面的內(nèi)容:輸入數(shù)據(jù)生成、約束描述、運(yùn)營軌跡分析。輸入數(shù)據(jù)生成。為了盡也許多地發(fā)現(xiàn)潛在的缺陷,在運(yùn)營程序之前通常需要一方面靜態(tài)地分析目的程序,根據(jù)驗(yàn)證目的(什么功能、什么約束、等等)輔助用戶生成和選擇輸入數(shù)據(jù)。約束描述。運(yùn)用形式化方法描述軟件約束,以便于分析可以自動(dòng)進(jìn)行。目前多數(shù)動(dòng)態(tài)驗(yàn)證研究人員運(yùn)用線性時(shí)序邏輯(LTL:LinearTemporalLogic)來描述。運(yùn)營軌跡分析。程序運(yùn)營過程中產(chǎn)生的內(nèi)部、外部數(shù)據(jù)也許是大量的,需要測(cè)試/驗(yàn)證目的對(duì)數(shù)據(jù)進(jìn)行必要的過濾,然后分析這些數(shù)據(jù)以推斷程序的執(zhí)行軌跡,并進(jìn)一步判斷程序的執(zhí)行是否遵循程序的約束。在線監(jiān)測(cè)與離線動(dòng)態(tài)驗(yàn)證相比,在線監(jiān)測(cè)有幾個(gè)特點(diǎn):1)系統(tǒng)輸入由實(shí)際的真實(shí)用戶與系統(tǒng)擁有者共同決定;2)系統(tǒng)擁有者的輸入是受限制的,一些在上線之前可以做的實(shí)驗(yàn)(例如:壓力測(cè)試、安全性測(cè)試等)此時(shí)不能隨意實(shí)行,否則就會(huì)威脅到系統(tǒng)正常的服務(wù)質(zhì)量;3)監(jiān)測(cè)代碼往往就是應(yīng)用系統(tǒng)的組成部分。這使得在線監(jiān)測(cè)與前面介紹的各種分析都非常的不同:前面介紹的分析技術(shù)一般都由特定的分析工具支持,分析工具是一種外部輔助工具,在系統(tǒng)上線后,分析工具就與系統(tǒng)分離了。而在線監(jiān)測(cè)則也許一直隨著系統(tǒng)的服務(wù)過程,并且也許是在系統(tǒng)上線之后,在不同的維護(hù)階段增長上去的。有研究人員因此提出了面向監(jiān)測(cè)的編程(MOP)[37]。在分析機(jī)制上,在線監(jiān)測(cè)的分析可以采用內(nèi)聯(lián)模式(inline)或者外聯(lián)模式(outline)。在內(nèi)聯(lián)監(jiān)測(cè)模式中,監(jiān)測(cè)代碼(monitor)與被監(jiān)測(cè)程序運(yùn)營在相同的空間中,因此執(zhí)行效率相對(duì)要高,且發(fā)現(xiàn)異常后響應(yīng)要快。在外聯(lián)監(jiān)測(cè)模式中,監(jiān)測(cè)代碼運(yùn)營在獨(dú)立的運(yùn)營空間中,比如此外一臺(tái)機(jī)器或者CPU。外聯(lián)模式效率要低一些,但可以對(duì)多項(xiàng)監(jiān)測(cè)內(nèi)容進(jìn)行綜合解決,因此可以做更進(jìn)一步的分析。對(duì)于在線系統(tǒng),假如要監(jiān)測(cè)它,就一定會(huì)影響它。假如影響過大,就也許給正常的服務(wù)過程帶來負(fù)面作用。因此,衡量在線監(jiān)測(cè)技術(shù)的一個(gè)重要指標(biāo)是監(jiān)測(cè)開銷,特別是運(yùn)營開銷。許多監(jiān)測(cè)的時(shí)間開銷甚至高于程序自身的運(yùn)營開銷。由于在線監(jiān)測(cè)一定會(huì)對(duì)監(jiān)測(cè)對(duì)象的運(yùn)營產(chǎn)生影響,因此監(jiān)測(cè)的結(jié)果也一定是被影響后系統(tǒng)的表現(xiàn),而不是被監(jiān)測(cè)對(duì)象自身的表現(xiàn)。針對(duì)這個(gè)現(xiàn)象,有些研究人員參照物理學(xué)中的測(cè)不準(zhǔn)原理提出了軟件的測(cè)不準(zhǔn)原理[34]。需要特別注意的是,在系統(tǒng)上線之后,有價(jià)值的監(jiān)測(cè)通常不僅僅針對(duì)軟件自身,而是針對(duì)由軟件、硬件組成的服務(wù)系統(tǒng),甚至涉及與服務(wù)系統(tǒng)交互的環(huán)境(用例圖中的Actor)[35]。例如:客戶程序的調(diào)用序列、系統(tǒng)的響應(yīng)時(shí)間等等。在這個(gè)意義上,在線監(jiān)測(cè)不僅僅是努力發(fā)現(xiàn)軟件的缺陷,并且關(guān)注服務(wù)過程的潛在問題(例如:響應(yīng)時(shí)間是否足夠???是否發(fā)現(xiàn)可疑的襲擊行為?)。因此,隨著Web服務(wù)技術(shù)、軟件作為服務(wù)(SaaS:SoftwareasaService)的推廣,在線監(jiān)測(cè)正受到越來越多研究人員的關(guān)注[33]。此外,多核解決器的發(fā)展,也為監(jiān)測(cè)提供了更多的途徑:由于業(yè)務(wù)邏輯與監(jiān)測(cè)邏輯相對(duì)分離,完全可以由不同的核分別進(jìn)行業(yè)務(wù)解決與監(jiān)測(cè)解決。對(duì)軟件內(nèi)部的監(jiān)測(cè)。對(duì)軟件內(nèi)部的監(jiān)測(cè)方法與運(yùn)營時(shí)驗(yàn)證的方法比較接近,上面提到的各種插裝技術(shù)對(duì)于在線監(jiān)測(cè)都合用。不僅如此,對(duì)于在線系統(tǒng),還可以運(yùn)用在線升級(jí)(upgrading)的技術(shù)[36],或者動(dòng)態(tài)編織(weaving)技術(shù)[41]等將監(jiān)測(cè)代碼“在線”地部署到目的系統(tǒng)中,以加強(qiáng)監(jiān)測(cè)的覆蓋面;或者從系統(tǒng)中移除監(jiān)測(cè)代碼,以減少監(jiān)測(cè)開銷。除此之外,尚有許多對(duì)實(shí)例的監(jiān)測(cè),例如:負(fù)責(zé)客戶連接對(duì)象的實(shí)例數(shù)目、負(fù)責(zé)數(shù)據(jù)庫連接的實(shí)例數(shù)目等等。對(duì)外部交互的監(jiān)測(cè)。重要監(jiān)測(cè)對(duì)象涉及:來自客戶程序的請(qǐng)求消息順序是否對(duì)的?參數(shù)值是否在允許的范圍內(nèi)?請(qǐng)求者的權(quán)限是否夠(與安全相關(guān))?應(yīng)答消息的參數(shù)值是否在允許的范圍內(nèi)?從收到請(qǐng)求消息到發(fā)出應(yīng)答消息的響應(yīng)時(shí)間是否符合規(guī)定?管理人員的操作是否合法?等等。對(duì)運(yùn)營環(huán)境的監(jiān)測(cè)。對(duì)運(yùn)營環(huán)境的監(jiān)測(cè)重要體現(xiàn)為對(duì)底層資源的監(jiān)測(cè),通常是獨(dú)立于具體應(yīng)用的監(jiān)測(cè)內(nèi)容,例如:CPU的使用情況、內(nèi)存使用情況、網(wǎng)絡(luò)帶寬等等。對(duì)于越來越多的嵌入式系統(tǒng),由于各種資源都有較大的限制,監(jiān)測(cè)就顯得更加重要。分析技術(shù)的評(píng)價(jià)面對(duì)種類眾多的軟件分析技術(shù),人們通常不僅希望能了解它們,還希望對(duì)它們進(jìn)行評(píng)價(jià)、比較,以在其中選擇選擇合適自己當(dāng)前任務(wù)的分析技術(shù)。事實(shí)上,由于這些技術(shù)錯(cuò)綜復(fù)雜,對(duì)它們的評(píng)價(jià)自身也是一個(gè)十分值得研究的題目。目前人們比較關(guān)注的評(píng)價(jià)準(zhǔn)則有:誤報(bào)率(Falsepositiverate)、漏報(bào)率(Falsenegativerate),精度(Precision)、速度(Speed)、等等。誤報(bào)率與漏報(bào)率。誤報(bào)是指當(dāng)軟件不存在某個(gè)缺陷時(shí),分析工具報(bào)告軟件也許存在某個(gè)缺陷。大量的誤報(bào)將導(dǎo)致大量的人工分析工作:人們必須手工判斷系統(tǒng)是否真的存在某個(gè)缺陷。漏報(bào)是指軟件中存在某個(gè)缺陷,但分析工具沒有報(bào)告這個(gè)缺陷。將報(bào)告結(jié)果與缺陷的實(shí)際情況進(jìn)行對(duì)比,就可以得到具體的量化指標(biāo):誤報(bào)率與漏報(bào)率。誤報(bào)率與漏報(bào)率是目前評(píng)價(jià)分析工具的兩個(gè)最重要的指標(biāo):一個(gè)工具的誤報(bào)率與漏報(bào)率越小,說明這個(gè)分析工具越好。但實(shí)際情況往往是:有的方法在減少誤報(bào)率方面很有效,但往往同時(shí)增長了漏報(bào)率;而有的方法在減少漏報(bào)率方面很有效,但卻抬高了誤報(bào)率[1]。誤報(bào)率與漏報(bào)率的反面說法分別是查準(zhǔn)率(Precision)與查全率(Recall)。一般來說,靜態(tài)分析可以比較全面地考慮執(zhí)行途徑,因此可以比動(dòng)態(tài)分析發(fā)現(xiàn)更多的缺陷,漏報(bào)率比動(dòng)態(tài)分析低;但動(dòng)態(tài)分析由于獲取了具體的運(yùn)營信息,因此報(bào)出的缺陷一般更為準(zhǔn)確,誤報(bào)率比靜態(tài)分析低。精度與速度。為了提高分析的精度,即減少誤報(bào)率與漏報(bào)率,實(shí)際的靜態(tài)分析工具往往綜合運(yùn)用多種分析技術(shù),并需要做一些較進(jìn)一步的分析,這自然意味著更長的分析時(shí)間。因此,分析的精度與分析的速度往往也是一對(duì)不可兼得的矛盾體,必須在兩者之間進(jìn)行折中。此外,動(dòng)態(tài)分析由于往往一次只關(guān)注少部分的軟件性質(zhì),因此精度可以更高一些,并且受程序規(guī)模的限制較??;而靜態(tài)分析在程序運(yùn)營之前就可以實(shí)行,因此可以更早地發(fā)現(xiàn)問題。軟件分析與質(zhì)量保障軟件分析的一個(gè)重要應(yīng)用是保障軟件質(zhì)量:通過度析某個(gè)軟件,查找出其中包含的軟件缺陷,就可以讓開發(fā)人員修改軟件,將缺陷修復(fù),從而提高軟件質(zhì)量。ISO9126提出了一個(gè)兩層、六類的質(zhì)量模型,涉及:1)功能性(含:適合性、準(zhǔn)確性、互操作性、保密安全性);2)可靠性(含:成熟性、容錯(cuò)性、易恢復(fù)性);3)易用性分析(含:易理解性、易學(xué)性、易操作性、吸引性);4)效率(含:時(shí)間特性、資源運(yùn)用性);5)易維護(hù)性(含:易分析性、易改變性、穩(wěn)定性、易測(cè)試性);6)可移植性(含適應(yīng)性、易安裝性、共存性、易替換性)。本文以ISO9126的分類為基礎(chǔ),從軟件分析的角度出發(fā),結(jié)合上面的質(zhì)量屬性,歸納出5種相對(duì)并列的軟件質(zhì)量屬性:對(duì)的性(Correctness)、健壯性(Robustness)、安全性(Security)、效率(Efficiency)、易維護(hù)性(Maintenance)。當(dāng)然,這5種屬性之間不是完全正交的,它們之間存在著一些不同形式的關(guān)聯(lián)。本節(jié)重要介紹如何運(yùn)用上一節(jié)中提到的一些分析技術(shù)對(duì)這些屬性進(jìn)行分析。特別是,如何運(yùn)用這些技術(shù)發(fā)現(xiàn)相應(yīng)的質(zhì)量問題。3.1軟件對(duì)的性“對(duì)的性”重要指程序的運(yùn)營結(jié)果是否與預(yù)期值相同。假如不相同,則視為結(jié)果不對(duì)的,該程序包含一個(gè)“對(duì)的性”錯(cuò)誤。對(duì)的性的考慮比較單純,重要是從輸入到輸出這個(gè)函數(shù)映射的角度看待計(jì)算過程,特別關(guān)心輸出結(jié)果的對(duì)的與否,而不考慮輸入數(shù)據(jù)的具體來源與錯(cuò)誤輸出結(jié)果的后果如何。與對(duì)的性相對(duì)的是健壯性與安全性:對(duì)的性考慮的是軟件是否按照預(yù)先的設(shè)定執(zhí)行,健壯性與安全性則考慮軟件是否在一定條件下執(zhí)行設(shè)定之外的事情。動(dòng)態(tài)測(cè)試/驗(yàn)證動(dòng)態(tài)測(cè)試/驗(yàn)證是發(fā)現(xiàn)對(duì)的性缺陷最有效的手段。對(duì)于任何一個(gè)稍具規(guī)模的軟件而言,窮舉所有也許輸入的測(cè)試/驗(yàn)證都是不現(xiàn)實(shí)的。因此,對(duì)于發(fā)現(xiàn)與對(duì)的性有關(guān)的缺陷而言,測(cè)試/驗(yàn)證的關(guān)鍵在于生成有較強(qiáng)揭示錯(cuò)誤能力的輸入數(shù)據(jù),并通過程序的執(zhí)行最終檢測(cè)與對(duì)的性相關(guān)的缺陷。基于程序分析的數(shù)據(jù)輸入生成技術(shù)大體可以分為面向途徑的測(cè)試用例生成[56]和面向目的的測(cè)試用例生成[57]。面向途徑的測(cè)試數(shù)據(jù)生成是指給定程序的一條執(zhí)行途徑,生成一個(gè)恰好執(zhí)行該條路經(jīng)的測(cè)試用例。面向途徑的測(cè)試用例生成可以轉(zhuǎn)化為約束求解問題。面向目的的測(cè)試用例生成是指,給定測(cè)試的某個(gè)目的(比如語句覆蓋),生成一組可以達(dá)成該目的的測(cè)試用例。面向目的的測(cè)試用例生成通常以面向途徑的測(cè)試用例生成為基礎(chǔ),其基本思緒是將面向目的的測(cè)試用例生成轉(zhuǎn)化成面向途徑的測(cè)試用例生成甚至直接轉(zhuǎn)化成約束求解問題。多數(shù)情況下,一種測(cè)試用例生成技術(shù)并不僅針對(duì)與對(duì)的性有關(guān)的缺陷,同時(shí)也會(huì)兼顧與健壯性有關(guān)的缺陷。靜態(tài)分析靜態(tài)分析也是發(fā)現(xiàn)與對(duì)的性有關(guān)缺陷的重要途徑。靜態(tài)分析的基本思緒是建立一些與對(duì)的性有關(guān)的形式化規(guī)約,然后檢查軟件是否滿足這些規(guī)約。靜態(tài)分析可以不針對(duì)軟件的特定輸入發(fā)現(xiàn)一類缺陷,因此在很大限度上可以與測(cè)試互為補(bǔ)充。3.2軟件健壯性“健壯性”重要是指系統(tǒng)是否能控制軟件內(nèi)外客觀不良事件的發(fā)生,以保持系統(tǒng)的基本服務(wù)質(zhì)量。例如,是否會(huì)發(fā)生因死鎖而導(dǎo)致系統(tǒng)不工作、是否由于內(nèi)存泄漏而導(dǎo)致系統(tǒng)崩潰、是否因產(chǎn)生數(shù)據(jù)競(jìng)爭而導(dǎo)致系統(tǒng)出現(xiàn)錯(cuò)誤狀態(tài)等等。健壯性與對(duì)的性之間存在一定的關(guān)聯(lián):一方面,不對(duì)的的輸出有也許影響包含軟件的系統(tǒng)整體上的健壯性;另一方面,因系統(tǒng)崩潰等因素導(dǎo)致“得不到結(jié)果”有時(shí)也被認(rèn)為是“不對(duì)的”的一種特殊表現(xiàn)。與“健壯性”比較接近的一個(gè)術(shù)語是“可靠性”(Reliability)。后者目前被認(rèn)為重要是指在規(guī)定運(yùn)營環(huán)境下、規(guī)定期間內(nèi),軟件無失效運(yùn)營的概率,并且是評(píng)價(jià)軟件對(duì)的性的一種重要途徑[55]。由于這個(gè)概念與對(duì)的性在內(nèi)涵上重合較大,因此本文采用“健壯性”這個(gè)與對(duì)的性在內(nèi)涵上重合較小的概念作為從分析角度上劃分的質(zhì)量屬性之一。動(dòng)態(tài)測(cè)試/驗(yàn)證動(dòng)態(tài)測(cè)試/驗(yàn)證是發(fā)現(xiàn)健壯性的一個(gè)重要手段。與針對(duì)軟件對(duì)的性的測(cè)試類似,這方面軟件分析的重點(diǎn)也在于輸入數(shù)據(jù)(測(cè)試用例)生成。不同的是,針對(duì)軟件健壯性的生成的目的是生成不對(duì)的的輸入,并檢查這些輸入是否會(huì)導(dǎo)致非盼望的結(jié)果。模型檢查將模型檢查應(yīng)用于健壯性分析的最典型例子是死鎖(deadlock)檢查。死鎖[58]是指多個(gè)進(jìn)程(線程)因互相等待而不能完畢計(jì)算任務(wù)。死鎖通常是進(jìn)程(線程)在競(jìng)爭資源時(shí)產(chǎn)生的:每個(gè)進(jìn)程(線程)擁有一些資源同時(shí)等待其他進(jìn)程(線程)擁有的某些資源,每個(gè)進(jìn)程(線程)都因不能擁有所需的所有資源而無法繼續(xù)進(jìn)展。模型檢查可以對(duì)軟件也許的狀態(tài)進(jìn)行窮舉、分析,從而判斷軟件是否也許進(jìn)入死鎖狀態(tài)。指向分析軟件的許多健壯性問題與指針相關(guān)。因此,指向類分析對(duì)于健壯性保障十分重要。例如內(nèi)存泄漏(memoryleak)問題。內(nèi)存泄漏是指因內(nèi)存使用后沒有釋放而引起的可用內(nèi)存的異常消耗[59]。嚴(yán)重的內(nèi)存泄漏會(huì)導(dǎo)致軟件系統(tǒng)因可用內(nèi)存消耗殆盡而崩潰。靜態(tài)的內(nèi)存泄露檢測(cè)重要檢查軟件中每個(gè)內(nèi)存申請(qǐng)語句是否有相應(yīng)的內(nèi)存釋放語句,以及軟件是否存在內(nèi)存申請(qǐng)語句和內(nèi)存釋放語句不匹配的途徑。動(dòng)態(tài)的內(nèi)存泄露檢測(cè)重要分析內(nèi)存的使用情況,檢查內(nèi)存的使用上是否存在一些與內(nèi)存泄露以有關(guān)的現(xiàn)象。例如,面向?qū)ο蟪绦蛑械膬?nèi)存泄漏往往會(huì)導(dǎo)致某些類的對(duì)象的數(shù)目會(huì)隨軟件的執(zhí)行而不斷增長,跟蹤每個(gè)類的對(duì)象的數(shù)目可以輔助內(nèi)存泄漏的檢測(cè)。3.3軟件安全性“安全性”重要指軟件是否存在安全漏洞,是否會(huì)由于人為襲擊,導(dǎo)致信息泄露(保密性)、數(shù)據(jù)損失(完整性)或者系統(tǒng)不能正常工作(可用性)等不良后果。安全性與健壯性之間的重要區(qū)別在于:導(dǎo)致系統(tǒng)不安全的因素是人為因素,而導(dǎo)致系統(tǒng)不健壯的因素是軟件自身。此外,兩者之間也存在關(guān)聯(lián):許多系統(tǒng)由于健壯性存在缺陷(例如:字符串溢出)而導(dǎo)致安全性缺陷(惡意注入)。靜態(tài)代碼漏洞查找輸入驗(yàn)證。這里的輸入不僅僅是用戶的輸入,還涉及:配置文獻(xiàn)、從數(shù)據(jù)庫檢索出的數(shù)據(jù)、命令行參數(shù)、環(huán)境變量、網(wǎng)絡(luò)消息等等。在一個(gè)軟件系統(tǒng)中,接受這些輸入的接口集通常被稱為應(yīng)用程序的襲擊面。SQL注入、腳本注入、跨站點(diǎn)襲擊等都是這類襲擊。通過相應(yīng)用程序進(jìn)行分析,可以自動(dòng)發(fā)現(xiàn)應(yīng)用系統(tǒng)的可信邊界,還可以發(fā)現(xiàn)邊界上的點(diǎn)是否由于缺少有效的驗(yàn)證而存在安全漏洞。溢出襲擊。由于緩沖區(qū)溢出很容易被襲擊者用來重寫內(nèi)存中的數(shù)據(jù),并非法獲取一些權(quán)限,因此許多惡意者運(yùn)用緩沖區(qū)溢出進(jìn)行襲擊。緩沖區(qū)溢出通常是由一些特殊的函數(shù)導(dǎo)致的。例如C語言中的gets(),scaf(),strcpy(),sprintf()等。靜態(tài)分析可以發(fā)揮的地方涉及:分析是否使用了不必要的高風(fēng)險(xiǎn)函數(shù)、是否存在多次內(nèi)存釋放操作等。其中,內(nèi)存釋放等問題往往涉及別名分析。隱私信息。多數(shù)程序中存在需要隱藏的內(nèi)容。不嚴(yán)謹(jǐn)?shù)木幊倘藛T很容易在程序總不經(jīng)意地泄露相關(guān)的信息,導(dǎo)致系統(tǒng)被襲擊。例如:將私密數(shù)據(jù)放到日記中,程序中硬編碼了密碼信息,向?yàn)g覽器返回過于具體的犯錯(cuò)信息,隨機(jī)數(shù)的產(chǎn)生規(guī)則過于簡樸,選擇的加密算法不夠安全等等。靜態(tài)分析可以幫助編程人員發(fā)現(xiàn)這些漏洞。安全性測(cè)試安全性測(cè)試通過運(yùn)營軟件、模擬惡意用戶的輸入來分析系統(tǒng)的安全性。一些重要考慮的問題有兩類:權(quán)限相關(guān)的安全性與網(wǎng)絡(luò)相關(guān)的安全性。權(quán)限相關(guān)的安全性涉及:是否明確地區(qū)分系統(tǒng)中不同用戶權(quán)限?系統(tǒng)中會(huì)不會(huì)出現(xiàn)用戶沖突?系統(tǒng)會(huì)不會(huì)因用戶的權(quán)限的改變導(dǎo)致混亂?是否可以通過絕對(duì)途徑登陸系統(tǒng)?等等。與網(wǎng)絡(luò)相關(guān)的安全性涉及:系統(tǒng)的補(bǔ)丁是否打上?模擬非授權(quán)襲擊,看防護(hù)系統(tǒng)是否堅(jiān)固?系統(tǒng)中是否存在某些安全漏洞?等等。入侵檢測(cè)入侵檢測(cè)系統(tǒng)(IDS:IntrusionDetectionSystem)是一種對(duì)網(wǎng)絡(luò)傳輸進(jìn)行即時(shí)監(jiān)視,在發(fā)現(xiàn)可疑傳輸時(shí)發(fā)出警報(bào)或者采用積極反映措施的防御手段。通過度析襲擊模式(例如某個(gè)特定的操作序列)可以判斷是否是一個(gè)潛在的襲擊。此外,傳統(tǒng)的身份認(rèn)證與授權(quán)事實(shí)上也是以實(shí)時(shí)監(jiān)測(cè)調(diào)用者的角色來保證某些特殊的操作只能由通過授權(quán)的用戶來調(diào)用。類似的技術(shù)尚有監(jiān)測(cè)調(diào)用者的系列、與入侵操作模式進(jìn)行對(duì)比等等,以發(fā)現(xiàn)潛在的入侵行為。3.4軟件效率“效率”涉及時(shí)間效率與空間效率。在時(shí)間效率方面,用戶的響應(yīng)時(shí)間要小、吞吐量要大;所謂空間效率方面,運(yùn)營過程中占用資源要少,特別是內(nèi)存資源。由于初期CPU的計(jì)算能力有限,內(nèi)存容量也有限,因此程序的效率問題在初期很受重視:算法復(fù)雜性的研究長期以來是計(jì)算機(jī)科學(xué)的重要內(nèi)容,而衡量一個(gè)算法好壞的重要標(biāo)準(zhǔn)是時(shí)間開銷與空間開銷。算法復(fù)雜性分析多數(shù)是手工進(jìn)行的。近十?dāng)?shù)年來,人們對(duì)效率問題的重視限度有所下降:為了提高開發(fā)效率,人們往往以犧牲軟件效率為代價(jià)。例如大量系統(tǒng)軟件、框架的引入方便了應(yīng)用軟件的開發(fā),但同時(shí)導(dǎo)致調(diào)用層次過多,系統(tǒng)執(zhí)行效率下降。只是由于硬件速度提高較快,蓋過了軟件效率的下降,使最終用戶感覺系統(tǒng)的總體速度還是增長了。不僅如此,為了提高用戶的響應(yīng)時(shí)間,許多分布式的服務(wù)器軟件以大量的反復(fù)冗余計(jì)算為代價(jià),為同一個(gè)用戶請(qǐng)求創(chuàng)建在多個(gè)機(jī)器上的計(jì)算,并將最先得到的結(jié)果返回給用戶,而將后續(xù)得到的結(jié)果直接拋棄。事實(shí)上,忽視對(duì)運(yùn)營效率的追求是IT系統(tǒng)能耗連續(xù)增長的因素之一。隨著能源問題的日趨突出,這方面的研究迫切需要加強(qiáng)。效率測(cè)試測(cè)試是發(fā)現(xiàn)效率缺陷的最有效方法。效率測(cè)試通過運(yùn)營軟件來分析軟件的時(shí)間效率與空間效率。通常這個(gè)過程需要自動(dòng)化的測(cè)試工具來輔助完畢:測(cè)試工具重要用來模擬多種正常、峰值以及異常負(fù)載條件,從而對(duì)系統(tǒng)的各項(xiàng)性能指標(biāo)進(jìn)行測(cè)試。效率測(cè)試可以使在用戶模擬的環(huán)境中進(jìn)行的。但是,由于軟件的運(yùn)營效率與運(yùn)營環(huán)境有很大的關(guān)系,因此效率測(cè)試更需要在系統(tǒng)部署到實(shí)際環(huán)境、但還沒有事實(shí)上線時(shí)進(jìn)行。效率監(jiān)測(cè)在系統(tǒng)實(shí)際運(yùn)營過程中,對(duì)效率進(jìn)行監(jiān)測(cè)的重要對(duì)象涉及:系統(tǒng)的響應(yīng)時(shí)間、CPU負(fù)載情況、內(nèi)存使用、客戶連接實(shí)例數(shù)目、內(nèi)部類型的實(shí)例數(shù)目、數(shù)據(jù)庫連接實(shí)例數(shù)目,等等。通過這些信息的獲取,管理者可以對(duì)照用戶需求看是否發(fā)生違反需求的情況,假如有,則可以考慮通過運(yùn)營時(shí)刻調(diào)整負(fù)載、增長硬件資源等方式對(duì)系統(tǒng)進(jìn)行調(diào)整。靜態(tài)效率分析編譯過程中的代碼優(yōu)化就是建立在靜態(tài)效率分析技術(shù)的基礎(chǔ)上。通過靜態(tài)分析,可以發(fā)現(xiàn)程序中的歷來就不會(huì)執(zhí)行的代碼、不會(huì)被引用的變量或者賦值操作、不需要的檢查、串復(fù)制、數(shù)字轉(zhuǎn)換,等等,從而可以對(duì)代碼進(jìn)行優(yōu)化:在不改變程序語義的前提下,剔除冗余的代碼,從而減少內(nèi)存開銷,提高執(zhí)行效率。3.5軟件易維護(hù)性“易維護(hù)性”重要是指系統(tǒng)是否易于理解、是否易于根據(jù)需求的變化對(duì)系統(tǒng)進(jìn)行調(diào)整。此外,開發(fā)人員在維護(hù)軟件的過程中,為了便于及時(shí)了解與維護(hù)任務(wù)相關(guān)的一些性質(zhì),有時(shí)也需要進(jìn)行軟件分析。面向易維護(hù)性分析的首要目的是對(duì)軟件的易維護(hù)性進(jìn)行度量。為了讓維護(hù)人員更好地運(yùn)用分析結(jié)果,如何將分析結(jié)果展示給維護(hù)人員也是相關(guān)分析技術(shù)的一個(gè)重要關(guān)注點(diǎn)。易維護(hù)性度量從軟件度量的角度看,軟件的易維護(hù)性是一種外部屬性,不能直接進(jìn)行度量。需要把易維護(hù)性表達(dá)為一組可直接度量的內(nèi)部屬性的函數(shù),而這些內(nèi)部屬性可以通過程序分析獲得。易維護(hù)性度量[60]通??紤]以下兩個(gè)方面的內(nèi)部屬性:1)程序的結(jié)構(gòu),重要涉及傳統(tǒng)程序度量中關(guān)注的內(nèi)聚、耦合等屬性;2)程序的風(fēng)格,重要涉及編程的格式、命名的方式等屬性。從已有文獻(xiàn)看,易維護(hù)性度量一般采用靜態(tài)分析技術(shù)。系統(tǒng)分解系統(tǒng)分解是指將大型的軟件系統(tǒng)劃分為若干子系統(tǒng)。對(duì)于大型軟件系統(tǒng)的維護(hù),維護(hù)任務(wù)通常只涉及其中很少的子系統(tǒng),系統(tǒng)分解有助于對(duì)系統(tǒng)不熟悉的維護(hù)人員理解與維護(hù)任務(wù)相關(guān)的子系統(tǒng)。從已有文獻(xiàn)看,系統(tǒng)分解一般也采用靜態(tài)分析技術(shù),其基本思緒是通過對(duì)軟件結(jié)構(gòu)的分析,將軟件劃分為若干高內(nèi)聚、低耦合的子部分,每個(gè)子部分相應(yīng)一個(gè)子系統(tǒng)。特性定位由于維護(hù)任務(wù)往往針對(duì)特性展開,特性定位(featurelocation)[61]可以分析哪些代碼與哪些特性相關(guān),維護(hù)人員可以直接運(yùn)用特性定位的結(jié)果支持程序理解。靜態(tài)的特性定位抽取程序的結(jié)構(gòu)信息,然后通過自動(dòng)或半自動(dòng)地遍歷程序的結(jié)構(gòu)信息找到與每個(gè)特性相關(guān)的代碼。動(dòng)態(tài)的特性定位針對(duì)每個(gè)特性生成輸入數(shù)據(jù),然后通過執(zhí)行這些輸入數(shù)據(jù)和分析執(zhí)行結(jié)果獲取特性與代碼的關(guān)系。逆向工程由于軟件文檔經(jīng)常被人們所忽視,因此軟件維護(hù)過程中經(jīng)常會(huì)面臨軟件文檔不完整的情形。這給維護(hù)過程中所必須進(jìn)行的理解軟件、改善軟件等活動(dòng)帶來了很大的困難。此時(shí),通??梢詫?duì)程序代碼進(jìn)行靜態(tài)分析,通過數(shù)據(jù)收集、知識(shí)組織、信息瀏覽等一系列活動(dòng),逆向恢復(fù)出關(guān)于程序的構(gòu)成成分、成分之間的關(guān)系等信息,以指導(dǎo)具體的維護(hù)活動(dòng)。未來研究展望作為軟件技術(shù)研究領(lǐng)域的核心內(nèi)容之一,軟件分析技術(shù)隨著軟件技術(shù)的發(fā)展而處在不斷發(fā)展之中,并受到如下幾方面的推動(dòng):軟件分析新理論和新方法的引入與集成、軟件形態(tài)的新發(fā)展、軟件運(yùn)營平臺(tái)的新發(fā)展、等等。軟件分析新理論和新方法的引入與集成。隨著近年來高可信軟件研究的興起,近年來軟件分析出現(xiàn)了一些新發(fā)展趨勢(shì),涉及:(1)新理論的引入與應(yīng)用。將新邏輯系統(tǒng)應(yīng)用到軟件分析上,例如面向動(dòng)態(tài)結(jié)構(gòu)的解決,分離邏輯的提出并應(yīng)用于系統(tǒng)代碼的分析;在軟件分析中運(yùn)用新的數(shù)學(xué)工具,例如將代數(shù)符號(hào)計(jì)算應(yīng)用于程序終止性證明;(2)靜態(tài)分析與動(dòng)態(tài)分析的集成與融合。靜態(tài)分析與動(dòng)態(tài)分析在分析精度、分析開銷、合用的軟件屬性等方面各有所長。一個(gè)十分自然地想法就是將兩者結(jié)合起來考慮。例如,先進(jìn)行靜態(tài)分析,為動(dòng)態(tài)分析的監(jiān)測(cè)部署提供依據(jù),以減少監(jiān)測(cè)代碼的部署范圍,縮短離線動(dòng)態(tài)驗(yàn)證的時(shí)間、減少在線監(jiān)測(cè)的開銷;或者先運(yùn)用離線動(dòng)態(tài)驗(yàn)證生成大量的執(zhí)行軌跡,然后進(jìn)行靜態(tài)分析,以提高分析精度。軟件形態(tài)的新發(fā)展。隨著軟件應(yīng)用領(lǐng)域及其需求的發(fā)展,軟件的形態(tài)正在發(fā)生深刻的變化:軟件的規(guī)模不斷增大,人們對(duì)軟件行為特性結(jié)識(shí)的愿望也日益強(qiáng)烈。例如網(wǎng)構(gòu)軟件作為網(wǎng)絡(luò)時(shí)代軟件的新形態(tài),其開放、自主等形態(tài)特性將產(chǎn)生以往軟件分析未涉及的性質(zhì)[20]。同時(shí),軟件性質(zhì)的描述需要直觀,以方便具有不同知識(shí)背景的人員描述性質(zhì)。軟件性質(zhì)的描述還需要盡量形式化,以提高分析的自動(dòng)限度。近年來,由于軟件應(yīng)用范圍的連續(xù)擴(kuò)張,編程輔助工具代碼生成能力的提高、計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的推動(dòng)、開放源代碼理念的被認(rèn)可,軟件代碼量的增長十分迅速。據(jù)分析,到2025年人們開發(fā)的代碼將達(dá)成1萬億行[1]。軟件分析也因此需要一些新的視角,例如數(shù)量巨大的代碼激發(fā)了一個(gè)特殊的研究方式:基于記錄、挖掘的軟件分析。2023年發(fā)起的“挖掘軟件池工作會(huì)議”(InternationalWorkingConferenceonMiningSoftwareRepository)著重研究如何從大量現(xiàn)有的代碼中挖掘有價(jià)值的內(nèi)容,例如,挖掘不同形態(tài)制品的追蹤關(guān)系、挖掘以往軟件項(xiàng)目開發(fā)過程中具有的特性等,以支持軟件的開發(fā)與維護(hù)過程。軟件運(yùn)營平臺(tái)的發(fā)展。軟件運(yùn)營平臺(tái)對(duì)軟件分析技術(shù)發(fā)展的影響體現(xiàn)在多個(gè)方面。例如多核技術(shù)對(duì)軟件分析技術(shù)發(fā)展的影響、各種數(shù)據(jù)中心/服務(wù)中心對(duì)軟件分析技術(shù)發(fā)展的影響等等。以多核技術(shù)的影響為例:一方面,多核體系結(jié)構(gòu)使得并行軟件成為一種軟件常態(tài),而并行程序的分析受制于語義復(fù)雜、狀態(tài)空間爆炸等問題,與需求差距明顯。另一方面,并行性也為軟件分析提供了提高分析規(guī)模和能力的空間,例如模型檢查的并行化以及多核平臺(tái)上的運(yùn)營時(shí)驗(yàn)證等。軟件分析是軟件技術(shù)中一個(gè)得到長期關(guān)注的研究內(nèi)容,并與其它的軟件技術(shù)有較多的結(jié)合。隨著軟件規(guī)模越來越大、越來越復(fù)雜、積累的軟件越來越多,軟件分析必將在軟件開發(fā)、軟件維護(hù)等過程中發(fā)揮越來越大的作用。參考文獻(xiàn)DavidBinkley,SourceCodeAnalysis:ARoadMap,InProceedingofFutureofSoftwareEngineering,2023.MatthewB.Dwyer,JohnHatcliff,Robby,CorinaS.P?s?reanu,andWillemVisser,FormalSoftwareAnalysisEmergingTrendsinSoftwareModelChecking,InProceedingofFutureofSoftwareEngineering,2023.Appel,AndrewW.(1998).ModernCompilerImplementationinML.Cambridge,UK:CambridgeMoolySagiv;ThomasReps,ReinhardWilhelm(May2023)."Parametricshapeanalysisvia3-valuedlogic".ACMTransactionsonProgrammingLanguagesandSystems(TOPLAS)(ACM)24(3):217–298.ChanchalKumarRoyandJamesR.Cordy,ASurveyonSoftwareCloneDetectionResearch,Technicalreport,SchoolofComputing,Queen'sUniversityatKingston,Ontario,Candada,2023.B.S.Baker.Onfindingduplicationandnear-duplicationinlargesoftwaresystems.InWCRE,pages86–95,1995.B.S.Baker.Parameterizedduplicationinstrings:Algorithmsandanapplicationtosoftwaremaintenance.SICOMP,26(5):1343–1362,1997.T.Kamiya,S.Kusumoto,andK.Inoue.CCFinder:amultilinguistictoken-basedcodeclonedetectionsystemforlargescalesourcecode.TSE,28(7):654–670,2023.LingxiaoJiang,GhassanMisherghi,ZhendongSu,StephaneGlondu,DECKARD:ScalableandAccurateTree-basedDetectionofCodeClones,InternationalConferenceonSoftwareEngineering(ICSE),2023MarkGabel,LingxiaoJiang,ZhendongSu,ScalableDetectionofSemanticClones,InternationalConferenceonSoftwareEngineering(ICSE),2023ElmarJuergens,FlorianDeissenboeck,BenjaminHummel,StefanWagner,DoCodeClonesMatter?InternationalConferenceonSoftwareEngineering(ICSE)–2023LingxiaoJiang,ZhendongSu,EdwinChiu,Context-BasedDetectionofClone-RelatedBugs,EuropeanSoftwareEngineeringConferenceandSymposiumontheFoundationsofSoftwareEngineering(ESEC/FSE)2023SandroSchulze,MartinKuhlemann,MarkoRosenmuller,TowardsaRefactoringGuidelineUsingCodeCloneClassification,WorkshoponRefactoringTools(WRT)2023EkwaDuala-Ekoko,MartinRobillardCloneTracker:ToolSupportforCodeCloneManagement,InternationalConferenceonSoftwareEngineering(ICSE)2023EytanAdar,MiryungKim,SoftGUESS:VisualizationandExplorationofCodeClonesinContext,InternationalConferenceonSoftwareEngineering(ICSE)2023JanHarder,NilsGode,ModelingCloneEvolution,InternationalWorkshoponSoftwareClones(IWSC)2023SimoneLivieri?YoshikiHigo?MakotoMatsushita?KatsuroInoue,AnalysisoftheLinuxKernelEvolutionUsingCodeCloneCoverage,FourthInternationalWorkshoponMiningSoftwareRepositories(MSR'07)M.Shaw,“TruthVs.Knowledge:TheDifferencebetweenWhataComponentDoesandWhatWeKnowItDoes,”Proc.8thInt'lWorkshopSoftwareSpecificationandDesign,IEEECSPress,1996,pp.181-185.NedChapin,JoanneE.Hale,KhaledMd.Khan,JuanF.Ramil,Wui-GeeTan,Typesofsoftwareevolutionandsoftwaremaintenance,JournalofSoftwareMaintenanceandEvolution:ResearchandPractice,Volume13Issue1,

Pages

3

30,2023.楊芙清,呂建,梅宏,網(wǎng)構(gòu)軟件技術(shù)體系:一種以體系結(jié)構(gòu)為中心的途徑,中國科學(xué)F輯,2023,(38)6.W.R.Bush,J.D.Pincus,andD.J.Sielaff.AStaticAnalyzerforFindingDynamicProgrammingErrors.Software-PracticeandExperience(SPE),30:775–802,2023.BrunoDufour,BarbaraG.Ryder,GarySevitsky,

AScalableTechniqueforCharacterizingtheUsageofTemporariesinFramework-intensiveJavaApplications,Proceedingsofthe16thACMSIGSOFTInternationalSymposiumonFoundationsofsoftwareengineering(FSE),2023.T.BallandS.K.Rajamani.Automaticallyvalidatingtemporalsafetypropertiesofinterfaces.InM.B.Dwyer,editor,Proc.8thSPINWorkshop,volume2057ofLNCS,pages103–122.Springer,May2023.H.ChenandD.A.Wagner.MOPS:anInfrastructureforExaminingSecurityPropertiesofSoftware.InProc.9thACMconferenceonComputerandcommunicationssecurity,November,2023.J.Corbettetal.Bandera:Extractingfinite-statemodelsfromJavasourcecode.InProc.22ndICSE,June2023.W.Visser,K.Havelund,G.Brat,andS.Park.Modelcheckingprograms.InInternationalConferenceonAutomatedSoftwareEngineering,Sept.2023.D.L.Detlefs,G.Nelson,andJ.B.Saxe.Atheoremproverforprogramchecking.TechnicalReport,HPLaboratoriesPaloAlto,2023.S.Owre,S.Rajan,J.M.Rushby,N.Shankar,andM.K.Srivas.PVS:Combiningspecification,proofchecking,andmodelchecking.InR.AlurandT.A.Henzinger,editors,Proc.8thCAV,volume1102ofLNCS,pages411–414.Springer,1996.Goubaut-LarrecqJ,ParrennesF.CryptographicprotocolanalysisonrealCcode.In:CousotR,ed.Proc.ofthe6thInt’lConf.onVerification,ModelCheckingandAbstractInterpretatio.LNCS3385,Paris:Springer-Verlag,2023.363?379.BlanchetB,CousotP,CousotR,FeretJ,MauborgneL,MinéA,MonniauxDandRivalX.Astaticanalyzerforlargesafety-criticalsoftware.In:Proc.oftheACMSIGPLAN2023Conf.PLDI.SanDiego:ACMPress,2023.196?207.張健,精確的程序靜態(tài)分析,《計(jì)算機(jī)學(xué)報(bào)》(1549—1553),2023年9期。E.M.Clarke,Jr.O.Grumberg,andD.A.Peled.ModelChecking.MITPress,2023.F.Raimondi,J.Skene,W.Emmerich,Efficientonlinemonitoringofweb-serviceSLAs.InProceedingsofACMSIGSOFT/FSE2023,Atlanta,USA,2023。BethA.Schroeder,On-LineMonitoring:

ATutorial,Volume28,

IEEEComputer,Issue6

(June1995)QianxiangWang,YonggangLiu,MinLi,HongMei,AnOnlineMonitoringApproachforWebServices.Proceedingsofthe31stIEEEInternationalComputerSoftwareandApplicationsConference(COMPSAC2023),Beijing,QianxiangWang,JunrongShen,XiaopengWang,HongMei,AComponent-basedApproachtoOnlineSoftwareEvolution.JournalofSoftwareMaintenanceandEvolution:ResearchandPractice,Vol.18,No.3,2023.FengChen,GrigoreRosu,TowardsMonitoring-OrientedProgramming:AParadigmCombiningSpecificationandImplementation,thirdworkshoponRuntimeVerification,2023.JianjunZhao:ApplyingSlicingTechniquetoSoftwareArchitectures.ICECCS1998:87-99.李必信,鄭國梁,王云峰,李宣東,一種分析和理解程序的方法──程序切片,計(jì)算機(jī)研究與發(fā)展

2023年

03期.QianxiangWang,AdityaMathur,InterceptorBasedConstraintViolationDetection.ProceedingsoftheIEEEInternationalConferenceandWorkshopontheEngineeringofComputerBasedSystems,WashingtonAndreiPopovici,ThomasGross,GustavoAlonso,DynamicWeavingforAspect-OrientedProgramming,Proceedingsofthe1stinternationalconferenceonAspect-orientedsoftwaredevelopment(AOSD),2023.MarkWeiser,"Programslicing,"IEEETransactionsonSoftwareEngineering,vol.SE-10,no.4,pp.352-357,July1984.LFroihofer,GGlos,JOsrael,KMGoeschka,OverviewandevaluationofconstraintvalidationapproachesinJava,Proceedingsofthe29thinternationalconferenceonSoftwareEngineering(ICSE),2023.NellyDelgado,AnnQ.Gates,andSteveRoach,ATaxonomyandCatalogofRuntimeSoftware-FaultMonitoringTools,IEEETransactionsonSoftwareEngineering,Vol30,

Issue12

(December2023),pp.859–872.

MichaelHind,Michael

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論