999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于程序結構與語義特征融合的軟件缺陷預測

2022-08-19 08:21:00董玉坤李浩杰位欣欣唐道龍
計算機工程與應用 2022年16期
關鍵詞:語義程序特征

董玉坤,李浩杰,位欣欣,唐道龍

中國石油大學(華東)計算機科學與技術學院,山東 青島 266580

在軟件開發過程中,不可避免地會引入各種缺陷,有些缺陷僅僅會造成軟件的部分中止,對整個系統的運行影響不大,但有的缺陷則會造成嚴重的功能性、安全性等錯誤,影響系統安全。因此,在軟件開發過程中進行軟件缺陷預測顯得至關重要。軟件缺陷預測需要全面分析程序的語法、語義等特征,如果進行人工檢測會耗費大量的人力和時間,因此構建軟件缺陷預測模型自動進行軟件缺陷預測成為了一個熱門的研究方向。

傳統的機器學習方法將軟件缺陷預測問題轉化為一個構建分類器的問題[1-6],通過手工定義特征訓練分類器,用訓練好的分類器預測可能包含缺陷的代碼區域,這個區域可以是文件、類或者方法。許多機器學習算法都可以完成這項分類工作,例如決策樹(decision tree)[7]、隨機森林(random forest)[8]、樸素貝葉斯(naive Bayes)[9],但均不能獲得較高的準確率,并且手工定義特征也是一個費時費力的過程。

深度學習作為機器學習的一個分支,近年來被應用于軟件缺陷預測領域,并且取得了良好的效果。與傳統的機器學習方法相比,深度學習通過搭建神經網絡自動提取代碼特征,可以獲得更高的準確率。但是,現有的研究往往只在同一粒度上提取特征,比如對每行代碼做映射表示整個程序[10]。該方法可以將代碼轉換為輸入樣本,但是會丟失很多代碼的細粒度信息,不能預測出所有類型的缺陷。

程序的抽象語法樹(abstract syntax tree,AST)可以清晰地展示出程序各個節點之間的層次關系,利用這種層次關系對程序結構的表示,可以精確地描述代碼的結構信息,獲取結構特征與簡單的語義特征。同時,程序的Token序列可以在更細的粒度上表示程序,其中蘊含著豐富的語義信息,通過將程序轉換為Token 序列,對Token序列進行特征提取,可以準確地理解程序語義,獲取語義特征與部分結構特征。如圖1 所示的Java 代碼片段,通過將其解析為AST,分析AST 上的節點可以清楚地發現,在第3、4行的remove和add方法的先后順序會引起NoSuchElementException異常,但是并不能發現第5行for循環條件語句中“i--”引起的死循環缺陷,因為受AST上的節點粒度所限,并不能提取到循環條件中的語義信息。而通過將其解析為Token序列,可以有效地發現這個死循環缺陷,因為Token 序列是在Token 級別表示程序,蘊含了程序的語義特征。

圖1 一個有代表性的例子Fig.1 A representative example

軟件缺陷預測按照預測粒度劃分為方法級、類級、文件級等,本文在文件級進行軟件缺陷預測。本文提出了一個軟件缺陷預測框架2T-CNN(TBCNN and TextCNN),使用該框架,可以在軟件版本迭代時快速預測新版本中可能包含代碼缺陷的文件,向代碼審閱者發出警告,縮短代碼審查的時間。2T-CNN 基于卷積方式的不同,通過樹卷積神經網絡(tree-based convolutional neural network,TBCNN)[11]從程序的AST節點中提取結構特征,通過文本卷積神經網絡(text convolutional neural networks,TextCNN)[12]從程序的Token 序列中提取語義特征,將兩個模型提取到的特征融合后,輸入全連接神經網絡(fully connected neural network,FCNN),經過邏輯回歸分類器,輸出程序是否含有缺陷。本文對所提出的方法進行實現,并針對開源Java項目進行實驗評估,結果表明,該方法能夠有效提升軟件缺陷預測的準確率。

1 基于深度學習的軟件缺陷預測相關工作

利用深度學習技術預測軟件缺陷是近幾年興起的新穎的方法,在預測方法的整體流程上和傳統機器學習方法相似。不同之處在于深度學習技術可以利用神經網絡從程序代碼中自動提取出隱藏特征,這些隱藏特征往往是設計判別特征的人想象不到且無法設計出來的。

