張志榮,黃 杰,孫偉宏,韓曉東,蘇先名
(中國衛星海上測控部,214431)
數據挖掘是從大量數據中提取或“挖掘”信息的方法,即通過一定的技術手段,從大量的數據資料中搜索隱藏于其中的有著特殊價值的信息。在軟件工程領域,通過數據挖掘可以從軟件工程數據庫(例如源代碼庫,程序執行記錄,版本信息記錄,漏洞數據庫等)中挖掘出有價值的信息,這些信息可以幫助我們預測系統漏洞,定位系統故障,尋找代碼間的依賴關系,了解項目狀況,項目進度,進行成本評估等等。
數據挖掘出現于20世紀80年代末,最早稱為數據庫中的知識發現(KDD,Knowledge Discovery in Database),是在數據庫領域發展起來的。發展到現在,研究重點逐漸從偏理論的方法發現轉向系統應用,以及多種學科之間的相互滲透,這其中就包括與軟件工程的結合。
軟件工程(Software Engineering,簡稱為SE)這個概念,在1968年秋NATO(北約)的科技委員會召集的討論和制定關于擺脫“軟件危機”的會議上第一次被提出。軟件工程是一門研究用工程化方法構建和維護有效的、實用的和高質量的軟件的學科,其目標是在給定成本、進度的前提下,開發出滿足用戶需求的軟件產品。
將數據挖掘應用于軟件工程領域,始于上世紀九十年代初,Allen K 等人提出用數據挖掘的方法來發現代碼中的復用關系,此后該項技術在軟件工程領域快速發展。直至目前,ICSE,ISSTA,ASE 等國際頂級會議專門開設了相關議題,2004年召開的挖掘軟件資源庫(Mining Software Repositories,MSR)研討會標志著這一方向已成為軟件工程的一個重要分支,數據挖掘技術開始滲透到程序代碼分析,漏洞檢測,軟件項目管理,開源軟件開發等眾多領域中去。
如圖 1 所示,軟件工程領域的數據挖掘可以分為三個方面,(1)挖掘對象,即軟件工程數據庫,包括源代碼庫,歷史版本記錄,程序狀態,軟件工程文本數據庫等,這些數據中包含了許多有價值的信息,可以協助我們更好地進行軟件開發;(2)挖掘技術,常用的有分類、聚類、關聯、評估和預測等等;(3)需要協助的軟件工程目標,例如缺陷探測,漏洞檢測等等。

圖1 數據挖掘的一般過程
軟件漏洞檢測用于找出軟件開發過程中的錯誤或漏洞,以便及時進行修正,保證軟件可靠性和質量。將數據挖掘應用于軟件漏洞檢測可以分為以下5個步驟,(1)建立軟件測試項目。從用戶角度提出需求,決定軟件的哪些方面需要測試和怎樣進行測試,建立測試計劃和策略;(2)對漏洞庫進行數據收集,數據清理和數據轉換。分析需要采集的信息和數據,選擇與軟件缺陷有關的數據集,清理掉不需要的數據,補充丟失的項目,將數據的屬性轉換成數值表示;(3)選擇合適的數據挖掘模型進行訓練和驗證。根據項目需求選擇合適的損挖掘方法,為該方法生成訓練集和測試集,通過比較結果選擇最合適的方法;(4)通過前面步驟中的方法對軟件漏洞進行分類、定位和描述。將步驟3 中確定的方法應用到軟件數據庫中,找出未知的漏洞,根據一定規則對漏洞進行分類和描述;(5)將挖掘到的知識應用于軟件測試項目中。把前面挖掘出的結果轉換成知識,保存到數據庫中,對軟件重新進行測試以確認發現的漏洞,將結果應用到軟件開發項目中去。
執行記錄挖掘就是通過分析程序的執行路徑,發現程序代碼中所展現的關聯。其本質是根據跟蹤執行路徑進行逆向建模,用于幫助理解程序、驗證程序和維護程序。
如2 所示,該類挖掘的一般過程如下,首先,對被分析系統進行一個初步的插裝,記錄挖掘軟件對API(應用編程接口)或基本模塊的調用和系統的狀態變量,再對目標跟蹤信息進行必要的過濾、聚類和約簡,形成能表征系統功能的模型。

