黃曉偉,范貴生,虞慧群,楊星光
(1.華東理工大學(xué) 計算機科學(xué)與工程系,上海 200237;2.上海市計算機軟件測評重點實驗室,上海 201112)
在軟件項目開發(fā)過程中,軟件項目的最終可靠性是所有開發(fā)人員以及項目負責人都十分關(guān)注的。軟件缺陷是影響軟件項目可靠性的重要因素,一般通過減少軟件缺陷的引入以及修正已經(jīng)存在的缺陷兩種方法來減少軟件缺陷。軟件項目的開發(fā)人員和測試人員通過構(gòu)建軟件缺陷模式[1],能夠利用積累的軟件缺陷數(shù)據(jù)提高軟件項目的可靠性。
軟件缺陷預(yù)測(Software Defect Prediction,SDP)[2-3]利用軟件開發(fā)過程存儲的歷史數(shù)據(jù)和測試人員對發(fā)現(xiàn)缺陷模塊的標注,通過構(gòu)建機器學(xué)習(xí)分類器對新開發(fā)的軟件模塊進行分類預(yù)測,判斷該模塊是否存在缺陷。根據(jù)源數(shù)據(jù)項目與目標數(shù)據(jù)項目的差異,軟件缺陷預(yù)測可以進一步劃分為項目內(nèi)缺陷預(yù)測(Within-Project Defect Prediction,WPDP)[4-5]、跨項目缺陷預(yù)測(Cross-Project Defect Prediction,CPDP)[4,6]、異構(gòu)缺陷預(yù)測(Heterogeneous Defect Prediction,HDP)[7-8]。根據(jù)預(yù)測程序規(guī)模,程序包括函數(shù)級、文本級、變更級等預(yù)測粒度。
傳統(tǒng)缺陷預(yù)測方法根據(jù)項目源代碼的行數(shù)、復(fù)雜度、耦合度等提取描述源代碼的指標,利用構(gòu)建的機器學(xué)習(xí)分類模型進行分類學(xué)習(xí)。但是,這些靜態(tài)代碼指標[9-10]只是代碼的宏觀描述,有缺陷代碼和無缺陷代碼很可能具有相同的代碼指標,使分類器無法區(qū)分。這些宏觀上無法區(qū)分的代碼,具有不同語義和結(jié)構(gòu)信息,因此利用項目代碼的語義和結(jié)構(gòu)信息能夠提高缺陷預(yù)測性能。抽象語法樹(Abstract Syntax Tree,AST)是以樹狀的形式表現(xiàn)編程語言的語法結(jié)構(gòu),樹上的每個節(jié)點都表示源代碼中的一種結(jié)構(gòu)。目前,研究人員提出的基于AST 的DP-CNN[11]和DP-ARNN[12]方法僅使用了部分源代碼的語義和結(jié)構(gòu)信息。
為利用AST 中的更多信息,本文提出一種基于重子(Heavy Son,HS)節(jié)點抽象語法樹的軟件缺陷預(yù)測方法HSAST。將程序源代碼的AST 進行序列化提取節(jié)點類型和值信息,根據(jù)節(jié)點輕重分類確定舍去節(jié)點時的優(yōu)先級,并使用F1 值[13]和AUC 值[14]作為評測指標,同時將Apache 中的5 個項目作為實驗數(shù)據(jù)集。
當軟件項目處于初級階段且存在歷史庫丟失或損壞等問題時,軟件項目需要的數(shù)據(jù)無法從自身項目的歷史庫中獲取,此時就需要借助其他的項目數(shù)據(jù),屬于跨項目缺陷預(yù)測和異構(gòu)缺陷預(yù)測。在跨項目缺陷預(yù)測和異構(gòu)缺陷預(yù)測方面,研究人員一般通過遷移學(xué)習(xí)等方法解決了不同項目度量元分布不同的問題。倪超等[6]采用兩階段跨項目缺陷預(yù)測方法FeCTrA,先通過聚類篩選出源項目與目標項目具有高分布相似度的特征,再基于TrAdaBoost 方法選出源項目中與目標項目標注實例分布相似的實例進行預(yù)測。RYU 等[15]在遷移學(xué)習(xí)過程中,考慮到少量的目標項目標記會加重缺陷預(yù)測數(shù)據(jù)集的類不平衡問題,提出一種對遷移成本敏感的學(xué)習(xí)方法,將權(quán)重分配給訓(xùn)練實例。BENNIN 等[16]通過減弱缺陷數(shù)據(jù)集的類不平衡程度來提升缺陷模型的預(yù)測精度并提出MAHKIL 方法。MAHKIL 方法是一種基于染色體理論的缺陷數(shù)據(jù)集采樣方法,利用兩個不同的缺陷樣本生成一個新實例,新實例繼承父親樣本的不同特征。
傳統(tǒng)缺陷預(yù)測方法使用表示代碼宏觀信息和固有特征的度量元來描述代碼模塊。這些度量元由有經(jīng)驗的開發(fā)人員、測試人員和研究人員設(shè)計提出,可能更切合總結(jié)特征時選擇的軟件項目。當這些度量元用來描述其他軟件項目時,部分指標與標簽沒有高度相關(guān)性,變成冗余信息,還可能影響預(yù)測模型的性能。因此,充分利用程序代碼的結(jié)構(gòu)和語義信息,能夠使代碼模塊的表征更切合目標軟件。
AST 和控制流圖(Control Flow Graph,CFG)是當前常用的利用數(shù)據(jù)結(jié)構(gòu)對程序代碼進行表示的方法。AST 是以樹狀形式表示軟件源代碼的語法結(jié)構(gòu),樹上的每個節(jié)點都表示源代碼中的一種結(jié)構(gòu)。CFG 是以圖的形式表示軟件代碼中一個模塊在執(zhí)行過程中的可能流向。LI 等[11]采用AST表示程序代碼,遍歷AST 時選擇具有特定類型的節(jié)點,通過字典映射并利用節(jié)點轉(zhuǎn)換向量構(gòu)建向量組來描述整個程序代碼。通過卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)產(chǎn)生一個向量來表征整個程序代碼,這個向量具有類似度量元的功能。PAN 等[17]在卷積層后增加了dense 層和dropouts 層來減少模型過擬合問題。FAN 等[12]提出一種基于注意力的循環(huán)神經(jīng)網(wǎng)絡(luò)缺陷預(yù)測(DP-ARNN)模型來構(gòu)建代碼表征向量,該模型通過注意力機制對前后節(jié)點的關(guān)聯(lián)信息進行有效利用。VIET 等[18]通過編譯程序代碼獲得的匯編指令構(gòu)造CFG,使用基于有向圖的卷積神經(jīng)網(wǎng)絡(luò)(DGCNNs)構(gòu)建代碼表征向量。上述方法根據(jù)深度優(yōu)先遍歷獲得AST 節(jié)點,并且僅選取特定類型的節(jié)點。這可能使不相關(guān)的節(jié)點被視為有關(guān)聯(lián)的節(jié)點,導(dǎo)致不正確的缺陷預(yù)測。因此,在本文方法中將使用輕重鏈來區(qū)分節(jié)點在樹中的位置,并僅以輕重程度作為條件來選擇需要的節(jié)點。
本文提出的HSAST 方法首先將AST 中的每個節(jié)點進行標記,在節(jié)點數(shù)超過預(yù)設(shè)的代碼描述向量組時,根據(jù)標記的優(yōu)先級選擇被舍棄的節(jié)點,然后使用深度學(xué)習(xí)方法將向量組轉(zhuǎn)換為代碼模塊的表征向量,以此進行精確的軟件缺陷預(yù)測。圖1 給出了HSAST 的總體框架。首先將程序模塊的源代碼解析為AST;然后根據(jù)子樹的大小對節(jié)點進行標記,根據(jù)節(jié)點標記和節(jié)點包含的信息從AST 中獲取節(jié)點序列;之后通過字典映射和詞嵌入方法將節(jié)點序列編碼為多維向量,這些向量會作為深度神經(jīng)網(wǎng)絡(luò)的輸入,通過深度神經(jīng)網(wǎng)絡(luò)完成代碼模塊的結(jié)構(gòu)和語義學(xué)習(xí);最后將學(xué)習(xí)獲得的代碼模塊表征向量輸入到邏輯回歸分類器中進行分類完成缺陷預(yù)測。
圖1 基于重子節(jié)點抽象語法樹的缺陷預(yù)測框架Fig.1 Defect prediction framework via heavy son node-based abstract syntax tree
神經(jīng)網(wǎng)絡(luò)模型無法將完整的文本信息直接轉(zhuǎn)換成描述文本信息的向量,需要合適的方法將計算機代碼先轉(zhuǎn)換成神經(jīng)網(wǎng)絡(luò)模型能夠運用的實數(shù)向量數(shù)據(jù),再通過深度學(xué)習(xí)網(wǎng)絡(luò)進行學(xué)習(xí)。根據(jù)已有研究,研究人員使用AST 來表示一段程序,這種數(shù)據(jù)結(jié)構(gòu)能夠很好地反映代碼模塊的結(jié)構(gòu)和語義信息。在本文實驗中,將使用一個名為javalang 的開源Python包來完成代碼模塊的解析任務(wù),通過https://github.com/c2nes/javalang 獲取,能夠?qū)ava 源代碼解析成對應(yīng)的AST。
根據(jù)DP-CNN方法[11]和javalang的源代碼文件tree.py,有3 種類型的AST 節(jié)點含有代碼模塊的語義信息,具體為:1)方法調(diào)用的節(jié)點;2)聲明的節(jié)點,包括方法聲明、構(gòu)造函數(shù)聲明和類聲明等;3)引用的包、參數(shù)定義等。其他結(jié)構(gòu)信息主要包括控制流節(jié)點(分支、循環(huán)、異常引發(fā)、捕獲等)以及類的起始與終止、聲明的起始等表示代碼模塊結(jié)構(gòu)的信息。
首先,對于AST 中不含代碼語義信息的節(jié)點,本文選擇一段特殊的字符串$null$作為第一部分表示該節(jié)點不包含文本信息,并記錄描述節(jié)點類型的字符串作為描述節(jié)點值的第二部分。然后,對于AST中包含代碼語義信息的節(jié)點,提取節(jié)點的名稱或節(jié)點對應(yīng)的值作為第一部分,記錄描述節(jié)點類型的字符串作為第二部分,結(jié)合兩者對節(jié)點進行描述。最后,按照規(guī)則將每個代碼模塊的AST 轉(zhuǎn)換為向量,此時向量是AST 標記字符串的組合,無法直接作為深度學(xué)習(xí)網(wǎng)絡(luò)的輸入。本文在標記字符串與整數(shù)之間建立映射字典表,先計算每個標記的出現(xiàn)頻率,再根據(jù)標記頻率進行排序,使出現(xiàn)頻率高的標記位于字典表前端。在完成映射后,為避免向量過于稀疏,選擇合適的向量長度。對于小于指定長度的向量,將通過填充0 來增加長度。對于長度大于指定長度的向量,將通過基于重子節(jié)點的標記按規(guī)則舍去部分長度,直到向量長度與指定長度相等。
HSAST 方法采用樹鏈剖分思路將樹分割成多個部分,具體定義如下:
定義1重子節(jié)點為在所有子節(jié)點中以該節(jié)點為根的子樹規(guī)模(即樹的節(jié)點數(shù)目)最大的節(jié)點。以重子節(jié)點為根的子樹為重子樹。
定義2輕子(Light Son,LS)節(jié)點為除了重子節(jié)點外的其他子節(jié)點。以輕子節(jié)點為根的子樹為輕子樹。
算法1 描述了將AST 分割成重子節(jié)點和輕子節(jié)點的過程。輸入是AST 的節(jié)點nodei和節(jié)點對應(yīng)的下標nexti。輸出是以節(jié)點為根的子樹大小sizei和該節(jié)點的重子節(jié)點soni。
算法1重子節(jié)點分割算法
在將代碼模塊解析成AST 的過程中,包含源代碼中更多文本信息和控制流信息的部分在AST 中形成的子樹更大,同時這一部分更有可能形成缺陷。若舍去代碼模塊中出現(xiàn)頻率低的標記字符串,則有可能會舍去重子樹中具有特異點的標記。因此,保留具有更多信息的重子樹,從信息較少的輕子樹開始舍去能提高模型預(yù)測性能。
算法2 描述了重子樹的選擇過程。輸入是AST的節(jié)點nodei和節(jié)點對應(yīng)的下標nexti、節(jié)點的重子節(jié)點soni和序列化向量的最大長度MaxSize。輸出是序列化后的向量V。采用嵌入到網(wǎng)絡(luò)中的詞作為可訓(xùn)練的單詞字典,將標記轉(zhuǎn)換為高維向量。
算法2重子數(shù)選擇算法
在一個軟件項目的正常生命周期中,無缺陷的模塊總是多于有缺陷的模塊,因此在預(yù)測模型數(shù)據(jù)集時,無缺陷樣本往往多于有缺陷樣本。如果直接使用未處理過的源數(shù)據(jù)集進行訓(xùn)練,則結(jié)果將偏向多數(shù)類,即更容易將目標軟件模塊視為無缺陷的樣本。在類不平衡問題上,研究人員進行了大量研究[19-20]并取得了一定的研究成果。為進行更有效的對比,本文使用過采樣方法[12]處理類不平衡問題,從有缺陷樣本中隨機復(fù)制訓(xùn)練樣本,生成類平衡的訓(xùn)練數(shù)據(jù)集。
本文采用3 種深度學(xué)習(xí)模型提取代碼模塊中的結(jié)構(gòu)和語義信息:1)循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)模型,利用雙向長短期記憶(Bi-directional Long Short-Term Memory,Bi-LSTM)網(wǎng)絡(luò)對代碼模塊的信息進行學(xué)習(xí),能夠獲取源代碼的上下文信息;2)基于注意力機制的循環(huán)神經(jīng)網(wǎng)絡(luò)(Attention-based RNN,ARNN)模型,在Bi-LSTM 的基礎(chǔ)上加入注意力層,能夠突出對預(yù)測結(jié)果更具影響的關(guān)鍵信息;3)CNN 模型,對程序代碼模塊信息先進行局部感知,再在更高層次對局部進行綜合操作,從而得到全局信息。
軟件缺陷的預(yù)測主要分為4 個部分:1)詞嵌入層,將處理后的AST 數(shù)字標記向量轉(zhuǎn)換成固定長度的高維實數(shù)向量;2)信息抓取,通過深度學(xué)習(xí)模型獲取輸入序列中的關(guān)鍵信息;3)代碼表征,將提取到的特征進行綜合形成表示代碼模塊特征的向量;4)輸出層,根據(jù)表征向量輸出缺陷預(yù)測結(jié)果。
通過實驗對HSAST 方法進行有效性驗證,從多個角度分析HSAST 方法的性能優(yōu)劣。介紹實驗過程中采用的數(shù)據(jù)集、性能評價指標以及實驗流程和參數(shù)設(shè)定,選擇Keras、Tensorflow 以 及Sklearn 構(gòu)建深度學(xué)習(xí)模型,運行于配置為Windows 10 操作系統(tǒng)、i7-6700HQ 2.60 GHz處理器、16GB內(nèi)存的計算機上。
HSAST 方法需在具有一定歷史標記數(shù)據(jù)的目標項目中完成預(yù)測任務(wù),從源代碼中提取代碼模塊的結(jié)構(gòu)和語義信息,利用AST 中的節(jié)點類型和值信息來構(gòu)建代碼表征向量。為驗證HSAST 方法的有效性,提出以下2 個研究問題:
1)RQ1。將HSAST方法與采用DFS[12]搜索并根據(jù)字典頻率舍去節(jié)點的處理方法(簡稱為DFS 方法)進行性能分析與對比。
2)RQ2。將不同深度學(xué)習(xí)模型下的HSAST 方法性能進行對比與分析。
采用Apache 開源項目中的5 個開源Java 項目,每個項目都包含兩個版本。Java 項目數(shù)據(jù)集是專門用于軟件工程研究的公開數(shù)據(jù)集,被大量研究人員認可和使用,提供了每個文件的類名、靜態(tài)度量元以及缺陷標簽。使用公開數(shù)據(jù)集可確保實驗所用項目的歷史數(shù)據(jù)標記是被廣泛認可的。表1 給出了Java項目數(shù)據(jù)集信息。使用每個項目中版本號靠前的版本作為訓(xùn)練數(shù)據(jù)集,版本號靠后的版本作為測試數(shù)據(jù)集。在使用訓(xùn)練數(shù)據(jù)集進行模型訓(xùn)練時,隨機選擇其中的70% 作為訓(xùn)練集,剩下的30% 作為驗證集。
表1 Java 項目數(shù)據(jù)集信息Table 1 Dataset information of Java project
在進行樣本預(yù)測后,根據(jù)樣本有無缺陷的實際情況和預(yù)測結(jié)果可以產(chǎn)生4 種預(yù)測結(jié)果:實際有缺陷的樣本被預(yù)測為有缺陷,即TTP;實際無缺陷的樣本被預(yù)測為無缺陷,即TTN;實際無缺陷的樣本被預(yù)測為有缺陷,即FFP;實際有缺陷的樣本被預(yù)測為無缺陷,即FFN。基于這4 種預(yù)測結(jié)果,得到查準率(P)和查全率(R)這兩個基礎(chǔ)的評測指標。
查準率也稱為正確率,指預(yù)測結(jié)果為有缺陷樣本中,實際有缺陷樣本的比例,計算公式如下:
查全率也稱為召回率,指所有實際有缺陷的樣本中,被預(yù)測為有缺陷樣本的比例,計算公式如下:
單獨通過一個指標對模型進行測評是不夠準確的,比如模型將所有測試樣例都預(yù)測為有缺陷樣本,那么該模型能夠得到100%的查全率,但是其查準率較低。為更綜合地評價HSAST 方法,將F1 值(F)和AUC 值也作為評測指標。F1 值是查準率與查全率的調(diào)和平均值,計算公式如下:
AUC 被定義為ROC 曲線下與坐標軸圍成的面積,該面積的數(shù)值不會大于1。AUC 值越接近1,檢測方法的真實性越高。
在以下3 種深度學(xué)習(xí)模型的基礎(chǔ)上利用HSAST和DFS 方法進行缺陷預(yù)測:
1)RNN。使用基于LSTM 單元的雙向循環(huán)神經(jīng)網(wǎng)絡(luò)來捕獲和提取代碼模塊中的結(jié)構(gòu)和語義信息后,進行軟件缺陷預(yù)測。
2)ARNN。在Bi-LSTM 的基礎(chǔ)上加入注意力層提取對預(yù)測結(jié)果更具影響的關(guān)鍵信息后,進行軟件缺陷預(yù)測。
3)CNN。通過文本序列卷積的方式提取代碼模塊中局部和全局信息后,進行軟件缺陷預(yù)測。
采用HSAST 和DFS 方法生成模型輸入,使用相同參數(shù)進行模型訓(xùn)練。具體而言,CNN 設(shè)置10 個長度為5 的過濾器,全連接層的隱藏節(jié)點數(shù)為100。RNN 與ARNN 設(shè)置LSTM 節(jié)點數(shù)為16、第一層隱藏節(jié)點數(shù)為16、第二層隱藏節(jié)點數(shù)為8。每個樣本形成的向量以固定長度(2 000)輸入到模型中,所有模型的詞嵌入層將數(shù)字向量轉(zhuǎn)換成維度為30 的高維向量。表2 和表3 給出了模型在5 個項目下的運行結(jié)果,顯示了同一項目中兩種方法在相同深度學(xué)習(xí)網(wǎng)絡(luò)下的比較統(tǒng)計數(shù)據(jù),其中,粗體顯示了每個項目的最佳預(yù)測結(jié)果,最后一行顯示了兩種方法對5 個項目預(yù)測結(jié)果的平均值。表4 給出了HSAST 與DFS方法在5 個項目下的時間成本對比結(jié)果。
表2 基于HSAST 和DFS 方法的深度學(xué)習(xí)模型F1 值比較Table 2 Comparison of F1 values of deep learning models based on HSAST and DFS methods
表3 基于HSAST和DFS方法的深度學(xué)習(xí)模型AUC值比較Table 3 Comparison of AUC values of deep learning models based on HSAST and DFS methods
表4 HSAST 與DFS 方法的時間成本比較Table 4 Comparison of time cost between HSAST and DFS methods s
3.5.1 針對RQ1 的結(jié)果分析
利用3 種深度學(xué)習(xí)模型(CNN、RNN 和ARNN)進行分析與比較,證明了HSAST 方法優(yōu)于DFS 方法不是使用特定深度學(xué)習(xí)模型出現(xiàn)的偶然情況。使用表1 中列出的這些項目進行實驗,每個項目采用兩個版本,版本靠前的作為訓(xùn)練數(shù)據(jù)集用于訓(xùn)練預(yù)測模型,版本靠后的作為測試數(shù)據(jù)集用于評估模型性能。
表2 列出了分別采用HSAST 和DFS 方法的3 種深度學(xué)習(xí)模型在每個項目上的F1 值。以Camel 為例,采用HSAST方法處理AST,ARNN、RNN 和CNN 分別取得的F1 值為0.531、0.517 和0.554;采用DFS處理AST時,ARNN、RNN 和CNN分別了取得的F1 值為0.506、0.494 和0.519。顯然,在3 個深度學(xué)習(xí)模型上,HSAST 方法均比DFS 方法表現(xiàn)更好。由表2 的最后一行可以看出,HSAST 方法在F1 平均值方面也比DFS 方法表現(xiàn)更好,在ARNN 上平均提升約3%。這些結(jié)果表明了基于HSAST 方法的深度學(xué)習(xí)缺陷預(yù)測模型具有更好的預(yù)測性能。
表3 列出了每個項目的AUC 值。HSAST 方法同樣在大部分項目上比DFS 方法表現(xiàn)更好。總體而言,HSAST 方法在使用ARNN 深度學(xué)習(xí)模型時具有最佳性能,而基于其他深度學(xué)習(xí)模型時,與DFS 方法具有相近的性能。由表3 的最后一行可以看出,HSAST 方法在AUC 平均值方面也比DFS 方法表現(xiàn)更好,在ARNN 上平均提升約4%。
從表4 可以看出,HSAST 方法比DFS 方法平均多花費了55 倍的時間成本,主要在Xalan 和Poi 項目上花費了更多的時間成本。HSAST 方法相比DFS方法在語法樹結(jié)構(gòu)重構(gòu)以及節(jié)點所在樹的位置識別上花費了更多的時間成本,該成本受樹的大小即項目源代碼的文件大小影響。
實驗?zāi)P偷闹饕顒e在于通過深度學(xué)習(xí)方法提取代碼模塊信息前的數(shù)據(jù)處理階段。HSAST 方法對AST 的所有節(jié)點進行處理,并優(yōu)先保留可能具有更多特征信息的重子樹,但HSAST 方法也保留了更多的冗余信息,這些信息會干擾分類器的分類結(jié)果,在實驗結(jié)果上表現(xiàn)為:在個別項目上DFS 方法具有比HSAST 方法更優(yōu)的性能?;谏衔姆治龅贸鲆韵陆Y(jié)論:采用深度學(xué)習(xí)模型捕獲代碼模塊的隱藏信息,再進行項目內(nèi)軟件缺陷預(yù)測時,HSAST 方法優(yōu)于DFS 方法。
3.5.2 針對RQ2 的結(jié)果分析
為分析HSAST 對不同深度學(xué)習(xí)模型的影響程度,采用ARNN、RNN 和CNN 深度學(xué)習(xí)模型來捕獲和提取代碼模塊中的信息。深度學(xué)習(xí)網(wǎng)絡(luò)采用同一個數(shù)據(jù)處理結(jié)果作為輸入,并轉(zhuǎn)換成相同維度的高維向量進行特征學(xué)習(xí)。
從表2 和表3 可以看出,CNN 深度學(xué)習(xí)模型在F1 指標下性能最佳,ARNN 深度學(xué)習(xí)模型在AUC 指標下性能最佳。這些結(jié)果說明了在需要綜合考慮查準率和查全率的場景下,提取節(jié)點序列局部特征的CNN 深度學(xué)習(xí)模型具有更好的性能,而相對實際應(yīng)用場景,捕獲上下文信息的ARNN 深度學(xué)習(xí)模型具有更好的性能,因為ARNN 深度學(xué)習(xí)模型具有略低于CNN 深度學(xué)習(xí)模型的F1 指標結(jié)果和略高于CNN深度學(xué)習(xí)模型的AUC 指標結(jié)果。
本文提出基于重子節(jié)點的抽象語法樹軟件缺陷預(yù)測方法,利用AST 中的語義和結(jié)構(gòu)信息,通過字典映射和詞嵌入方法將程序源代碼的AST 轉(zhuǎn)換為高維數(shù)字向量,并將結(jié)果輸入ARNN 和CNN 深度學(xué)習(xí)模型中提取代碼表征向量。實驗結(jié)果表明,該方法保留了更多代碼模塊中的結(jié)構(gòu)和語義信息,并通過深度學(xué)習(xí)模型提取關(guān)鍵特征,提高了缺陷預(yù)測性能。后續(xù)將設(shè)計基于AST 的樹形結(jié)構(gòu),拼接代碼模塊靜態(tài)度量元,進一步提高軟件缺陷預(yù)測性能。