使用深度學習技術預測程序缺陷的核心思想在于程序代碼已被證實具有自然語言的相似屬性[13],因此現有的大多數基于深度學習的軟件缺陷預測技術都將程序代碼視為自然語言文本,將軟件缺陷預測轉化為文本分類任務,從自然語言處理的角度對文本進行缺陷分類。例如,Li等人[14]提出了一個基于深度學習的軟件漏洞檢測系統VulDeePecker,該方法使用雙向長短時記憶網絡(bi-directional long short-term memory,Bi-LSTM)在Token級別提取到程序的語義特征,但無法提取到代碼中其他豐富的特征,例如結構特征。該文的另一個重大貢獻是提供了一個可供深度學習訓練使用的軟件安全漏洞數據集[15]。Zou等人[16]在VulDeePecker的基礎上提出了μVulDeePecker,它基于代碼注意力和控制依賴,結合新的神經網絡building-block Bi-LSTM融合不同的特征,實現了對具體漏洞類型的檢測。Duan等人[17]為了更好地捕捉程序源代碼的關鍵特征信息,提出了一種基于代碼屬性圖及注意力Bi-LSTM 的漏洞挖掘方法,與基于規則的靜態挖掘工具Flawfinder和RATS相比有顯著的提高。

為了更好地提取代碼的結構特征,有很多研究將深度學習技術應用在AST上。Wang等人[18]利用深度置信網絡(deep belief network,DBN)[19]從程序的AST 中提取符號向量來學習語義特征,在效果上優于傳統的基于特征的方法,但并沒有考慮程序的結構特征。Li等人[20]為了充分考慮程序代碼的結構特征,對AST中具有代表性的節點進行映射,結合傳統的缺陷特征訓練判別器,取得了比DBN 更好的效果。但正如該文中的例子所示,將for循環的整個條件部分映射為一個整數,顯然無法發現在條件語句中的缺陷。另外,這種方法仍然需要手工定義的特征。Dam 等人[21]的研究是對AST 中的每個節點進行映射,將一個個AST分支輸入基于樹的LSTM單元中訓練模型。這種方法可以充分考慮到AST 中的結構特征,對于發現特定的序列模式也有很大的幫助。值得一提的是,該方法使用無監督的方式訓練LSTM單元,因此不需要大量的數據集標記成本。Pan 等人[22]對DP-CNN[20]進行改進,提出了Improved-CNN,獲得了更好的效果,并且探究了缺陷預測模型中超參數的不穩定性。

2 基于特征融合的軟件缺陷預測方法

下面詳細介紹了本文提出的2T-CNN,它可以自動從源代碼中提取代碼的結構和語義特征,對源代碼是否具有缺陷進行預測。圖2 展示了2T-CNN 的整體框架,通過以下5 個步驟對程序代碼進行缺陷預測:(1)源代碼解析;(2)詞嵌入;(3)特征提取;(4)特征融合;(5)缺陷預測。

圖2 2T-CNN整體工作流程圖Fig.2 Overall workflow of 2T-CNN

2.1 源代碼解析

程序源代碼中蘊含著豐富的特征,軟件缺陷預測就是從程序源代碼中挖掘這些特征用于預測程序缺陷。但是,從原始的源代碼結構中提取特征是困難的,同時源代碼中所蘊含的特征并不都是對缺陷預測有價值的,例如注釋文本。因此,需要將源代碼解析為合適的結構和粒度,并且去除其中的冗余特征以提取有利于缺陷預測的特征。

2T-CNN 的源代碼解析分為兩部分,一部分是將源代碼解析為AST,另一部分是將源代碼的文本轉換為Token 序列,兩種程序表示形式分別對應了兩個特征提取網絡的輸入,具體步驟將在下面的內容中詳細介紹。

2.1.1 解析AST

程序代碼具有嚴格的結構信息,這種結構信息在AST上可以得到具體體現。AST是樹狀結構,可以準確描述每個節點與其相關節點的結構關系,因此本文將程序源代碼解析為AST來提取源代碼的結構特征。

本文使用javalang[23]將源代碼解析為AST,該工具基于Java 語言規范對源代碼進行解析。使用該工具可以方便地將源代碼解析為AST,并提取出AST上的各個節點用以解析程序。例如,ClassDeclaration節點代表類定義,ForStatement 節點代表for 循環,它的兩個子節點ForControl和BlockStatement構成了for循環的條件語句和循環體。