圖2 執行記錄挖掘的一般流程
開源軟件挖掘中最常用的方法之一是克隆代碼檢測,通常情況下,OSS 之間共用代碼的情況是非常普遍的,有實驗表明50%以上的源文件被應用到兩個以上的開源項目中。因此就可以使用克隆代碼檢測的方法對單個軟件內以及兩個軟件之間的代碼進行檢測。克隆代碼就是以代碼復用為目的而進行拷貝和粘貼的代碼段,對克隆代碼進行檢測可以有效防止漏洞的拷貝性傳播,另外還有利于軟件在演化過程中的維護。
版本控制系統(如CVS,SVN,Visual SourceSafe 等)用以確保項目參與者所編輯的同一檔案得到統一的,全局的更新。目前幾乎所有的軟件開發都會采用版本控制系統來管理軟件開發活動。當前對版本控制信息的挖掘應用基本都是對軟件變更歷史進行挖掘的,用以發現不同程序模塊及其子系統之間的相互依賴關系,從而預測程序漏洞的引入方式或者未來的變化。通過以上挖掘活動,可以有效地降低系統后期維護代價,預防一些因變更而引入的漏洞,從而為軟件系統的后期維護提供警示作用,為項目的管理及相關決策提供重要的參考依據。
分類是預測分類標號(或離散值)的操作,通常要先建立一個模型,描述預定的數據類集或概念集,接著使用模型進行分類。
常用的幾種分類方法有判定樹法,貝葉斯分類法,神經網絡分類法,K-最臨近分類法,支持向量機等。
判定樹法是以貪心算法為基礎,通過自頂向下遞歸的方式構造判定樹,葉子節點對應某個類別標號,即最終的分類結果。常用的判定樹法有K-最臨近分類法,支持向量機等。
K-最臨近分類法(K-Nearest Neighbor),其基本思想是:如果一個樣本在特征空間中的K個最相似(即特征空間中最鄰近)的樣本中的大多數屬于某一個類別,則該樣本也屬于這個類別。該算法比較適用于樣本容量比較大的自動分類,而那些樣本容量較小的類域采用這種算法則比較容易產生誤分。
關聯規則是指大量數據中項集之間有趣的關聯或相關聯系。關聯規則具有如下兩個重要屬性:(1)支持度:P(A ∪B),即A和B 這兩個項集在事務集D 中同時出現的概率;(2)置信度:P(B |A),即在出現A 的事務集D 中,B 也出現的概率。同時滿足最小支持度和最小置信度的規則稱為強規則。給定一個事務集D,挖掘關聯規則其實就是產生支持度和可信度分別大于用戶給定的最小支持度和最小可信度的關聯規則。
聚類就是將數據對象分成多個類或簇,在同一個簇中的對象之間具有較高的相似度,而不同簇中的對象差別較大。聚類與分類不同,它要劃分的類是未知的,屬于一種無指導的學習方法。聚類分析主要應用在其它算法的預處理,作為獨立工具獲取數據分布情況,以及進行孤立點挖掘,預示欺詐行為等方面。常用的聚類方法如表 1 所示。

表1 常用的聚類方法
聚類分析的輸入是一組有序對(X,s)或(X,d),這里X 表示一組樣本,s 和d 分別用來度量樣本間相似度或相異度。聚類系統的輸出是一個分區C={C1,C2,…,Ck},其中Ci 是X 的子集,稱為類。以劃分聚類方法為例,其基本思想是,給定一個有n個對象的數據集,劃分聚類就是構造k個劃分,每個劃分代表一個簇,其中k<=n。這k個劃分滿足下列條件:(1)每個簇中至少包含有一個對象;(2)每一個對象屬于且僅屬于一個簇。對于給定的k,算法首先給出了一個初始的劃分方法,然后通過迭代來改變劃分,使得每一次迭代之后的劃分都較前一次更好。更好的標準時是,同一個簇中的對象越接近越好,不同簇之間的對象越遠越好。
隨著軟件工程項目的日趨復雜,軟件開發越來越需要可以量化以及精確測量的工具,而數據挖掘無疑在這方面可以給予軟件開發者有力的支持。目前數據挖掘與軟件工程的結合已經產生了可觀的效益,無論是對軟件項目的評估,開發過程還是驗證測試都能提供有效的信息幫助決策。然而,無論是數據挖掘還是其在軟件工程中的應用當前都處在發展初期,各種方法,技術都值得深入探索和發展。隨著軟件工程學科的不斷發展,也勢必要求數據挖掘方法的不斷地提出創新。可以想象在不久的將來,定會出現一批成熟的用于軟件工程領域的數據挖掘工具。
[1]張帆,沈孫園.淺談數據挖掘技術在軟件工程中的應用.電腦知識與技術,2009:1879-1881
[2]毛澄映,盧炎生,胡小華.數據挖掘技術在軟件工程中的應用綜述.計算機科學,2009,36(5):1-5
[3]孟美芝,張陽.將KFCM 算法應用于源代碼挖掘的研究.計算機工程與設計,2010,31(10):2249-2252
[4]楚燕婷,王麗瓊.基于源代碼挖掘的軟件質量改進方法研究.電腦知識與技術,科2009,5(34):9771-9772