天天看點

《中國人工智能學會通訊》——8.42 基于程式設計模式挖掘軟體缺陷

軟體缺陷種類繁多且新缺陷不斷出現、不同缺陷形成的原因各不相同。試圖通過直接描述軟體缺陷模式來發現軟體缺陷非常困難。所幸,由于程式編寫過程需要遵循程式設計語言确立的各種程式設計規範和約定,無缺陷的正常程式大都應與此“正常模式”相符。是以,要挖掘軟體缺陷,可以設法對正常程式需要符合與遵循的程式設計模式進行模組化,據此發現與此“正常模式”相違背的潛在軟體缺陷。對程式設計模式的刻畫,可通過對軟體項目中的源代碼以及其他相關非代碼資料的分析和挖掘來實作。

從源代碼挖掘程式設計模式

獲得程式正常模式描述的最直接方法是基于程式設計語言的領域知識定義出一套模闆,然後根據所定義的模闆實作軟體缺陷的檢測[3] 。,然而,該方法對軟體缺陷的甄别效果很大程度上依賴于所定義的模闆正确性與完備性,需要經驗豐富且對目前程式設計語言構造了解深的專家才能定義出正确且相對完備的模闆,是以難以在實際中廣泛應用。為此,Li et al [4] 提出了自動模闆生成。他們假設程式中缺陷是因不慎引入的,缺陷自身的數量遠不及正常模式多。是以,通過頻繁模式進行挖掘,即可有效發現與描述程式中的正常模式。他們利用編碼規則将函數作為項 (item) 進行關聯規則挖掘,獲得了函數之間使用的耦合關系,據此發現不滿足關系的潛在缺陷。Livshitz et al [5] 通過關聯規則挖掘從軟體的修改記錄 (change log) 中挖掘出了函數的成對使用模式 ( 如函數 malloc () 與 free() 通常成對使用 ),據此發現因未成對使用某些函數而造成的缺陷。

從其他資料源挖掘程式設計模式

僅利用目前軟體項目的源代碼進行挖掘,有時并不能涵蓋所有有用的正常程式設計模式。例如,在這個軟體中僅對某個 API 使用了一兩次,是以很難從中挖掘出針對這個 API 的頻繁模式。是以,需要利用其他資料來源來輔助對程式設計規則的挖掘。Taoet al [6] 借助 Google 代碼搜尋獲得大量對該 API 使用的曆史記錄,并通過對此進行關聯規則挖掘獲得API 的使用模式與規範。Tan et al [7] 通過挖掘源代碼中給出的文字注釋,将注釋中指明的函數使用規則映射為一組規則模闆,基于此發現程式中與注釋所指明的函數使用規則不相符的缺陷。

繼續閱讀