因為需對完整的AST進行卷積操作,為了盡可能保留程序中所有的結構信息,舍棄了Import節點、Package節點,還有注釋節點等對缺陷預測沒有作用的節點,對其他所有的節點類型進行了保留。此外,由于文獻[11]使用的方法僅僅關注了AST節點類型信息,沒有對不同的變量和方法作區分,因此本文對生成的AST進行了更改。具體來說,將方法調用、變量引用替換為它們的值。例如add函數和remove函數都屬于MethodInvocation節點,但它們具有不同的作用。

在獲得了程序的AST之后,構建一個二維列表來表示整個AST。其中,第一維的索引代表相對應的節點,第二維中的元素代表該節點的所有子節點的映射,整個二維列表就可以用來表示一段代碼的AST。二維列表的表示形式如下:

其中,nodem表示AST 中的節點,childn表示nodem的子節點。以圖1 中的代碼片段為例,圖3(a)展示了for循環的整個AST結構,圖3(b)是它所對應的二維列表。

圖3 圖1中for循環的AST及其二維列表Fig.3 AST of for loop and its two-dimension list in Fig.1

2.1.2 解析Token序列

程序語言已經被證實具有自然語言的特點,因此可以將程序語言視為自然語言文本來提取代碼的語義特征。通過詞法分析將程序代碼解析為Token 序列可以最大程度地保留代碼中的語義信息,同時Token序列也是最符合自然語言文本的表示形式,使模型可以更有效地學習到代碼中的語義特征。

本文將程序代碼解析為Token 序列的偽代碼表示如下:

具體來說,刪除的冗余代碼包括導包、打包、單行注釋、多行注釋、行尾注釋等對于缺陷預測沒有任何幫助的代碼,并且它們本身的語義也會影響預測結果。借助javalang 工具中tokenizer 模塊對代碼進行分割,得到程序的Token列表。本文舍棄了類型為Separator的Token,因為對于TextCNN 來說,輸入樣本的長度要一致,長度過大會消耗更多資源,也不利于模型收斂,并且Separator類型的Token雖然蘊含一定的程序結構特征,但它沒有AST中蘊含的結構特征明顯,同時也會干擾TextCNN對代碼語義特征的提取。對于類型為Identifier 的自定義標識符建立映射集M并進行值替換,通過對其進行標準化可以在不影響程序語義和結構的情況下,減少詞匯量,加快詞嵌入的訓練速度,同時有效降低不同自定義標識符帶來的影響。映射機制描述如下:

對于圖1例子中的for循環,舍棄其類型為Separator的Token,同時對自定義標識符i、add、remove進行替換,提取得到的Token序列為:<for,int,identifier1,=,Integer,identifier1,‘<’,Integer,identifier1,++,identifier2,identifier3,Integer,identifier2,identifier4,Integer>。

2.2 詞嵌入

類比計算機視覺領域將圖片轉換為[0,255]的像素值矩陣作為神經網絡的輸入,2T-CNN 也需要將程序代碼文本轉換為數值向量輸入到神經網絡中,本文選用word2vec[24]來進行詞嵌入處理。

word2vec是一種利用BP神經網絡來自動學習詞語表示的工具,區別于獨熱編碼,它可以將詞語映射到一個固定長度的向量中,同時還可以保留詞語的語義特征,因為經過訓練后,語義相近的詞語在向量空間的分布上很接近。本文使用Gensim工具包提供的word2vec模塊進行詞嵌入處理。

對于程序的兩種表示方式,分別在兩個語料庫上進行訓練。在AST 表示方式中,將2.1.1 小節得到的AST中的每個節點替換為它的詞向量,構建詞嵌入AST。在Token 序列表示方式中,訓練獲取每個出現次數超過5次的Token 的詞向量,出現次數過少的Token 不會對預測結果造成較大影響。對于TextCNN來說,輸入矩陣的形狀必須相同,通過觀察數據集中所有文件的Token序列長度,統計它們的平均數和中位數,最終將Token 序列長度設置為250,超過此長度部分舍棄,不足此長度的補0。設置詞向量長度為50,最終構建了大小為(250,50)的輸入矩陣。

