宋艷++王煒
摘 要:程序特征定位是成功實施動態(tài)演化意圖的前提條件,其核心是識別代碼集合與特征之間的映射關系。將程序運行時有規(guī)律的消息傳遞模式抽象為規(guī)則,通過規(guī)則獲取和注釋識別了程序特征與代碼集合之間的映射關系,提出了規(guī)則空間用于刻畫程序特征間存在的大小和層次等粒度屬性,并基于此實現了對復雜程序特征的層次化理解,完成了特征定位。通過對Eclipse3.0的45個測試用例(含4822個對象)進行分析,在置信度和支持度設置為75%和30%的情況下,生成了645條規(guī)則和規(guī)則空間,實現了特征定位。其平均準確率為34.33%,這證明該方法是可行的。
關鍵詞:軟件動態(tài)演化;程序特征;行為規(guī)則;特征定位
中圖分類號:TP311.5 文獻標識碼:A DOI:10.15913/j.cnki.kjycx.2015.12.001
特征定位(Feature Location)是指構建程序特征與軟件代碼之間映射關系的過程,它將來自系統(tǒng)問題域的特征映射到了系統(tǒng)實現域的代碼實體(Source Code Entities)。IEEE 829認為,程序的特征是“一個軟件項目的顯著特點”,例如功能、可移植性或性能特性。文獻2中指出,在長生命周期軟件系統(tǒng)中,50%~75%的系統(tǒng)成本和相關費用用于軟件維護,其中1/2以上的工作量用于特征定位。
各國研究人員針對特征定位開展了廣泛而深入的研究,提出了靜態(tài)、動態(tài)和基于文本的特征定位方法。其中,由于動態(tài)方法具有比較高的查準率,所以,其被廣泛應用于特征定位領域。1995年,Wilde提出了最早的動態(tài)特征定位方法——軟件偵測技術。該方法關注獲取特征與代碼實體之間的特定追蹤關系。對每個需要定位的特征設計兩組測試用例,一組測試用例的執(zhí)行展示該特征,而另外一組測試用例的執(zhí)行不會涉及這個系統(tǒng)的特征。兩組測試用例所對應的執(zhí)行跡之差便是特征所對應的代碼。程序切片技術可以應用于動態(tài)特征定位,而程序切片是指影響程序中某個興趣點變量取值的所有語句和控制謂詞組成的一個程序子集。Wong、張迎周、徐寶文等學者基于程序切片技術提出了各自的程序理解方法。Eisenberg基于特征跡(Dynamic Feature Traces)方法進行特征定位研究。該方法賦予了執(zhí)行跡中的成對調用關系一個權值,利用這個權值確定了該執(zhí)行跡屬于某個程序特征的程度。此方法在3個Java系統(tǒng)上進行了測試,結果表明,該方法的效率比軟件偵測效率高。Safyallah和Sartipi提出了一種將數據挖掘技術運用到執(zhí)行跡抽取的方法。Bohnet等人提出了一種將執(zhí)行信息可視化的技術,依靠該技術可以完成觀察特征的實現。劉奕明結合領域建模方法提出了一種基于本體的動態(tài)軟件特征建模方法,并給出了其元模型和基于推理的模型一致性驗證方法。開發(fā)者可以對動態(tài)軟件系統(tǒng)的業(yè)務邏輯共性、運行時業(yè)務邏輯的可變性和這些可變性之間的約束關系建模,從而為動態(tài)軟件系統(tǒng)提供高層次、抽象的軟件演化業(yè)務邏輯視圖。Eisenbarth等人基于概念格(Concept Lattice)進行了特征定位研究。該方法對場景、測試用例與代碼實體間的二元關系進行了形式化的概念分析,為其建立了一個概念格結構,并將其可視化。
雖然各國學者從不同角度提出了動態(tài)特征定位方法,但是,當前的研究成果大多都著眼于建立用例與代碼間的映射關系。然而,任何一個用例都是由一個或多個軟件功能組成的,因此,傳統(tǒng)的動態(tài)特征定位方法無法實現軟件功能與代碼之間的映射關系。另外,在進行特征定位時,一個測試用例往往對應著大量的執(zhí)行跡,而現有的方法無法量化表示上述執(zhí)行跡間的因果關系,所以,后續(xù)分析無從下手。
針對上述2個缺陷,本文基于行為規(guī)則提出了動態(tài)特征定位方法。
1 方法綜述
如圖1所示,本文采用的方法可以分為3個部分:①產生測試用例,并收集程序執(zhí)行跡;②生成行為規(guī)則集;③構造行為規(guī)則空間,實現特征定位。
圖1 基于行為規(guī)則的軟件特征理解方法流程
1.1 產生測試用例并收集程序執(zhí)行跡
動態(tài)特征定位的基礎是執(zhí)行跡。執(zhí)行跡的獲取有以下4個步驟:①編寫測試用例,測試用例應覆蓋軟件的所有功能點或執(zhí)行路徑;②在源代碼中,設置檢查點(Check Point),用來觀察程序運行時的狀態(tài)信息,并編譯帶有檢查點的代碼,從而形成可執(zhí)行文件;③執(zhí)行測試用例,觀測并收集與測試用例相關的數據;④建立執(zhí)行跡與測試用例之間的映射關系。
實現特征定位首先要生成測試用例。
定義1:有限非空集合U={u1,u2,…,un},n∈N為一個測試用例集合。二元組ui=(IDi,BDi)是一個測試用例,其中,IDi定義為該測試用例的標示符,有限非空集合BDi包含了對該測試用例的描述。
通過對含有檢查點的可執(zhí)行文件執(zhí)行測試用例,可以獲取對應的執(zhí)行跡。執(zhí)行跡不僅是刻畫程序運行時代碼實體間消息傳遞關系的載體,同時,它還反映了程序功能單元的實現過程。
定義2:有限非空集合T={t1,t2,…,tn},n∈N是程序的執(zhí)行跡集合。其中,ti是與測試用例ui相對應的執(zhí)行跡。
定義3:執(zhí)行跡可以描述為一個三元組,即ti=(Oi,
當前,有多種工具可以完成對執(zhí)行跡的獲取,例如Flat3 等。表1給出使用Flat31獲取的一個執(zhí)行跡片段示例。
表1 執(zhí)行跡片段示例
0:0:46:26 mouseEntered -- org.gjt.sp.jedit.textarea.Gutter$MouseHandler
0:0:46:26 mouseExited -- org.gjt.sp.jedit.textarea.Gutter$MouseHandler