經過兩種訓練方法訓練后,獲得了具有詞嵌入編碼的AST和Token序列矩陣,根據源代碼文件編號將相同程序的詞嵌入AST 和Token 序列矩陣一一對應,構建(tb_nodes,tb_ast,tx_input|label)輸入樣本。其中tb_nodes是AST節點的詞向量矩陣,tb_ast是代表整個AST的二維列表,tx_input是Token序列的向量矩陣,label是標簽矩陣,表示程序是否具有缺陷。

2.3 特征提取

2.3.1 基于TBCNN的結構特征提取

本文使用的TBCNN 如圖4 所示,它包含一個基于樹的卷積層(tree-based convolution)、一個池化層(max pooling)以及一個全連接層(fully connected)。圖4(a)是經過詞嵌入的AST,虛線三角形框表示卷積核,卷積核在AST 的每一個節點上滑動后得到圖4(b)中的特征圖。

圖4 2T-CNN中提取結構特征所用TBCNNFig.4 TBCNN for extracting structural features from 2T-CNN

在卷積層,卷積核的深度設置為2,權重矩陣Wconv由三個矩陣的線性組合構成,它們的系數分別是使用LeakyReLU作為激活函數,它可以有效解決Tanh 造成的梯度消失問題,并且加快模型收斂速度。在一次卷積中,假設卷積窗口中有n個節點x1,x2,…,xn,卷積過程可以由式(3)來表示:

其中,權重系數wconv,i可由式(4)確定:

其中,d表示卷積核的深度,di表示節點xi在卷積核窗口中的深度,pi表示節點xi的位置,n表示節點xi的所有子節點數量。由式(4)可以看出權重系數是由節點在卷積核窗口中的相對位置計算得到,可以合理地反映出各節點間的位置關系。整個卷積層的參數量為15 100個,復雜度為O( )nodes×d×c,其中nodes表示AST 節點數量,d表示詞向量長度,c表示卷積核個數。

在池化層,使用MaxPooling 進行池化,保留主要特征并減少參數。為了簡化特征融合的過程,添加了一個全連接層使TBCNN 最終輸出的特征向量長度和TextCNN相同,在本文中,TBCNN輸出的特征向量長度被設置為100。

2.3.2 基于TextCNN的語義特征提取

程序代碼的Token序列是由源代碼解析而來,相比于其他的程序表示方式,它在Token 級別表示程序,具有最細的粒度,因此其中蘊含著豐富的語義信息。本文沒有選擇文獻[16]中使用的Bi-LSTM來提取Token序列中的語義特征,主要原因有兩點:一是因為雖然TextCNN在聯系文本上下文的表現上不如Bi-LSTM,但它可以通過設置多個不同大小的卷積核,抓住文本多個不同的ngram 特征,并且對于同一個n-gram 特征也會從不同角度去提取關鍵的信息;二是因為在2.2節,將Token序列長度設置為250,Bi-LSTM在處理長文本的訓練速度上比TextCNN慢得多。因此在2T-CNN中選擇使用TextCNN來提取代碼的語義特征。

本文設計實現的TextCNN 如圖5 所示,它將Token序列的詞嵌入矩陣(embedding matrix)作為輸入,包含兩個卷積層(convolutional layer)和池化層(pooling layer),最后連接一個扁平層(flatten layer)。詞嵌入矩陣是一個s×d的矩陣,其中s代表樣本中Token 序列的長度,d代表Token 的詞向量長度,整個矩陣就表示了一條樣本。在卷積層中,通過設置多個寬度不同,長度等于詞向量長度d的卷積核,保證卷積核每次滑動過的位置都是完整的單詞,從而更全面地提取Token序列中的語義信息,每個卷積核的卷積過程可以用式(5)表示:

圖5 2T-CNN中提取語義特征所用TextCNNFig.5 TextCNN for extracting semantic features from 2T-CNN

其中,W∈?h×d,A∈?s×d,A[i:i+h-1] 表示詞嵌入矩陣A的第i行到第i+h-1 行,卷積核在每一個嵌入矩陣上從上到下滑動提取程序的語義特征。兩個卷積層的參數量為24 550 個,復雜度為,其中l表示卷積層數,hl表示卷積核寬度,sl-1表示序列長度,dl表示卷積核個數。

在池化層,采用MaxPooling進行池化操作。在扁平層,使用Flatten方法將所有特征圖展開堆疊成一個長度固定的特征向量。在本文中,TextCNN輸出的特征向量長度和TBCNN保持一致,設置為100。

2.4 特征融合

使用TBCNN 和TextCNN 獲取到的不同層面的代碼特征均是高維且抽象的,雖然它們的側重點不同,但它們并不是相互獨立的,因此采用特征融合的方式將這些高維特征融合可以提高預測的準確率。

常見的特征融合方式很多,例如取Average、Maximum,本文使用的特征融合方式是Concatenate。一種先驗知識認為Concatenate的融合方式可以將從相同程序的兩種表示中提取到的不同特征進行強化互補,從而提高預測的準確率。在3.4.4小節通過實驗驗證了Concatenate融合方式相較于Average和Maximum,可以獲得更好的效果。

具體做法是,從TBCNN 和TextCNN 的最后一層輸出中得到特征向量,分別記作tbout、txout,對tbout和txout進行Concatenate操作,將它們拼接為特征向量fuse_vec。

此外,正如圖1 中的例子所示,不同缺陷在不同特征表現上具有不同的強弱度。根據缺陷類型的不同,為提取到的結構特征和語義特征分配不同的比重,可以提高預測的準確率。人工定義這個比重缺乏合理性,因此在模型中實現一個自定義層,讓網絡自動學習特征中每個元素的系數。添加的自定義層如圖6所示,分為系數分支和短路分支。

圖6 用于學習結構和語義特征比重系數的自定義層Fig.6 Defined-self layer for learning structure and semantic features proportion coefficient

在系數分支,將權重矩陣Wp初始化為大小和fuse_vec相同的矩陣,將fuse_vec和Wp逐元素相乘,并通過Sigmoid 函數進行歸一化并對其加1,防止梯度消失,通過反向傳播不斷更新Wp的參數。在短路分支,直接將fuse_vec作為輸出,從而將系數分支輸出的權重矩陣以逐元素相乘的方式作用在fuse_vec上。自定義層的輸出O可以用式(6)表示:

其中,?代表逐元素相乘,1代表元素全為1的矩陣。

模型使用小批量隨機梯度下降算法[25]和Adam優化器[26]進行訓練,以加快訓練速度,同時采用二進制交叉熵作為損失函數。

2.5 缺陷預測

考慮到邏輯回歸分類器在此類研究中有著廣泛的應用[27],因此采用邏輯回歸作為最終的分類器。將融合后的特征向量輸入全連接層,并將全連接層的輸出向量輸入到邏輯回歸分類器中,得到最終的預測結果。

按照上述步驟對訓練集的數據進行處理,通過訓練集訓練模型之后,模型中的所有權重都是固定的。在缺陷預測階段,將沒有訓練過的樣本經過同樣的數據處理過程,輸入到模型中,通過分類器得到最終的分類結果,預測程序是否含有缺陷。

3 實驗評估

下面主要介紹了實驗相關工作以及對2T-CNN 的評估。通過比較2T-CNN 與其他最新方法在軟件缺陷預測方面的準確性來評估其有效性。

本實驗的實驗環境為:Linux 操作系統,i7-10700 CPU,RTX3090 GPU。考慮到神經網絡訓練的隨機性,所有的實驗數據均取10次實驗結果的平均值。

3.1 實驗數據集

本文使用的數據集是PSC(PROMISE source code)數據集和一個工程項目DTSC[28-30]。PSC 來自軟件工程領域的公共存儲庫PROMISE[31],是進行跨版本軟件缺陷預測的常用公開數據集[32-34]。為了與基線方法比較,使用PSC的子數據集SPSC(simplified PROMISE source code)進行對比實驗。SPSC中包含了PSC中7個項目的兩個相鄰版本,例如Camel-1.4、Camel-1.6。特別的是,實驗中刪除了PSC中不能通過編譯的文件,并舍棄了項目名為Pbeans 的項目,因為它的文件數過少,無法使模型收斂。DTSC是一個基于Java語言編寫的C語言程序缺陷檢測工具,可以用于檢測軟件缺陷,在實驗時從中挑選3個最新版本作為DTSC數據集。表1列出了兩個數據集的詳細信息。

將所有文件中的buggy 代碼(即具有缺陷的代碼)標記為1記作正樣本,clean代碼(即沒有缺陷的代碼)標記為0 記作負樣本。如表1 中缺陷文件占比一列所示,可以觀察到一些項目中的缺陷文件占比過小,例如項目Camel-1.4中缺陷文件占比僅為17.3%,這會使數據集中正負樣本差距過大,造成樣本不均衡的問題,樣本不均衡會導致訓練出來的模型泛化能力差并且容易過擬合。樣本不均衡問題在數據層面的處理方法通常有三種:上采樣、下采樣和數據合成。本實驗中,考慮到樣本數量較少且不易合成,故對樣本不均衡項目中的少量樣本進行上采樣,隨機復制少量樣本,使正負樣本比例達到0.4至0.6。

表1 數據集詳細信息Table 1 Dataset details

3.2 評估指標

為了更有效地評估2T-CNN,僅僅使用準確率沒有太大的意義,因為針對軟件缺陷預測的問題,通常更關注的是預測出缺陷的那一部分結果。因此,使用F1 分數(F1-score)來評估2T-CNN,它是由精確率(Precision)和召回率(Recall)共同決定的。

在明確Precision、Recall 和F1-score 的定義之前,首先需要定義四個基本概念:

TP(true positive):預測值為正,標簽值為正。

FP(false positive):預測值為正,標簽值為負。

FN(false negative):預測值為負,標簽值為正。

TN(true negative):預測值為負,標簽值為負。

在本實驗中,將存在缺陷的代碼文件標記為正樣本,不存在缺陷的代碼文件標記為負樣本。借助于以上4個指標,可以計算以下3個指標:

Precision:正確預測的正樣本個數與所有預測為正樣本個數之比。

Recall:正確預測的正樣本個數與所有標簽為正樣本個數之比。

F1-score:精確率和召回率的調和平均值。

從式(7)可以看出Precision越高,誤報率越低,從式(8)可以看出Recall 越高,漏報率越低。雖然Precision和Recall 的值越高證明模型的預測效果越好,但由于Precision 和Recall 之間的相互影響,不能認為其中單一指標可以評估模型的效果,因此引入了F1-score,它是Precision 和Recall 的一個綜合度量,取值范圍是[0,1]。式(9)顯示了F1-score與Precision和Recall的關系,只有F1-score的值越高,才能綜合判斷模型的預測表現更好。

3.3 基線方法

本文將提出的2T-CNN 軟件缺陷預測方法與以下基線方法進行比較:

傳統機器學習模型:使用四種機器學習模型作為傳統模型進行對比,分別是邏輯回歸(LR)、樸素貝葉斯(NB)、決策樹(DT)和隨機森林(RF),這是四種最常用的機器學習模型。與深度學習模型不同的是,傳統機器學習模型使用手工定義特征度量的方式作為輸入。

TBCNN:它取自2T-CNN 的一部分,即將源代碼的AST輸入TBCNN進行特征提取并預測缺陷。

TextCNN:它同樣取自2T-CNN的一部分,即將源代碼解析為Token序列,通過TextCNN提取代碼特征輸入到分類器中,預測程序缺陷。

DP-CNN[20]:它是一種結合了手工定義傳統特征的CNN方法,效果優于僅僅使用CNN的方法。

Improved-CNN[22]:它是一種改進的CNN方法,摒棄了預測模型對手工定義特征的依賴,比原有的CNN 方法在結果上有一定提高。

Bi-LSTM[17]:它是一個結合了代碼屬性圖和注意力機制的雙向LSTM預測模型,可以有效地避免程序語義信息的丟失以及捕獲關鍵特征。

3.4 實驗結果與分析

在探究2T-CNN 同基線方法的優劣時,使用SPSC數據集,這是Li等人[20]和Pan等人[22]使用的數據集,也是跨版本軟件缺陷預測常用的數據集。但僅僅只在SPSC上實驗并不能獲得足夠多的樣本來驗證2T-CNN 的泛化性,因此在探究2T-CNN 的泛化性時,使用PSC 數據集和DTSC數據集。

本文設計了多組對比實驗,并依據實驗數據和實驗結果給出了以下四點分析和結論。

3.4.1 2T-CNN與基線方法的比較

表2展示了2T-CNN 與本文除TBCNN 和TextCNN之外的基線方法在SPSC 數據集上的表現對比。觀察表2可以得到以下兩點結論:

表2 2T-CNN與基線方法在SPSC數據集上的表現比較Table 2 Performance comparison between 2T-CNN and baseline models on SPSC dataset

首先,四種最常見的傳統機器學習方法的平均F1-score均低于四種深度學習方法,因此可以得出結論,在跨版本軟件缺陷預測中,深度學習方法普遍優于傳統機器學習方法,并且可以節省手工定義特征花費的時間。

其次,雖然基于深度學習方法的四種預測模型在不同項目上的表現互有優劣,但2T-CNN取得了最高的F1-score 平均值,因此可以證明基于特征融合的方法在整體上優于已有的深度學習方法。此外,區別于DP-CNN,2T-CNN 的特征提取完全由神經網絡獲取,不需要手工定義特征,因此可以節省大量成本。同時,在初始化2TCNN的超參數時借鑒了Improved-CNN的超參數設定,例如全連接層的節點數、卷積核的步長和大小等,基于初始化的超參數再進行超參數調優,最終獲得了使模型表現最好的超參數設定,這也證明了Pan等人[22]的研究,即超參數使模型具有不穩定性,因為在調參過程中,模型在不同超參數下的表現顯著不同。最后,結合代碼屬性圖的Bi-LSTM的表現比兩種CNN方法好,比2T-CNN稍差,這反映了在代碼解析中,綜合了多種數據結構的代碼屬性圖相較于單一的代碼解析方式,可以蘊含更豐富的特征,但Bi-LSTM要付出更多的訓練時間,這是由于CNN在訓練速度上普遍快于Bi-LSTM[35]。

3.4.2 2T-CNN的泛化能力

為了驗證2T-CNN在軟件缺陷預測中的泛化能力,使用較SPSC更為完整的PSC數據集以及DTSC數據集進行實驗,具體結果如表3所示。

對于PSC數據集,觀察2T-CNN一列,被*標記的數據是顯著低于其他版本對的F1-score。除了帶*的版本對,2T-CNN在其他所有版本對中都能獲得較好的表現,平均F1-score為0.658。

對于表3中被*標記的F1-score,考慮它們較低的原因主要受到兩方面的影響:一是因為在它們的版本對中,存在嚴重的樣本不均衡問題,例如在<Camel-1.0,Camel-1.2>中,Camel-1.0 的缺陷文件數為13,缺陷文件占比僅有3.8%,神經網絡不能充分學習到缺陷特征,F1-score 僅為0.396;二是因為當同一個項目的兩個版本之間進行較大的更新時,它們之間的參數分布會有較大差異,例如在<JEdit-4.2,JEdit-4.3>中,文件數量增加了約1倍,缺陷文件數量卻下降了75%,訓練后的神經網絡不能處理這種巨大差異,對于JEdit-4.3 中的11 個缺陷,在10次實驗中2T-CNN只有2次找到了1個缺陷。在由這兩方面原因造成的樣本結構差異較大時,2T-CNN 的表現不佳。

表3 2T-CNN、TBCNN、TextCNN在兩個數據集上的表現Table 3 Performance of 2T-CNN,TBCNN and TextCNN on two datasets

對于DTSC 數據集,將DTSC 相鄰版本的前一個版本作為訓練集,后一個版本作為測試集進行實驗,最終得到了0.644的平均F1-score,結果略好于PSC數據集上的表現。這證明2T-CNN有著不錯的泛化能力,可以在不同的數據集上獲得相似的表現。

3.4.3 特征融合的有效性

觀察表3中TBCNN、TextCNN和2T-CNN在各個項目上的表現可以看到,基于特征融合的2T-CNN在各個項目上的表現都比它的兩個子模型TBCNN和TextCNN好,這證明了特征融合的思想是正確的,即TBCNN 和TextCNN提取到的特征經過融合后,可以獲得更好的分類效果。

同時應注意到,在缺陷文件占比較小的項目中,F1-score在TBCNN和TextCNN模型上的最大值普遍較低,這是因為訓練集中正樣本比例較低。雖然在訓練集上進行過樣本不均衡處理,但模型依然不能充分學習到缺陷特征。而經過特征融合后,2T-CNN 在這些項目中的表現要優于TBCNN 和TextCNN,這也說明特征融合方法是有效的。

3.4.4 特征融合方式對模型表現的影響

在深度學習中,特征融合的方式有很多種,在本文中探討了三種基本的特征融合方式,分別是Average、Maximum和Concatenate。在保證模型超參數不變的情況下,分別對三種融合方式在SPSC 數據集上進行實驗驗證,結果如表4所示。除了在Lucene項目中Maximum融合表現最好之外,其他項目中都是Concatenate 融合的表現最好,并且所有項目的F1-score 平均值也是Concatenate 融合最好。這也證明了通過TBCNN 和TextCNN 分別提取程序代碼的結構和語義特征的合理性,因為這兩種特征是程序的不同特征,它們具有一定的互質性和互補性,所以Average和Maximum這兩種融合方法會淡化這種差異,而Concatenate 融合方法可以充分考慮它們之間的這種差異,獲得最好的融合效果。

4 結束語

本文針對現有的軟件缺陷預測方法存在的特征提取不完全問題,研究并實現了一種基于結構與語義特征融合的軟件缺陷預測框架2T-CNN。該框架將程序源代碼分別解析為AST和Token序列,從兩種程序表示方式中提取代碼的結構和語義特征,將兩種特征融合后經過分類器輸出預測結果。該方法可以快速預測軟件新版本中可能存在的缺陷,實驗結果表明相較于原有的軟件缺陷預測模型有一定的提高。

在未來的研究工作中,通過研究更多的程序表示方式,例如在程序依賴圖、程序調用圖上設計合適的神經網絡提取特征,用于軟件缺陷預測,以期望獲得更好的預測效果。此外,構建高質量的軟件缺陷預測數據集也是一個值得推進的工作。最后,不同類型的缺陷模式往往具有不同的特征,針對各種缺陷模式的特點,設計不同的神經網絡模型可能會提高預測的準確率,這也將是未來的研究方向。

猜你喜歡
語義程序特征
語言與語義
如何表達“特征”
不忠誠的四個特征
當代陜西(2019年10期)2019-06-03 10:12:04
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
“程序猿”的生活什么樣
抓住特征巧觀察
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
“上”與“下”語義的不對稱性及其認知闡釋
現代語文(2016年21期)2016-05-25 13:13:44
創衛暗訪程序有待改進
中國衛生(2015年3期)2015-11-19 02:53:32
認知范疇模糊與語義模糊
主站蜘蛛池模板: 激情午夜婷婷| a级高清毛片| 一级片一区| 四虎永久在线精品国产免费| 国产在线91在线电影| 国产特一级毛片| 婷婷五月在线| 亚洲人成人无码www| 2021精品国产自在现线看| 亚洲精选高清无码| 成人国产精品网站在线看| 国产区免费精品视频| 免费 国产 无码久久久| 精品中文字幕一区在线| 亚洲福利视频网址| 亚洲天堂伊人| 黄色网在线| 最新亚洲av女人的天堂| 日本不卡免费高清视频| 午夜国产小视频| 国产美女自慰在线观看| 日本亚洲欧美在线| 日本免费新一区视频| 亚洲国内精品自在自线官| 国产免费观看av大片的网站| 久草视频福利在线观看| 噜噜噜久久| 国产99在线| 91亚洲影院| 婷婷色中文网| 久久久精品无码一区二区三区| 久久夜色撩人精品国产| 欧美日韩国产在线观看一区二区三区| 久久亚洲中文字幕精品一区| 毛片一级在线| 丝袜亚洲综合| 国产欧美视频综合二区| 毛片免费在线| 少妇露出福利视频| 毛片网站观看| 2021国产精品自拍| 日韩免费成人| 岛国精品一区免费视频在线观看| 日韩专区欧美| 日本成人精品视频| 欧美啪啪视频免码| 国产精品黑色丝袜的老师| 日日碰狠狠添天天爽| 精品视频免费在线| 欧美精品高清| 激情影院内射美女| 免费国产高清精品一区在线| 久久久精品国产SM调教网站| 国产综合网站| 在线精品视频成人网| 亚洲视频免| 国产精品一区在线观看你懂的| 国产人前露出系列视频| 欧美成人国产| 国产精品久久久久久影院| 亚洲三级视频在线观看| 天天躁狠狠躁| 国产免费久久精品99re丫丫一 | 成年看免费观看视频拍拍| 午夜毛片福利| 26uuu国产精品视频| 日韩欧美成人高清在线观看| 国产乱子伦无码精品小说| 久久大香伊蕉在人线观看热2| 国产乱子伦无码精品小说| 色老二精品视频在线观看| 亚洲美女AV免费一区| 日韩av手机在线| 久久久久久久蜜桃| 日本精品一在线观看视频| 99久久精品免费观看国产| 国产精品九九视频| 婷婷六月综合网| 欧美一级在线看| 99久久国产综合精品女同| 在线无码九区| 在线日本国产成人免费的|