国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

開源軟件缺陷預(yù)測(cè)方法綜述

2023-07-20 11:20常繼友榮景峰王子昱張光華伍高飛胡敬爐張玉清
關(guān)鍵詞:軟件缺陷度量漏洞

田 笑 常繼友 張 弛 榮景峰,6 王子昱 張光華 王 鶴 伍高飛,4 胡敬爐 張玉清,6,7

1 (西安電子科技大學(xué)網(wǎng)絡(luò)與信息安全學(xué)院 西安 710126)

2 (國(guó)家計(jì)算機(jī)網(wǎng)絡(luò)入侵防范中心(中國(guó)科學(xué)院大學(xué))北京 101408)

3 (河北科技大學(xué)信息科學(xué)與工程學(xué)院 石家莊 050018)

4 (廣西密碼學(xué)與信息安全重點(diǎn)實(shí)驗(yàn)室(桂林電子科技大學(xué))廣西 桂林 541000)

5 (早稻田大學(xué)情報(bào)生產(chǎn)系統(tǒng)研究科 日本 808-0135)

6 (海南大學(xué)網(wǎng)絡(luò)空間安全學(xué)院 海口 570228)

7 (中關(guān)村實(shí)驗(yàn)室 北京 100094)

軟件缺陷(software defect),也稱Bug 或Fault,是由于開發(fā)過程或者維護(hù)過程中存在的錯(cuò)誤而產(chǎn)生的導(dǎo)致計(jì)算機(jī)無(wú)法正常運(yùn)行的錯(cuò)誤或者功能性缺陷.當(dāng)在軟件測(cè)試期間發(fā)現(xiàn)缺陷時(shí),這些缺陷可能處于多種不同的狀態(tài),常見的缺陷狀態(tài)信息如表1 所示,如果缺陷沒有被及時(shí)發(fā)現(xiàn)或者修復(fù),則可能會(huì)影響軟件系統(tǒng)的功能從而造成巨大的財(cái)產(chǎn)損失甚至威脅人身安全.

Table 1 Software Defect State Description表1 軟件缺陷狀態(tài)描述

傳統(tǒng)的軟件缺陷檢測(cè)方法,包括手動(dòng)測(cè)試、自動(dòng)化分析、靜態(tài)分析、代碼審查等[1],但是由于人力資源和時(shí)間資源有限,傳統(tǒng)的缺陷發(fā)現(xiàn)技術(shù)只能檢測(cè)到較少的缺陷.基于人工智能的軟件缺陷預(yù)測(cè)技術(shù)包括機(jī)器學(xué)習(xí)和深度學(xué)習(xí),可以預(yù)測(cè)更詳細(xì)的軟件缺陷信息.軟件缺陷的檢測(cè)和預(yù)測(cè)方法對(duì)比如表2 所示,軟件缺陷預(yù)測(cè)可以在較少的時(shí)間內(nèi)發(fā)現(xiàn)更多的軟件缺陷,減少用于發(fā)現(xiàn)和修復(fù)缺陷的成本.

Table 2 Comparison of Defect Detection and Defect Prediction Methods表2 缺陷檢測(cè)與缺陷預(yù)測(cè)方法對(duì)比

軟件缺陷預(yù)測(cè)根據(jù)軟件歷史開發(fā)數(shù)據(jù)以及已發(fā)現(xiàn)的缺陷數(shù)據(jù),借助機(jī)器學(xué)習(xí)等方法來(lái)預(yù)測(cè)軟件項(xiàng)目中的缺陷數(shù)目和類型[2].軟件缺陷預(yù)測(cè)模型可以確定哪些組件具有最大的安全風(fēng)險(xiǎn),軟件工程師可以根據(jù)模型預(yù)測(cè)結(jié)果做出風(fēng)險(xiǎn)管理決策,指導(dǎo)安全檢查和測(cè)試,并確定軟件安全防御工作的優(yōu)先級(jí).

早期研究者利用源代碼度量從軟件源代碼中提取缺陷特征,靜態(tài)分析樣本中的缺陷數(shù)量,后來(lái)研究者定義與軟件缺陷強(qiáng)相關(guān)的度量,提高分類器的效率.基于軟件度量的缺陷預(yù)測(cè)模型如圖1 所示,模型首先從開源公共倉(cāng)庫(kù)或者開源社區(qū)中抽取程序模塊;然后定義與軟件缺陷強(qiáng)相關(guān)的度量元,提取對(duì)應(yīng)的度量特征從而構(gòu)造出缺陷數(shù)據(jù)集;最后通過軟件缺陷數(shù)據(jù)集訓(xùn)練軟件缺陷預(yù)測(cè)模型,軟件缺陷預(yù)測(cè)模型就能夠預(yù)測(cè)目標(biāo)程序模塊的軟件缺陷相關(guān)信息.

Fig.1 Defect prediction model based on software metrics圖1 基于軟件度量的缺陷預(yù)測(cè)模型

基于軟件度量的缺陷預(yù)測(cè)模型的缺陷預(yù)測(cè)方法較為簡(jiǎn)單,只需要手工定義與軟件缺陷相關(guān)的度量元,但是該模型無(wú)法挖掘出與缺陷相關(guān)的更深層次信息,應(yīng)用范圍比較局限,模型的優(yōu)劣取決于數(shù)據(jù)集和分類器.

隨著深度學(xué)習(xí)的發(fā)展,研究者開始從復(fù)雜的代碼中自動(dòng)獲取更深層次的特征,表征程序的語(yǔ)法語(yǔ)義信息.基于語(yǔ)法語(yǔ)義的缺陷預(yù)測(cè)模型如圖2 所示,模型首先利用文本挖掘技術(shù)對(duì)源代碼的標(biāo)識(shí)符、函數(shù)名和運(yùn)算符進(jìn)行解析并標(biāo)記,然后提取軟件缺陷相關(guān)特征并抽象表示,最后通過編碼器模型生成向量并送入神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)模型進(jìn)行訓(xùn)練.

Fig.2 Defect prediction model based on semantic and syntactic圖2 基于語(yǔ)法語(yǔ)義的缺陷預(yù)測(cè)模型

漏洞是一種特定的軟件安全缺陷,受軟件缺陷預(yù)測(cè)研究的啟發(fā)和推動(dòng),漏洞預(yù)測(cè)通過挖掘軟件實(shí)例存儲(chǔ)庫(kù)來(lái)提取和標(biāo)記代碼模塊,預(yù)測(cè)新的代碼實(shí)例是否含有漏洞,減少用于發(fā)現(xiàn)和修復(fù)漏洞的成本.與缺陷預(yù)測(cè)領(lǐng)域相同,漏洞預(yù)測(cè)研究領(lǐng)域也可以劃分為基于軟件度量的漏洞預(yù)測(cè)和基于語(yǔ)法語(yǔ)義的漏洞預(yù)測(cè)模型.基于軟件度量的漏洞預(yù)測(cè)模型使用人工設(shè)計(jì)的代碼變更、耦合和內(nèi)聚等度量,表征漏洞的相關(guān)信息[3].由于漏洞數(shù)量極少且種類繁多,這些特征不能完全理解代碼本身的含義且預(yù)測(cè)效果較差,因此該模型逐漸被舍棄.

隨著人工智能技術(shù)在各個(gè)領(lǐng)域的應(yīng)用,人工智能技術(shù)被用于缺陷預(yù)測(cè)和漏洞預(yù)測(cè)任務(wù),漏洞預(yù)測(cè)模型的效果因此得到了提升.為了能夠表征漏洞更多的信息,研究人員使用文本、抽象語(yǔ)法樹(abstract syntax tree,AST)、代碼屬性圖等多種方式提取軟件代碼中的特征,挖掘代碼的語(yǔ)法語(yǔ)義信息,轉(zhuǎn)化為向量的數(shù)字表示,隨后使用機(jī)器學(xué)習(xí)或者深度學(xué)習(xí)方法預(yù)測(cè)項(xiàng)目中的漏洞.細(xì)粒度的漏洞預(yù)測(cè)是漏洞領(lǐng)域的研究熱點(diǎn),為了提取更細(xì)粒度的特征,一些研究人員將漏洞函數(shù)表征為漏洞切片,使用注意力機(jī)制預(yù)測(cè)漏洞的位置信息.本文使用defect prediction,software defect prediction,fault prediction,vulnerability prediction 和vulnerability detection 等關(guān)鍵字進(jìn)行檢索,收集并調(diào)研了2000年至2022 年來(lái)自IEEE Xplore、ACM、Digital Library、SpringerLink、ScienceDirect 和中國(guó)知網(wǎng)(CNKI)等國(guó)內(nèi)外數(shù)據(jù)庫(kù)和軟件工程領(lǐng)域與網(wǎng)絡(luò)安全領(lǐng)域的國(guó)際期刊和頂級(jí)會(huì)議上的論文,總結(jié)了開源軟件缺陷預(yù)測(cè)已有的研究成果,并指出了該研究領(lǐng)域的未來(lái)發(fā)展趨勢(shì).缺陷預(yù)測(cè)和漏洞預(yù)測(cè)各年份統(tǒng)計(jì)的相關(guān)文獻(xiàn)數(shù)量如圖3 所示.

Fig.3 Number of literatures related to defect prediction and vulnerability prediction圖3 缺陷預(yù)測(cè)和漏洞預(yù)測(cè)相關(guān)文獻(xiàn)數(shù)量

本文的主要貢獻(xiàn)有4 個(gè)方面:

1)廣泛收集并調(diào)研了2000 年至2022 年12 月軟件缺陷預(yù)測(cè)現(xiàn)有文獻(xiàn),從數(shù)據(jù)集、評(píng)價(jià)指標(biāo)、模型構(gòu)建3 個(gè)方面分析了缺陷預(yù)測(cè)的研究現(xiàn)狀;

2)以機(jī)器學(xué)習(xí)和深度學(xué)習(xí)技術(shù)為切入點(diǎn),總結(jié)了基于軟件度量和基于語(yǔ)法語(yǔ)義2 類預(yù)測(cè)模型;

3)分析了軟件缺陷預(yù)測(cè)模型和漏洞預(yù)測(cè)模型之間的區(qū)別和聯(lián)系,探討了缺陷預(yù)測(cè)和漏洞預(yù)測(cè)之間的可移植性;

4)歸納和分析了缺陷預(yù)測(cè)技術(shù)領(lǐng)域的不足,指出了當(dāng)前面臨的機(jī)遇和挑戰(zhàn),給出了未來(lái)發(fā)展方向.

1 缺陷預(yù)測(cè)框架

軟件缺陷預(yù)測(cè)技術(shù)包括靜態(tài)缺陷預(yù)測(cè)技術(shù)與動(dòng)態(tài)缺陷預(yù)測(cè)技術(shù).靜態(tài)缺陷預(yù)測(cè)是目前主流的軟件缺陷預(yù)測(cè)技術(shù),它通過挖掘軟件歷史倉(cāng)庫(kù),手工定義與軟件缺陷相關(guān)的度量元和從源代碼本身表征程序的語(yǔ)法語(yǔ)義信息2 種方式,借助機(jī)器學(xué)習(xí)或深度學(xué)習(xí)方法提前發(fā)現(xiàn)軟件缺陷.動(dòng)態(tài)缺陷預(yù)測(cè)通過研究軟件缺陷隨時(shí)間變化的趨勢(shì),預(yù)測(cè)軟件的下一個(gè)版本或下一個(gè)生命周期中可能出現(xiàn)缺陷的數(shù)量.基于動(dòng)態(tài)軟件缺陷預(yù)測(cè)技術(shù)的核心是數(shù)學(xué)模型,包括Rayleigh分布模型[4-5]、指數(shù)分布模型[6-7]、S 曲線分布模型[8-10].對(duì)于動(dòng)態(tài)軟件缺陷預(yù)測(cè)模型來(lái)說(shuō),需要對(duì)軟件產(chǎn)品進(jìn)行長(zhǎng)時(shí)間的監(jiān)測(cè)以獲取軟件的數(shù)據(jù).然而收集大量的開發(fā)數(shù)據(jù)需要耗費(fèi)大量的成本,并且不同的數(shù)據(jù)集和動(dòng)態(tài)缺陷預(yù)測(cè)模型會(huì)導(dǎo)致預(yù)測(cè)精度不盡如人意.因此缺陷預(yù)測(cè)的大部分研究目前都集中在靜態(tài)缺陷預(yù)測(cè),后文的缺陷預(yù)測(cè)特指靜態(tài)缺陷預(yù)測(cè).

本文以機(jī)器學(xué)習(xí)和深度學(xué)習(xí)技術(shù)為切入點(diǎn),介紹了基于軟件度量和基于語(yǔ)法語(yǔ)義的2 類缺陷預(yù)測(cè)模型,這2 類缺陷預(yù)測(cè)模型框架如圖4 所示.

Fig.4 Defect prediction framework圖4 缺陷預(yù)測(cè)框架

缺陷預(yù)測(cè)框架由3 部分組成:

1)從軟件缺陷公共倉(cāng)庫(kù)和開源社區(qū)收集缺陷數(shù)據(jù);

2)定義與軟件缺陷高度相關(guān)的度量元,提取程序模塊的軟件度量特征或者使用神經(jīng)網(wǎng)絡(luò)自動(dòng)提取源代碼的語(yǔ)法語(yǔ)義特征,利用機(jī)器學(xué)習(xí)或深度學(xué)習(xí)技術(shù)構(gòu)建預(yù)測(cè)模型;

3)使用性能評(píng)價(jià)指標(biāo)對(duì)預(yù)測(cè)模型進(jìn)行評(píng)價(jià).

下文從缺陷預(yù)測(cè)框架入手,分別介紹了缺陷數(shù)據(jù)、模型的評(píng)價(jià)指標(biāo)以及缺陷預(yù)測(cè)模型的搭建.

2 缺陷數(shù)據(jù)集

軟件缺陷預(yù)測(cè)模型的構(gòu)建離不開缺陷數(shù)據(jù)集,但缺陷數(shù)據(jù)集中的維數(shù)災(zāi)難和類不平衡問題影響著軟件缺陷預(yù)測(cè)模型的質(zhì)量.本節(jié)從缺陷數(shù)據(jù)集的來(lái)源和缺陷數(shù)據(jù)預(yù)處理2 個(gè)角度對(duì)缺陷數(shù)據(jù)集進(jìn)行分析.

2.1 缺陷數(shù)據(jù)集來(lái)源

軟件缺陷數(shù)據(jù)集包含了軟件項(xiàng)目全生命周期的缺陷數(shù)據(jù)信息,常常被用于軟件缺陷預(yù)測(cè)的研究.

開源軟件缺陷數(shù)據(jù)集主要來(lái)源于軟件缺陷公共倉(cāng)庫(kù)、開源社區(qū)和大型開源軟件項(xiàng)目.國(guó)內(nèi)外研究人員使用NASA,PROMISE 等公共庫(kù)進(jìn)行了一系列研究,對(duì)軟件缺陷預(yù)測(cè)的發(fā)展做出了貢獻(xiàn),這些公共庫(kù)提供了包含了Apache,Eclipse 等真實(shí)軟件項(xiàng)目的數(shù)據(jù)集,經(jīng)過驗(yàn)證和標(biāo)注,具有較高的數(shù)據(jù)質(zhì)量,通過對(duì)這些公共倉(cāng)庫(kù)數(shù)據(jù)的分析和實(shí)驗(yàn),研究人員能夠評(píng)估不同方法在缺陷預(yù)測(cè)方面的性能和效果.隨著越來(lái)越多的開源軟件項(xiàng)目公開,一些研究者選擇使用大型開源軟件項(xiàng)目,如Nginx,Redis 和Gedit 等,評(píng)估不同的缺陷預(yù)測(cè)模型在預(yù)測(cè)軟件缺陷方面的準(zhǔn)確性和有效性.SourceForge,GitHub 等開源社區(qū)提供了與軟件相關(guān)的特征,研究人員利用源代碼、軟件描述、錯(cuò)誤修復(fù)、審查過程等開源軟件提供的信息,發(fā)現(xiàn)深層隱藏的軟件缺陷[11].

本文對(duì)2000 年至2022 年12 月的論文進(jìn)行了整理分析,軟件缺陷公共倉(cāng)庫(kù)的數(shù)據(jù)來(lái)源及其統(tǒng)計(jì)信息如表3 所示.大部分研究人員使用NASA,PROMISE和AEEEM 中的KC3,PC4,CM1,PC3,KC1 和PC1 等數(shù)據(jù)集,公共數(shù)據(jù)集的屬性如表4 所示,這些數(shù)據(jù)集發(fā)布在2005 年左右,主要使用C,C++,Java 等語(yǔ)言開發(fā).除了使用NASA,PROMISE 中的數(shù)據(jù)集外,一些研究者使用Nginx,Redis,Gedit 等大型開源軟件,在軟件缺陷預(yù)測(cè)領(lǐng)域開展一系列研究,開源軟件項(xiàng)目缺陷數(shù)量統(tǒng)計(jì)如表5 所示,文獻(xiàn)[12]使用了2 個(gè)連續(xù)版本的6 個(gè)開源軟件項(xiàng)目Camel,F(xiàn)lume,Tika,Gedit,Nginx,Redis,研究軟件模塊在文件級(jí)別的缺陷.文獻(xiàn)[13]使用了多個(gè)版本的4 個(gè)開源軟件項(xiàng)目Gedit,Nagios Core,Nginx,Redis,這些項(xiàng)目主要使用C/C++語(yǔ)言開發(fā),文獻(xiàn)[13]的作者從缺陷修復(fù)報(bào)告中收集到了這些項(xiàng)目的缺陷信息.此外,文獻(xiàn)[14]探究6 個(gè)項(xiàng)目在開源軟件項(xiàng)目的不同版本中的代碼變更,并分析了這些變更對(duì)產(chǎn)生缺陷的可能性,開源軟件代碼變更對(duì)缺陷的影響如表6 所示.

Table 3 Public Warehouse Data Sources for Software Defect Modeling表3 軟件缺陷模型的公共倉(cāng)庫(kù)數(shù)據(jù)來(lái)源

Table 4 Attributes List of the Publicly Available Datasets表4 公共數(shù)據(jù)集屬性列表

Table 6 Impact of Code Changes on Defects in Open-Source Software Projects表6 開源軟件項(xiàng)目代碼變更對(duì)缺陷的影響

經(jīng)過調(diào)查發(fā)現(xiàn),NASA,PROMISE 等軟件缺陷公共倉(cāng)庫(kù)的數(shù)據(jù)集由LOC[15],Halstead[16]等度量元的屬性和包含缺陷的類標(biāo)記組成.大部分研究者使用NASA,PROMISE 等軟件缺陷公共倉(cāng)庫(kù)的數(shù)據(jù)集進(jìn)行模型的比較和重現(xiàn),一些研究者使用Nginx,Redis,Gedit 等真實(shí)世界的開源軟件,在軟件缺陷預(yù)測(cè)領(lǐng)域開展一系列研究.這些公開數(shù)據(jù)集往往具有類不平衡、維度過高、預(yù)測(cè)特征不足以及分類標(biāo)簽不足等缺點(diǎn)[17].數(shù)據(jù)集中維數(shù)災(zāi)難和類不平衡的問題可以通過特征選擇[18]、降維[19-29]等方法進(jìn)行處理,但是特征不足和分類標(biāo)簽不足的問題則需要通過定義更細(xì)粒度的軟件缺陷度量元來(lái)解決.

2.2 缺陷數(shù)據(jù)預(yù)處理

缺陷數(shù)據(jù)集中類不平衡[23-36]、維度過高[37-43]、特征不足[44-45]以及分類標(biāo)簽不足[46-50]等問題會(huì)降低軟件缺陷預(yù)測(cè)模型的性能,在使用缺陷數(shù)據(jù)時(shí)對(duì)其進(jìn)行預(yù)處理,可以提高缺陷預(yù)測(cè)模型的質(zhì)量,部分缺陷數(shù)據(jù)預(yù)處理的方法如表7 所示.

2.2.1 類不平衡

程序模塊中80%的缺陷集中在20%的文件中,缺陷的數(shù)量遠(yuǎn)少于非缺陷的數(shù)量,缺陷數(shù)量的不平衡分布會(huì)導(dǎo)致模型的預(yù)測(cè)性能受到嚴(yán)重影響.

20 世紀(jì)90 年代,研究人員從數(shù)據(jù)層面解決類不平衡問題,包括隨機(jī)欠采樣(random under sampling,RUS)[20]、隨機(jī)過采樣(random over sampling,ROS)[21-22],這些算法簡(jiǎn)單高效,但是效果取決于模型的訓(xùn)練算法.文獻(xiàn)[23]針對(duì)ADASYN[24]自適應(yīng)過采樣算法造成的噪聲問題和CURE-SMOTE[25]層過采樣算法分類準(zhǔn)確性問題,提出了一種AJCC-Ram 多層次過采樣算法,使用ADASYN 改進(jìn)算法進(jìn)行邊緣采樣,CURESMOTE 算法進(jìn)行中心區(qū)采樣,分層次進(jìn)行樣本生成,采用最近列表噪聲識(shí)別(closest list noise identification,CLNI[26])方法對(duì)噪聲進(jìn)行過濾.

文獻(xiàn)[27]使用鄰居清理學(xué)習(xí)(neighbor cleaning learning,NCL)去除不平衡數(shù)據(jù)集中的重疊樣本,使用集成隨機(jī)欠采樣并重復(fù)多次,解決了缺陷數(shù)據(jù)集偏態(tài)分布的問題.結(jié)果表明,與CLNI、基于聚類的噪聲檢測(cè)(clustering-based noise detection,CBND)[28]兩種數(shù)據(jù)清洗算法相比,NCL 在G-mean 和AUC 評(píng)價(jià)指標(biāo)上表現(xiàn)更優(yōu).

文獻(xiàn)[29]提出一種新的基于鄰域的欠采樣(neighbourhood based under-sampling,N-US)算法來(lái)處理類不平衡問題.N-US 首先識(shí)別缺陷實(shí)例的鄰域,計(jì)算出鄰域中的干凈實(shí)例,并從有缺陷的實(shí)例的鄰域中最近的位置消除干凈實(shí)例.結(jié)果表明,與RUS 等基線方法相比,N-US 能夠避免過度消除數(shù)據(jù)帶來(lái)的負(fù)面影響,有效地提高了分類器的性能.

算法級(jí)方法通過直接修改訓(xùn)練機(jī)制解決類不平衡問題,算法級(jí)方法包括代價(jià)敏感學(xué)習(xí)方法、集成學(xué)習(xí)方法等.代價(jià)敏感學(xué)習(xí)不是通過不同的采樣策略創(chuàng)建平衡的數(shù)據(jù)分布,而是通過使用不同的代價(jià)矩陣來(lái)解決類不平衡問題,這些代價(jià)矩陣表示對(duì)特定數(shù)據(jù)實(shí)例進(jìn)行錯(cuò)誤分類的成本.文獻(xiàn)[30]提出了一種代價(jià)敏感轉(zhuǎn)移核典型相關(guān)分析(cost-sensitive transfer kernel canonical correlation analysis,CTKCCA)方法,利用代價(jià)敏感技術(shù),在遷移學(xué)習(xí)階段使用轉(zhuǎn)移核典型相關(guān)分析方法,分離有缺陷和無(wú)缺陷的實(shí)例.結(jié)果表明,該方法在PD,PF,AUC 等指標(biāo)上均優(yōu)于轉(zhuǎn)移成分分析 (transfer component analysis,TCA)等基線方法.

對(duì)于機(jī)器學(xué)習(xí)來(lái)說(shuō),單個(gè)模型存在過擬合和缺乏泛化能力等缺點(diǎn),集成學(xué)習(xí)通過組合多個(gè)分類器來(lái)處理類不平衡.常用的集成學(xué)習(xí)方法包括Boosting,Bagging,Stacking,Voting 以及隨機(jī)子空間方法(random subspace method,RSM)等.文獻(xiàn)[31]使用隨機(jī)森林(random forest,RF)、人工神經(jīng)網(wǎng)絡(luò)、K 最近鄰作為模型的主要學(xué)習(xí)者,邏輯回歸(logistic regression,LR)作為模型的次要學(xué)習(xí)者,從多個(gè)Stacking 模型中選擇了性能最好的模型.文獻(xiàn)[32]提出一種基于隨機(jī)近似約簡(jiǎn)(random approximation reduction,RAR)的集成學(xué)習(xí)算法ERAR,該算法使用RAR 擾動(dòng)屬性空間,以刪除冗余和不相關(guān)的屬性,采用重采樣技術(shù)擾動(dòng)實(shí)例空間.為了解決學(xué)習(xí)器中數(shù)據(jù)集不平衡問題,ERARSMOTE 在ERAR 中加入了方法SMOTE,對(duì)不平衡的缺陷數(shù)據(jù)進(jìn)行預(yù)處理.結(jié)果表明,ERAR-SMOTE 在F1-Score,MCC,Recall 等指標(biāo)上優(yōu)于RSM,Bagging 等基線方法.

近年來(lái),研究人員使用深度學(xué)習(xí)解決缺陷預(yù)測(cè)中的類不平衡問題.文獻(xiàn)[33]將嵌入最近鄰(stratification embedded in nearest neighbor,STr-NN)的分層思想引入了神經(jīng)網(wǎng)絡(luò),在標(biāo)記的訓(xùn)練數(shù)據(jù)集上訓(xùn)練集成學(xué)習(xí)分類器,用來(lái)搜索目標(biāo)數(shù)據(jù)的偽標(biāo)簽,基于偽標(biāo)簽確定訓(xùn)練數(shù)據(jù)集中缺陷的數(shù)量.文獻(xiàn)[33]的作者使用最近鄰(NN)平衡訓(xùn)練數(shù)據(jù)集,解決項(xiàng)目?jī)?nèi)缺陷預(yù)測(cè)(within-project defect prediction, WPDP)中的類不平衡問題.對(duì)于跨項(xiàng)目缺陷預(yù)測(cè)(cross-project defect prediction, CPDP)的類不平衡問題,在STr-NN 的基礎(chǔ)上,引入TCA 緩解源數(shù)據(jù)和目標(biāo)數(shù)據(jù)之間的特征不一致問題.結(jié)果表明,與TCA,TCA+SMOTE 相比,TCA+STr-NN 具有更高的AUC 和Recall.

文獻(xiàn)[34]提出了一種基于雙向生成對(duì)抗網(wǎng)絡(luò)的軟件缺陷預(yù)測(cè)模型(ADGAN-SDP),從異常檢測(cè)的角度解決類不平衡問題.該模型使用雙向生成對(duì)抗網(wǎng)絡(luò)(bidirectional generative adversarial network,BiGAN)對(duì)無(wú)缺陷樣本進(jìn)行建模,并將無(wú)缺陷樣本的損失值與預(yù)定義的閾值進(jìn)行比較,從而預(yù)測(cè)當(dāng)前樣本是否含有缺陷.結(jié)果表明,該方法在AUC,G-mean,F(xiàn)1 等指標(biāo)上優(yōu)于代價(jià)敏感、過采樣、欠采樣、集成學(xué)習(xí)等方法.

混合方法將數(shù)據(jù)級(jí)技術(shù)、算法級(jí)技術(shù)與集成方法結(jié)合,用來(lái)處理類不平衡問題.文獻(xiàn)[35]分別使用采樣、代價(jià)敏感、集成及混合形式構(gòu)建軟件缺陷預(yù)測(cè)模型.結(jié)果表明,相比較于采樣和代價(jià)敏感學(xué)習(xí),集成學(xué)習(xí)實(shí)現(xiàn)了更好的預(yù)測(cè)結(jié)果.

傳統(tǒng)的Stacking 方法在處理類不平衡問題時(shí)沒有考慮代價(jià)成本問題.文獻(xiàn)[36]提出一種CSSG 方法,將Stacking 方法與代價(jià)敏感學(xué)習(xí)結(jié)合.結(jié)果表明,該方法能夠很好地解決項(xiàng)目?jī)?nèi)缺陷預(yù)測(cè)中類不平衡問題.

討論1:不平衡的數(shù)據(jù)集中可能存在類重疊問題,主要表現(xiàn)在少數(shù)有缺陷的訓(xùn)練樣本與大多數(shù)無(wú)缺陷的訓(xùn)練樣本實(shí)例重疊,增加了分類器學(xué)習(xí)缺陷特征的難度.使用NCL,CLNI,CBDN 等方法可以去除不平衡數(shù)據(jù)集中的重疊樣本,提高缺陷預(yù)測(cè)的能力.

2.2.2 高維度數(shù)據(jù)

數(shù)據(jù)集中的冗余和無(wú)關(guān)特征會(huì)降低模型的預(yù)測(cè)性能,通過對(duì)高維度數(shù)據(jù)進(jìn)行處理,能夠縮短模型的訓(xùn)練時(shí)間并提高模型的預(yù)測(cè)性能,特征選擇方法可以從高維度特征中選擇與缺陷高度相關(guān)的特征從而實(shí)現(xiàn)特征降維.20 世紀(jì)90 年代后期,研究人員使用包裝器[37]和過濾器[38]從高維度特征中選擇與缺陷高度相關(guān)的特征.基于過濾器的方法使用獨(dú)立的學(xué)習(xí)算法評(píng)估數(shù)據(jù)集的特征,復(fù)雜度較低且不能保證學(xué)習(xí)算法的準(zhǔn)確性.基于包裝器的特征選擇方法使用預(yù)定的學(xué)習(xí)算法評(píng)估數(shù)據(jù)集特征的優(yōu)劣,特征選擇獨(dú)立性較高,但是基于包裝器的特征選擇方法用于子集搜索評(píng)估和選擇的數(shù)量未知,存在分類器過擬合等問題.

文獻(xiàn)[39]改進(jìn)了基于包裝器的特征選擇方法,設(shè)計(jì)了一種EWFS 模型用來(lái)動(dòng)態(tài)選擇特征.該模型首先使用熵度量對(duì)數(shù)據(jù)集中的特征進(jìn)行排序,然后通過增量包裝方法傳遞排序的特征,最后使用條件互信息最大化(conditional mutual information maximization,CMIM)選擇所需特征.結(jié)果表明,這種動(dòng)態(tài)特征選擇方法優(yōu)于現(xiàn)有的元啟發(fā)式方法和基于順序搜索的包裝法.

混合特征選擇方法是基于過濾器和包裝器的方法.文獻(xiàn)[40]提出一種混合特征選擇方法,通過比較方案與理想解之間的相似度來(lái)進(jìn)行排序的方法(technique for order preference by similarity to ideal solution,TOPSIS)為5 種過濾方法計(jì)算分?jǐn)?shù),決策矩陣生成排序后的候選特征;使用基于Rao 的優(yōu)化的包裝器算法尋找最優(yōu)的候選特征.結(jié)果表明,該方法優(yōu)于GA[41]等特征選擇方法.

文獻(xiàn)[42]將代價(jià)矩陣結(jié)合到傳統(tǒng)的特征選擇方法,在特征選擇階段強(qiáng)調(diào)代價(jià)較高的樣本,以解決特征選擇階段的類不平衡問題.結(jié)果表明,基于代價(jià)敏感的特征選擇方法在降低成本和解決不平衡問題上優(yōu)于傳統(tǒng)的特征選擇方法.

文獻(xiàn)[43]提出了FECAR 特征選擇框架,在特征聚類階段,使用k-medoids 聚類算法將特征劃分為k個(gè)聚類,并根據(jù)FC-Relevance 度量從每個(gè)聚類中選擇相關(guān)的特征.結(jié)果表明,該方法可以有效地識(shí)別并剔除冗余和不相關(guān)特征.

討論2:特征選擇方法是解決高維度數(shù)據(jù)的一種有效方法,在保證數(shù)據(jù)質(zhì)量的同時(shí)選擇突出特征.基于包裝器和過濾器的特征選擇是2 種傳統(tǒng)的特征選擇方法,雖然基于包裝器的特征選擇方法優(yōu)于基于過濾器的特征選擇方法,但是基于包裝器的特征選擇方法仍存在著搜索特征子集高時(shí)間復(fù)雜度等問題,未來(lái)應(yīng)在減少其時(shí)間成本的同時(shí),維持該方法的性能.

2.2.3 數(shù)據(jù)差異

構(gòu)建性能優(yōu)越的軟件缺陷預(yù)測(cè)模型需要足夠多的歷史標(biāo)注數(shù)據(jù),但是現(xiàn)實(shí)中標(biāo)注足夠多的訓(xùn)練數(shù)據(jù)相當(dāng)困難,數(shù)據(jù)差異問題普遍存在于跨項(xiàng)目缺陷預(yù)測(cè)、跨版本缺陷預(yù)測(cè)中(cross-version defect prediction,CVDP).

跨項(xiàng)目缺陷預(yù)測(cè)使用其他項(xiàng)目的缺陷數(shù)據(jù)來(lái)預(yù)測(cè)當(dāng)前項(xiàng)目是否含有缺陷.但不同項(xiàng)目的數(shù)據(jù)分布存在著差異,很難將通過源項(xiàng)目缺陷數(shù)據(jù)集訓(xùn)練的軟件缺陷預(yù)測(cè)模型泛化到新的目標(biāo)項(xiàng)目中.

文獻(xiàn)[44]提出TCA+方法,將TCA 與數(shù)據(jù)歸一化方法結(jié)合,但該方法性能不穩(wěn)定.隨后,文獻(xiàn)[45]提出了FeSCH 方法,選擇合適的特征緩解源項(xiàng)目和目標(biāo)項(xiàng)目數(shù)據(jù)之間的分布差距,在特征聚類階段使用DPC 基于密度的聚類方法將原始特征劃分為多個(gè)簇,在特征選擇階段設(shè)計(jì)了特征的局部密度(local density of features,LDF)、特征分布的相似性(similarity of feature distribution,SFD)、特征的類相關(guān)性(feature-class relevance,F(xiàn)CR)這3 種策略將每個(gè)簇中的特征進(jìn)行排序.結(jié)果表明,F(xiàn)eSCH 相比于TCA+等基線方法在AUC 指標(biāo)表現(xiàn)更優(yōu).

但是文獻(xiàn)[44-45]所提方法沒有考慮到源數(shù)據(jù)中的類標(biāo)簽信息,文獻(xiàn)[46]提出一種域適應(yīng)方法LSKDSA,在子空間對(duì)齊(subspace alignment,SA)方法的基礎(chǔ)上,使用源數(shù)據(jù)的可用類別標(biāo)簽,并且在域適應(yīng)學(xué)習(xí)的過程中加入了判別信息,以減少源數(shù)據(jù)和目標(biāo)數(shù)據(jù)分布之間的差異.結(jié)果表明,該方法在Fmeasure 和AUC 等指標(biāo)上優(yōu)于TCA+等基線方法.

由于開發(fā)環(huán)境等因素的影響,各個(gè)項(xiàng)目的度量值會(huì)存在較大差異,導(dǎo)致跨項(xiàng)目缺陷預(yù)測(cè)的精度較低.文獻(xiàn)[47]提出了一種基于特征選擇和遷移學(xué)習(xí)的度量補(bǔ)償軟件缺陷預(yù)測(cè)方法,首先使用Pearson 計(jì)算特征和缺陷類別之間的相關(guān)系數(shù),使用相關(guān)系數(shù)選擇訓(xùn)練時(shí)的特征子集;接著使用TCA 將源項(xiàng)目和目標(biāo)項(xiàng)目的共同特征映射到潛在空間中;隨后,使用度量補(bǔ)償方法為原始度量值分配權(quán)重,以提高目標(biāo)項(xiàng)目之間的相似性.結(jié)果表明,該方法在AUC 和Fmeasure 這2 個(gè)指標(biāo)上優(yōu)于傳統(tǒng)的度量補(bǔ)償技術(shù).

跨版本缺陷預(yù)測(cè)同一項(xiàng)目、不同版本得到的數(shù)據(jù)分布存在著差異,這種差異對(duì)跨版本缺陷預(yù)測(cè)模型的預(yù)測(cè)性能造成影響.

軟件的演進(jìn)會(huì)導(dǎo)致開發(fā)者在原先有缺陷的基礎(chǔ)上引入新的缺陷,文獻(xiàn)[48]考慮了連續(xù)版本之間缺陷分布的變化,提出一種主動(dòng)學(xué)習(xí)方法.但該方法依賴于先前版本的標(biāo)記模塊,忽略了當(dāng)前版本未標(biāo)記模塊的信息,文獻(xiàn)[49]在此基礎(chǔ)上,提出了一種混合主動(dòng)學(xué)習(xí)(hybrid active learning,HAL),從當(dāng)前模塊中選擇最具有價(jià)值的未標(biāo)記模塊,并與先前版本的標(biāo)記模塊組合,共同構(gòu)建混合訓(xùn)練集.HAL 模型使用基于核方法的主成分分析(kernel principal component analysis,KPCA)方法,將混合訓(xùn)練模塊的數(shù)據(jù)和剩余維標(biāo)記模塊的數(shù)據(jù)映射到高維特征空間.

但是文獻(xiàn)[48-49]所述方法忽略了先前版本中數(shù)據(jù)分布差異的問題,文獻(xiàn)[50]提出了一種帶有數(shù)據(jù)選擇的跨版本缺陷預(yù)測(cè)模型CDS,該模型為噪聲較少的歷史版本以及數(shù)據(jù)集內(nèi)部與測(cè)試集相似的文件分配更高的權(quán)重.通過對(duì)比發(fā)現(xiàn),CDS 在Fmeasure 和G-mean 指標(biāo)上優(yōu)于其他的基線模型.

討論3:對(duì)于性能優(yōu)越的軟件缺陷預(yù)測(cè)模型來(lái)說(shuō),大量的訓(xùn)練數(shù)據(jù)必不可少,但是跨項(xiàng)目缺陷預(yù)測(cè)、跨版本缺陷預(yù)測(cè)中的數(shù)據(jù)差異問題影響了軟件缺陷預(yù)測(cè)模型的性能,未來(lái)研究人員的研究應(yīng)著重構(gòu)建高質(zhì)量、平衡且無(wú)噪音的數(shù)據(jù)集,改善軟件缺陷預(yù)測(cè)模型的性能.

3 評(píng)價(jià)指標(biāo)

本節(jié)首先統(tǒng)計(jì)了目前軟件缺陷預(yù)測(cè)研究的評(píng)價(jià)指標(biāo),分析了研究者最常用的評(píng)價(jià)指標(biāo),各項(xiàng)常用評(píng)價(jià)指標(biāo)的具體描述如表8 所示.

Table 8 Common Evaluation Indicators and Their Descriptions表8 常用評(píng)價(jià)指標(biāo)及其描述

本文的預(yù)測(cè)指標(biāo)的研究數(shù)量占比如圖5 所示,可以發(fā)現(xiàn),Recall,Precision,AUC,F(xiàn)-measure 是最常用的評(píng)價(jià)性能指標(biāo).經(jīng)調(diào)查發(fā)現(xiàn),研究人員對(duì)于模型的評(píng)價(jià)指標(biāo)也有爭(zhēng)議:文獻(xiàn)[51]認(rèn)為一個(gè)好的軟件缺陷預(yù)測(cè)模型應(yīng)該同時(shí)實(shí)現(xiàn)高召回率和高準(zhǔn)確率;文獻(xiàn)[52]對(duì)F-measure 和Precision 進(jìn)行了批判,該文作者認(rèn)為不是所有好的預(yù)測(cè)模型都需要高召回率和高準(zhǔn)確率;文獻(xiàn)[53]發(fā)現(xiàn)使用MCC,而不是使用F1-Score 作為軟件缺陷預(yù)測(cè)的評(píng)價(jià)指標(biāo),超過1/5 的模型對(duì)比結(jié)果會(huì)發(fā)生改變.

Fig.5 Summary of evaluation indicators圖5 評(píng)估指標(biāo)統(tǒng)計(jì)

軟件缺陷預(yù)測(cè)研究的評(píng)價(jià)指標(biāo)調(diào)查結(jié)果表明,不同模型在不同評(píng)價(jià)指標(biāo)上的表現(xiàn)不同,研究者不應(yīng)局限于單個(gè)指標(biāo)評(píng)估不同模型的優(yōu)劣,應(yīng)結(jié)合多種評(píng)價(jià)指標(biāo),針對(duì)不同的模型采用多樣性的評(píng)價(jià)指標(biāo)進(jìn)行評(píng)估.

4 缺陷預(yù)測(cè)模型

4.1 基于軟件度量的缺陷預(yù)測(cè)

軟件度量是在軟件開發(fā)過程對(duì)軟件進(jìn)行數(shù)據(jù)收集、定義和分析的一個(gè)持續(xù)性定量化過程,描述軟件產(chǎn)品或者開發(fā)過程的指標(biāo)或者參數(shù),以保證高效率、低成本和高質(zhì)量的軟件開發(fā)過程[54].度量元是最細(xì)粒度的軟件度量屬性,用于描述特定的度量特征,度量元主要分為代碼度量元和過程度量元.不同的度量元對(duì)軟件缺陷預(yù)測(cè)模型的影響不同,為了提高軟件缺陷預(yù)測(cè)模型的性能,一些研究者使用混合度量元搭建軟件缺陷預(yù)測(cè)模型.

基于軟件度量的缺陷預(yù)測(cè)模型如圖1 所示,模型首先從開源公共倉(cāng)庫(kù)或者開源社區(qū)中抽取程序模塊,然后定義與軟件缺陷強(qiáng)相關(guān)的度量元并提取對(duì)應(yīng)的度量特征從而構(gòu)造出缺陷數(shù)據(jù)集,最后通過軟件缺陷數(shù)據(jù)集訓(xùn)練軟件缺陷預(yù)測(cè)模型,軟件缺陷預(yù)測(cè)模型就能夠預(yù)測(cè)目標(biāo)程序模塊的軟件缺陷相關(guān)信息.

如圖6 所示,早在20 世紀(jì)70 年代,傳統(tǒng)的代碼度量基于代碼行(lines of code,LOC)[15],隨后研究人員發(fā)現(xiàn)軟件缺陷不僅取決于軟件規(guī)模,還取決于軟件復(fù)雜度,于是提出了Halstead 度量[16]、McCabe 度量[55].20 世紀(jì)90 年代,隨著面向?qū)ο蠹夹g(shù)的發(fā)展,一些研究者開始關(guān)注模塊的內(nèi)聚性、耦合度等特征,所以使用面向?qū)ο蠖攘吭饬寇浖?guī)模和復(fù)雜度.1994年,Chidamber 和Kemerer 基于面向?qū)ο蟪绦虻睦^承、耦合、內(nèi)聚特征給出了6 個(gè)類級(jí)別的CK 度量標(biāo)準(zhǔn)[56].文獻(xiàn)[57]提出了MOOD 度量,包含6 個(gè)度量標(biāo)準(zhǔn).2002年,文獻(xiàn)[58]提出了一套QMOOD 度量,在系統(tǒng)和類的層次上評(píng)估軟件設(shè)計(jì).2021 年,文獻(xiàn)[59]第一次將代碼氣味作為跨項(xiàng)目缺陷預(yù)測(cè)的特征,使用RF、支持向量機(jī)(support vector machine,SVM)、多層感知機(jī)(multilayer perceptron,MLP)、決策樹(decision tree,DT)、樸素貝葉斯(naive Bayes,NB)構(gòu)建軟件缺陷預(yù)測(cè)模型.結(jié)果表明,基于代碼氣味訓(xùn)練的跨項(xiàng)目缺陷預(yù)測(cè)模型的性能相較于基于代碼度量的缺陷預(yù)測(cè)模型提高了6.5%,且基于代碼氣味訓(xùn)練的缺陷預(yù)測(cè)模型的表現(xiàn)效果優(yōu)于代碼氣味和代碼度量等混合度量指標(biāo)訓(xùn)練的缺陷預(yù)測(cè)模型.

Fig.6 Timeline of metrics development圖6 度量元發(fā)展時(shí)間線

研究人員發(fā)現(xiàn)軟件缺陷不僅與軟件規(guī)模有關(guān),還與軟件開發(fā)過程的各階段有關(guān),因此提出了一系列的過程度量.代碼變更可以度量代碼在不同版本之間的增加、刪除或者修改量,它很容易從版本控制系統(tǒng)自動(dòng)記錄的系統(tǒng)更改歷史中提取.20 世紀(jì)90 年代,文獻(xiàn)[60]使用代碼變更作為軟件質(zhì)量的衡量標(biāo)準(zhǔn).隨后,文獻(xiàn)[61]提出了8 種相對(duì)代碼變更指標(biāo),預(yù)測(cè)軟件缺陷密度.文獻(xiàn)[62]使用了LR,NB,DT 這3 種分類模型,發(fā)現(xiàn)對(duì)于Eclipse 數(shù)據(jù),代碼變更指標(biāo)比代碼度量能更好地預(yù)測(cè)缺陷.

代碼度量和過程度量并不能很好地描述軟件模塊如何隨項(xiàng)目演變而變化,而演化度量[63-65]是一種專門針對(duì)項(xiàng)目演變過程的度量元.文獻(xiàn)[64]使用類的年齡、類出現(xiàn)缺陷的可能性、類連續(xù)且不含有缺陷的周期來(lái)刻畫軟件演化過程中類的演化模式,研究結(jié)果發(fā)現(xiàn),與代碼度量和代碼變更相比,演化度量元能更好地預(yù)測(cè)軟件缺陷.文獻(xiàn)[65]將多個(gè)連續(xù)版本的文件度量按版本升序連接在一起,利用循環(huán)神經(jīng)網(wǎng)絡(luò),提供了一個(gè)新的視角來(lái)解釋文件如何隨項(xiàng)目的發(fā)展而變化的趨勢(shì).

軟件缺陷的產(chǎn)生與開發(fā)人員密切相關(guān),早期研究人員僅僅將修改模塊的開發(fā)人員數(shù)作為缺陷預(yù)測(cè)的度量元,但是后續(xù)研究發(fā)現(xiàn)軟件缺陷與開發(fā)人員的數(shù)量無(wú)關(guān)[66-68].隨后,一些研究人員從社交網(wǎng)絡(luò)[12-13,69]分析開發(fā)人員的經(jīng)驗(yàn),從程序模塊的所有權(quán)等角度分析開發(fā)人員與缺陷之間的關(guān)系.文獻(xiàn)[69]使用網(wǎng)絡(luò)中心度來(lái)衡量開發(fā)人員貢獻(xiàn)的碎片化程度,開發(fā)人員的數(shù)量越多,代碼修改的次數(shù)也相應(yīng)增多,導(dǎo)致軟件含有的缺陷數(shù)量也越多,研究結(jié)果表明中心模塊比網(wǎng)絡(luò)周圍的模塊更容易產(chǎn)生軟件缺陷.

隨著全球軟件開發(fā)的出現(xiàn),研究人員發(fā)現(xiàn)組織結(jié)構(gòu)[70-71]也影響著軟件的質(zhì)量.文獻(xiàn)[71]提出了8 項(xiàng)量化組織復(fù)雜性的度量用于研究組織結(jié)構(gòu)與軟件質(zhì)量之間的關(guān)系,實(shí)驗(yàn)結(jié)果表明,組織指標(biāo)比傳統(tǒng)代碼變更、代碼復(fù)雜性、代碼依賴等指標(biāo)的預(yù)測(cè)效果更佳.2005—2010 年,軟件缺陷預(yù)測(cè)結(jié)合各種度量元,使用各種機(jī)器學(xué)習(xí)算法提高模型的準(zhǔn)確性和性能.NB[72]、貝葉斯網(wǎng)絡(luò)(Bayesian network,BN)[73]、K-means[74-75]、AdaBoost[76]、DT[76]、LR[72-73,76]等方法在此期間展現(xiàn)了較好的性能.2010 年后,相比于傳統(tǒng)的機(jī)器學(xué)習(xí)方法,一些新的機(jī)器學(xué)習(xí)[14,50,77-79]方法提高了軟件缺陷預(yù)測(cè)的性能.現(xiàn)有的跨版本缺陷預(yù)測(cè)模型通常只使用一個(gè)先前版本收集的數(shù)據(jù)進(jìn)行模型訓(xùn)練,并沒有考慮在具有多個(gè)先前版本的跨版本缺陷預(yù)測(cè)場(chǎng)景中數(shù)據(jù)分布差異方差和類重疊問題.文獻(xiàn)[14]提出了一種基于樸素貝葉斯的改進(jìn)轉(zhuǎn)移樸素貝葉斯,結(jié)果表明該模型在項(xiàng)目?jī)?nèi)缺陷預(yù)測(cè)和跨項(xiàng)目缺陷預(yù)測(cè)中的準(zhǔn)確率、精度、PD 都優(yōu)于轉(zhuǎn)移樸素貝葉斯模型.文獻(xiàn)[50]提出了一種新穎的基于聚類的多版本分類器CMVC,為每個(gè)先前版本分配適當(dāng)?shù)臋?quán)重,并通過最小化目標(biāo)函數(shù)來(lái)獲得現(xiàn)有文件的預(yù)測(cè)標(biāo)簽,結(jié)果表明該方法優(yōu)于RF,LR,NB 等模型.

隨著深度學(xué)習(xí)的應(yīng)用,一些研究人員提出了基于深度學(xué)習(xí)[65,80-81]的缺陷預(yù)測(cè)模型.文獻(xiàn)[80]探索了Siamese 網(wǎng)絡(luò)的優(yōu)勢(shì),提出了一種新的軟件缺陷預(yù)測(cè)模型SDNN.與以往的方法相比,SDNN 使用2 個(gè)完全相同的全連通網(wǎng)絡(luò)學(xué)習(xí)最高相似度特征,并使用計(jì)量函數(shù)作為最高相似度特征之間的距離度量.結(jié)果表明,在F-measure 方面,SDNN 方法優(yōu)于深度神經(jīng)網(wǎng)絡(luò)(deep neural network,DNN)、長(zhǎng)短期記憶網(wǎng)絡(luò)(long short-term memory,LSTM)、深度信念網(wǎng)絡(luò)(deep belief network ,DBN)、NB 和LR 這5 種方法.

文獻(xiàn)[81]提出了一種Defect-Learner 模型,從代碼自然性的角度,將交叉熵作為一種新的軟件度量方法引入到文件級(jí)缺陷預(yù)測(cè).Defect-Learner 模型在學(xué)習(xí)階段,構(gòu)建了一個(gè)多層的LSTM 網(wǎng)絡(luò),從輸入的標(biāo)記向量中學(xué)習(xí)隱含的語(yǔ)義特征.在預(yù)測(cè)階段,將交叉熵度量與其他度量特征結(jié)合,用來(lái)預(yù)測(cè)目標(biāo)項(xiàng)目中的缺陷.結(jié)果表明,使用結(jié)合交叉熵的CK,QMOOD等度量,能夠改進(jìn)軟件缺陷預(yù)測(cè)的性能.

討論4:本節(jié)按時(shí)間順序歸納了代碼度量和過程度量,圖6 展示了度量元發(fā)展歷程,度量元的演變過程及其對(duì)比結(jié)果如表9 所示.從分析來(lái)看,軟件的演化是一個(gè)動(dòng)態(tài)的連續(xù)過程,新增模塊或者修復(fù)歷史缺陷都會(huì)產(chǎn)生新的缺陷,未來(lái)研究應(yīng)該關(guān)注演化度量元,提高軟件缺陷預(yù)測(cè)的性能.

Table 9 Comparison of Metric Evolution表9 度量元的演進(jìn)對(duì)比

觀點(diǎn)1:目前大多數(shù)研究者是手工定義與軟件缺陷相關(guān)的度量元,忽略了軟件缺陷在軟件生命周期中的產(chǎn)生方式,未來(lái)如何從存儲(chǔ)庫(kù)中自動(dòng)提取與缺陷相關(guān)的度量元仍是研究的熱點(diǎn).

4.2 基于語(yǔ)法語(yǔ)義的缺陷預(yù)測(cè)

基于語(yǔ)法語(yǔ)義的缺陷預(yù)測(cè)模型如圖2 所示,模型首先通過AST 等技術(shù)對(duì)源代碼進(jìn)行解析從而提取語(yǔ)法語(yǔ)義特征信息,然后通過軟件缺陷相關(guān)的詞嵌入方法將語(yǔ)法語(yǔ)義特征編碼為向量,最后將生成的向量數(shù)據(jù)集送入神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練得到缺陷預(yù)測(cè)模型.

2015 年開始,深度學(xué)習(xí)、人工神經(jīng)網(wǎng)絡(luò)在軟件缺陷預(yù)測(cè)中得到廣泛應(yīng)用.與傳統(tǒng)的軟件度量不同,研究者使用卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,CNN)、循環(huán)神經(jīng)網(wǎng)絡(luò)(recurrent neural network,RNN)、MLP、DBN、LSTM 和門控循環(huán)神經(jīng)網(wǎng)絡(luò)(gated recurrent unit,GRU)等深度學(xué)習(xí)算法,通過AST 等方式生成的標(biāo)記向量提取特征,從而挖掘軟件程序中隱藏的語(yǔ)義和結(jié)構(gòu)特征,并將生成的特征數(shù)據(jù)反饋到神經(jīng)網(wǎng)絡(luò)中,訓(xùn)練獲得缺陷預(yù)測(cè)模型.文獻(xiàn)[82]提出了一種用于即時(shí)缺陷預(yù)測(cè)的深度學(xué)習(xí)方法,利用DBN在一組初始變化特征中提取了表達(dá)特征,在選定的特征上構(gòu)建了缺陷預(yù)測(cè)模型.但具有不同語(yǔ)義的程序文件可能具有相同的傳統(tǒng)特征,該方法無(wú)法區(qū)分不同語(yǔ)義的代碼區(qū)域.

鑒于此,文獻(xiàn)[83]采用編輯距離相似度計(jì)算算法和CLNI 剔除可能存在錯(cuò)誤標(biāo)簽的數(shù)據(jù),并通過AST 分析程序源代碼獲取語(yǔ)法信息,最后將語(yǔ)法信息轉(zhuǎn)換為特征向量并輸入到DBN 網(wǎng)絡(luò)中從而建立預(yù)測(cè)模型.結(jié)果表明,該模型提高了項(xiàng)目?jī)?nèi)缺陷預(yù)測(cè)和跨項(xiàng)目缺陷預(yù)測(cè)的性能,與傳統(tǒng)特征相比,該方法平均精度提高了14.7%,召回率提高了11.5%,F(xiàn)1 提高了14.2%.文獻(xiàn)[84]在文獻(xiàn)[82-83]所述的文件級(jí)缺陷預(yù)測(cè)的基礎(chǔ)上考慮了代碼變更,提出了一種啟發(fā)式方法,從代碼變更片段中提取重要的結(jié)構(gòu)信息和上下文信息;對(duì)于變更級(jí)缺陷預(yù)測(cè),該方法從代碼中提取標(biāo)記,并生成基于DBN 的特征;對(duì)于文件級(jí)缺陷預(yù)測(cè),使用源文件的完整AST 生成DBN 的語(yǔ)義特征.結(jié)果表明,在F1 指標(biāo)上,該方法在文件級(jí)和變更級(jí)缺陷預(yù)測(cè)方面上都優(yōu)于傳統(tǒng)的CPDP 和WPDP 模型.文獻(xiàn)[85]在DBN 模型提取語(yǔ)義特征的基礎(chǔ)上,將CNN 學(xué)習(xí)到的特征與傳統(tǒng)的缺陷預(yù)測(cè)特征相結(jié)合,提出了一種基于CNN 的缺陷預(yù)測(cè)框架,從程序的AST 中生成判別特征,并且保留了程序的語(yǔ)義和結(jié)構(gòu)特征.結(jié)果表明,在F-measure 方面,該方法比基于DBN 的方法提高了12%,比傳統(tǒng)的基于軟件度量的方法提高了16%.文獻(xiàn)[86]提出了一種基于注意力的RNN 的軟件缺陷預(yù)測(cè)(defect prediction via attentionbased recurrent neural network,DP-ARNN)框架,通過解析程序的AST 并將語(yǔ)法信息轉(zhuǎn)換為向量,然后使用字典嵌入和詞嵌入對(duì)向量編碼并輸入到ARNN 網(wǎng)絡(luò)中,利用ARNN 自動(dòng)學(xué)習(xí)語(yǔ)法結(jié)構(gòu)特征和語(yǔ)義信息內(nèi)容,最后通過注意力機(jī)制生成關(guān)鍵特征向量.與RNN 相比,DP-ARNN 在F-measure 上平均提升了3%,在AUC 上平均提升了1%.

深度學(xué)習(xí)方法(CNN,DBN)使用AST 生成的標(biāo)記向量以提取深度學(xué)習(xí)特征.文獻(xiàn)[87]發(fā)現(xiàn),CNN 和DBN 結(jié)合傳統(tǒng)軟件度量和TCA 算法,可以將源項(xiàng)目中提取到的深度學(xué)習(xí)特征用于目標(biāo)項(xiàng)目,解決跨項(xiàng)目中分布不平衡問題.實(shí)驗(yàn)結(jié)果表明,將深度學(xué)習(xí)生成的特征和傳統(tǒng)特征結(jié)合起來(lái),比純DBN 和CNN 模型的表現(xiàn)效果要好.文獻(xiàn)[88]提出了一個(gè)新的跨項(xiàng)目缺陷預(yù)測(cè)方法S2LMMD,首先通過在指定節(jié)點(diǎn)拆分原始AST 構(gòu)造聯(lián)合學(xué)習(xí)語(yǔ)句級(jí)樹SLT,從而捕獲更精細(xì)的語(yǔ)義和結(jié)構(gòu)信息;然后使用雙向門控循環(huán)神經(jīng)單元(bidirectional gated recurrent unit,Bi-GRU)學(xué)習(xí)序列嵌入并生成更有效的語(yǔ)義特征;最后使用最大平均偏差(maximum mean discrepancy,MMD)技術(shù)緩解跨項(xiàng)目中的數(shù)據(jù)分布差異,提高缺陷預(yù)測(cè)性能.實(shí)驗(yàn)結(jié)果表明,在AUC 指標(biāo)上,S2LMMD 優(yōu)于DBN和CNN.源代碼中的語(yǔ)法和不同級(jí)別的語(yǔ)義信息通常由樹的結(jié)構(gòu)表示,文獻(xiàn)[89]實(shí)現(xiàn)了一種基于樹結(jié)構(gòu)的LSTM 網(wǎng)絡(luò)(tree-structured LSTM network,Tree-LSTM),使用Tree-LSTM 匹配代碼的AST,充分捕獲源代碼中的語(yǔ)法和不同級(jí)別的語(yǔ)義,使用注意力機(jī)制定位源文件中可能存在缺陷的部分.

文獻(xiàn)[90]提出一種基于圖卷積神經(jīng)網(wǎng)絡(luò)(graph convolutional network,GCN)的缺陷預(yù)測(cè)模型.首先該模型從源代碼中提取了7 種節(jié)點(diǎn)特征,根據(jù)節(jié)點(diǎn)特征對(duì)控制流圖(control flow graph,CFG)節(jié)點(diǎn)進(jìn)行分類并生成節(jié)點(diǎn)特征值,最后為CFG 創(chuàng)建節(jié)點(diǎn)向量矩陣并將其傳遞給圖卷積網(wǎng)絡(luò)以自動(dòng)學(xué)習(xí)特征.結(jié)果表明,該模型可以適應(yīng)不同規(guī)模的軟件,在AUC,F(xiàn)1-score 等指標(biāo)上優(yōu)于CNN 等傳統(tǒng)的缺陷預(yù)測(cè)模型.

缺陷特征隱藏在程序語(yǔ)義中,但是AST 不顯示程序的執(zhí)行過程,它只代表源代碼的抽象句法結(jié)構(gòu).文獻(xiàn)[91]采用CNN 的思想,將源代碼轉(zhuǎn)換為程序控制流程圖,采用多視圖多層CNN 從CFG 中自動(dòng)提取學(xué)習(xí)缺陷特征,結(jié)果表明圖學(xué)習(xí)可以提高基于傳統(tǒng)特征和基于AST 方法的性能.

文獻(xiàn)[92]提出了一種基于增強(qiáng)代碼屬性圖(augmented-code property graph,Augmented-CPG)模型ACGDP,用于捕獲代碼的語(yǔ)法、語(yǔ)義、控制流和數(shù)據(jù)流信息.該模型在初始階段從缺陷代碼文件中獲得AST 和CFG,與代碼的控制流和數(shù)據(jù)流合并,生成Augmented-CPG,第2 階段提取候選缺陷區(qū)域(graph of defect region candidates,GDRC)定位可能存在的缺陷節(jié)點(diǎn),第3 階段從GDRC 中獲取代碼嵌入,使用圖神經(jīng)網(wǎng)絡(luò)(graph neural network,GNN)學(xué)習(xí)GDRC 中包含的缺陷特征.結(jié)果表明,該模型在Accuracy,Precision 等指標(biāo)上優(yōu)于VulDeePecker[93]模型.

代碼注釋是源代碼的另一種視圖,幫助生成反映代碼功能的語(yǔ)義特征,并識(shí)別軟件中含有缺陷的模塊.文獻(xiàn)[94]提出了一種評(píng)論增強(qiáng)程序的卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network for comments augmented program,CAP-CNN)缺陷預(yù)測(cè)模型,該模型在訓(xùn)練過程中將代碼注釋編碼為語(yǔ)義特征,結(jié)果表明CAP-CNN 在F-measure 指標(biāo)上優(yōu)于CNN.

近幾年,一些改進(jìn)的算法被提出來(lái)用于軟件缺陷預(yù)測(cè),網(wǎng)絡(luò)嵌入技術(shù)取得重大進(jìn)展.文獻(xiàn)[95]提出了Node2defect,一種基于隨機(jī)游走的網(wǎng)絡(luò)嵌入技術(shù)的缺陷預(yù)測(cè)模型,該模型能夠自動(dòng)學(xué)習(xí)軟件類依賴網(wǎng)絡(luò)的類結(jié)構(gòu)特征并挖掘節(jié)點(diǎn)鄰接信息和節(jié)點(diǎn)屬性,最后將學(xué)習(xí)到的特征與傳統(tǒng)度量連接并輸入到后續(xù)預(yù)測(cè)模型中.結(jié)果表明,該模型在F-measure 指標(biāo)上比傳統(tǒng)的軟件度量方法提高了9.15%.文獻(xiàn)[96]提出了GCN2defect,一種基于GNN 的缺陷預(yù)測(cè)模型,該網(wǎng)絡(luò)學(xué)習(xí)類依賴網(wǎng)絡(luò)中節(jié)點(diǎn)的結(jié)構(gòu)特征,并對(duì)節(jié)點(diǎn)的語(yǔ)義和結(jié)構(gòu)新信息進(jìn)行端到端的學(xué)習(xí).文獻(xiàn)[96]的作者引入了傳統(tǒng)靜態(tài)代碼度量、復(fù)雜網(wǎng)絡(luò)度量和網(wǎng)絡(luò)嵌入3 種類型的節(jié)點(diǎn)度量作為節(jié)點(diǎn)的屬性,與傳統(tǒng)的軟件度量和傳統(tǒng)的網(wǎng)絡(luò)嵌入相比,該方法顯著提高了缺陷預(yù)測(cè)性能.文獻(xiàn)[97]在此基礎(chǔ)上提出了CGCN 模型,使用CNN 捕獲AST 中的語(yǔ)義信息,GCN捕獲軟件網(wǎng)絡(luò)中的結(jié)構(gòu)信息,CGCN 通過這2 種方式獲得聯(lián)合特征,并與傳統(tǒng)特征結(jié)合用于訓(xùn)練分類器.結(jié)果表明,該模型優(yōu)于Node2defect 和GCN2defect 等方法.

文獻(xiàn)[98]使用Transformer 模型自動(dòng)學(xué)習(xí)序列的語(yǔ)義特征和句法結(jié)構(gòu)特征,預(yù)測(cè)代碼的缺陷密度.文獻(xiàn)[99]考慮了源代碼的語(yǔ)義和上下文信息,采用BERT和雙向長(zhǎng)短期記憶網(wǎng)絡(luò)(bidirectional long short-term memory,BiLSTM)模型預(yù)測(cè)缺陷,BiLSTM 通過BERT模型學(xué)習(xí)的token 向量學(xué)習(xí)上下文的語(yǔ)義信息.結(jié)果表明,與現(xiàn)有的深度學(xué)習(xí)和傳統(tǒng)特征相比,該模型更能有效提取程序的語(yǔ)義信息.

討論5:本節(jié)統(tǒng)計(jì)分析了基于語(yǔ)法語(yǔ)義的缺陷預(yù)測(cè)模型,根據(jù)分析結(jié)果發(fā)現(xiàn),缺陷特征隱藏在程序語(yǔ)義中,大多數(shù)研究者將源代碼解析為AST,利用深度學(xué)習(xí)技術(shù)學(xué)習(xí)程序的語(yǔ)法和句法特征.

觀點(diǎn)2:缺陷特征隱藏在程序語(yǔ)義中,但是AST不顯示程序的執(zhí)行過程,它只代表源代碼的抽象句法結(jié)構(gòu),未來(lái)研究者應(yīng)使用源代碼的多種表征方式,幫助生成反映代碼功能的語(yǔ)義特征.

5 漏洞預(yù)測(cè)

漏洞是一種特定的軟件安全缺陷,存在能夠被攻擊者利用并造成危害的安全隱患.與軟件缺陷研究領(lǐng)域不同,漏洞的研究領(lǐng)域可以分為漏洞檢測(cè)與漏洞預(yù)測(cè)2 個(gè)任務(wù)場(chǎng)景.

漏洞檢測(cè)和漏洞預(yù)測(cè)2 個(gè)任務(wù)側(cè)重的研究目的不同.漏洞檢測(cè)任務(wù)針對(duì)已知的漏洞,在特定的軟件中檢測(cè)是否存在目標(biāo)漏洞.漏洞預(yù)測(cè)任務(wù)則主要負(fù)責(zé)從宏觀角度進(jìn)行數(shù)據(jù)上的統(tǒng)計(jì),預(yù)測(cè)一個(gè)代碼文件中可能存在的漏洞數(shù)量,以減少漏洞發(fā)現(xiàn)和修復(fù)的成本.但隨著人工智能尤其是深度學(xué)習(xí)方法的大量引入,漏洞檢測(cè)和漏洞預(yù)測(cè)模型愈發(fā)相似,由于都使用大規(guī)模精細(xì)標(biāo)注的數(shù)據(jù)集進(jìn)行訓(xùn)練,任務(wù)的目的和實(shí)現(xiàn)的方式也漸漸重合,在近年的許多研究工作中已經(jīng)不再區(qū)分這兩者的概念.

本節(jié)以漏洞預(yù)測(cè)過程為切入點(diǎn),分別介紹了傳統(tǒng)的基于軟件度量的預(yù)測(cè)方法以及基于語(yǔ)法語(yǔ)義的預(yù)測(cè)方法.

5.1 漏洞預(yù)測(cè)模型

5.1.1 基于軟件度量的漏洞預(yù)測(cè)

基于軟件度量的漏洞預(yù)測(cè)模型通過人工設(shè)計(jì)軟件特征表示軟件漏洞相關(guān)信息,再使用機(jī)器學(xué)習(xí)算法預(yù)測(cè)并識(shí)別漏洞相關(guān)的組件.漏洞預(yù)測(cè)模型使用復(fù)雜度、代碼變更、開發(fā)者活動(dòng)、耦合、內(nèi)聚等度量,并使用LR,SVM,J48,DT,RF,NB,BN 等機(jī)器學(xué)習(xí)算法預(yù)測(cè)漏洞相關(guān)的組件.

文獻(xiàn)[100]對(duì)Mozilla 中的JavaScript 引擎進(jìn)行了案例研究,發(fā)現(xiàn)9 種復(fù)雜性度量(包括McCabe,SLOC 等度量)可以用于預(yù)測(cè)漏洞,但是誤報(bào)率較高.文獻(xiàn)[100]的作者發(fā)現(xiàn),漏洞函數(shù)和缺陷函數(shù)的復(fù)雜性度量?jī)H在復(fù)雜度方面存在顯著差異,因此復(fù)雜度可以區(qū)分漏洞和缺陷函數(shù).文獻(xiàn)[101]使用源代碼行、代碼變更等度量預(yù)測(cè)漏洞,結(jié)果表明該回歸樹模型在最佳情況下實(shí)現(xiàn)了100%的召回率和8%的假陽(yáng)率.文獻(xiàn)[102]研究了開發(fā)人員協(xié)作結(jié)構(gòu)與漏洞之間的關(guān)系,研究發(fā)現(xiàn),由9 個(gè)或者更多開發(fā)人員更改的文件比少于9個(gè)開發(fā)人員更改的文件具有漏洞的可能性高16 倍.文獻(xiàn)[103]研究了3 種軟件度量指標(biāo)(復(fù)雜性、代碼變更、開發(fā)人員活動(dòng))是否可以區(qū)分易受攻擊的文件來(lái)指導(dǎo)安全檢查和測(cè)試.結(jié)果表明,28 個(gè)度量中至少有24 個(gè)可以區(qū)分2 個(gè)項(xiàng)目的易受攻擊文件和中性文件,這3 種度量可以為安全檢查和測(cè)試工作提供有價(jià)值的指導(dǎo).文獻(xiàn)[104]研發(fā)出一個(gè)基于復(fù)雜性、耦合性和內(nèi)聚性相關(guān)的漏洞預(yù)測(cè)框架,該框架能正確預(yù)測(cè)Mozilla Firefox 的大多數(shù)受漏洞影響的文件,且誤報(bào)率較低.

觀點(diǎn)3:基于軟件度量的漏洞預(yù)測(cè)研究提出了大量的指標(biāo),試圖盡可能完整地從軟件代碼中手動(dòng)提取出漏洞相關(guān)的特征.但這些人工定義的特征并不一定能夠完全理解代碼本身的含義,因此在實(shí)際的漏洞預(yù)測(cè)中仍具有較多不足.

例如在圖7 中的2 段Python 代碼,從功能上來(lái)看都是從棧頂彈出5 個(gè)數(shù)據(jù),但代碼1 在棧中數(shù)據(jù)不足5 個(gè)時(shí)有向下溢出的風(fēng)險(xiǎn),代碼2 則沒有.但這2段代碼具有相同的軟件度量、代碼標(biāo)記和頻率等,僅依靠人工提取的指標(biāo)難以對(duì)二者進(jìn)行區(qū)分,需要一種能夠提取代碼的語(yǔ)法結(jié)構(gòu)特征和語(yǔ)義信息內(nèi)容的算法.

Fig.7 Code example圖7 代碼示例

5.1.2 基于語(yǔ)法語(yǔ)義的漏洞預(yù)測(cè)

基于語(yǔ)法語(yǔ)義的漏洞挖掘通過文本挖掘、AST等方式提取軟件代碼中的特征信息,轉(zhuǎn)化為向量的數(shù)字表示,隨后使用機(jī)器學(xué)習(xí)(machine learning,ML)或深度學(xué)習(xí)(deep learning,DL)方法進(jìn)行分類.使用圖算法或者注意力機(jī)制還可以具體定位可能出現(xiàn)漏洞的位置.基于語(yǔ)法語(yǔ)義的研究主要集中在探究不同的特征提取方法和各種訓(xùn)練模型.

文獻(xiàn)[105]提出了一種依賴于源代碼文本分析的方法,將每個(gè)文件轉(zhuǎn)換為一個(gè)特征向量.該方法將源代碼的每一個(gè)字母組合都視為特征,使用給定文件源代碼中給定字母組合的計(jì)數(shù)值.該研究在開源移動(dòng)應(yīng)用程序上實(shí)現(xiàn)了87%的準(zhǔn)確率、85%的精度和88%的召回率.文獻(xiàn)[106]將文件中的代碼標(biāo)記和頻率作為代碼的文本特征,預(yù)測(cè)可能存在漏洞的組件,該模型相比于PHP 應(yīng)用程序的軟件度量模型實(shí)現(xiàn)了更高的召回率.但是對(duì)詞袋模型來(lái)說(shuō),它忽略了代碼之間的語(yǔ)法結(jié)構(gòu)信息,隱藏在程序中的語(yǔ)義信息可以幫助易受攻擊的代碼提供更豐富的表示,從而改進(jìn)漏洞預(yù)測(cè)模型的效果.此后的研究引入了AST 來(lái)表征句法結(jié)構(gòu),文獻(xiàn)[107]從代碼中提取了AST 并確定樹的結(jié)構(gòu)模式,根據(jù)樹的結(jié)構(gòu)模式自動(dòng)比較代碼,該方法僅通過檢查少量代碼庫(kù)就能進(jìn)行漏洞預(yù)測(cè).文獻(xiàn)[108]使用Antlr 從C/C++源文件中提取AST,以每個(gè)函數(shù)為基本單元從AST 中提取向量,利用該向量訓(xùn)練分類器來(lái)預(yù)測(cè)緩沖區(qū)漏洞.

許多深度學(xué)習(xí)技術(shù)也開始應(yīng)用于漏洞預(yù)測(cè)任務(wù).深度學(xué)習(xí)技術(shù)可以從復(fù)雜的代碼中自動(dòng)獲取更深層次的特征信息,表征程序的語(yǔ)法和語(yǔ)義特征.文獻(xiàn)[109]在令牌(token)級(jí)數(shù)據(jù)上,采用深度神經(jīng)網(wǎng)絡(luò),結(jié)合N-gram 分析和特征選擇構(gòu)造特征,該模型能夠在Java Android 應(yīng)用程序漏洞預(yù)測(cè)任務(wù)中實(shí)現(xiàn)高精度、高準(zhǔn)確率和高召回率.文獻(xiàn)[110]利用LSTM 捕獲源代碼中的上下文關(guān)系,學(xué)習(xí)代碼的語(yǔ)法語(yǔ)義特征,結(jié)果表明該方法優(yōu)于傳統(tǒng)的軟件度量等模型.文獻(xiàn)[111]研究了基于文本挖掘的漏洞預(yù)測(cè)中詞嵌入算法的價(jià)值,使用word2vec 和fast-text 兩種模型學(xué)習(xí)代碼標(biāo)記之間的語(yǔ)法語(yǔ)義關(guān)系,使用CNN 和RNN 模型預(yù)測(cè)文件中是否含有漏洞.文獻(xiàn)[111]的作者發(fā)現(xiàn),使用用于生成單詞嵌入向量的算法時(shí),模型的F2-score 增大,且word2vec 算法效果最佳.基于深度學(xué)習(xí)的漏洞預(yù)測(cè)模型也成為了研究的熱點(diǎn).

文獻(xiàn)[93]提出VulDeePecker 系統(tǒng),在漏洞預(yù)測(cè)任務(wù)中引入了深度神經(jīng)網(wǎng)絡(luò)BiLSTM,同時(shí)采集了一個(gè)用于評(píng)估漏洞檢測(cè)效果的數(shù)據(jù)集.文獻(xiàn)[112]建立了一套基于深度學(xué)習(xí)的漏洞預(yù)測(cè)系統(tǒng),能針對(duì)輸入的文件或函數(shù)進(jìn)行粗粒度預(yù)測(cè),也能針對(duì)新實(shí)例中的某一小代碼塊,進(jìn)行某幾種漏洞的細(xì)粒度預(yù)測(cè)和定位.文獻(xiàn)[113]提出基于GNN 的Devign 模型,提取了4 種屬性AST、CFG、數(shù)據(jù)流圖(data flow graph,DFG)和自然語(yǔ)言中的代碼序列以完成對(duì)代碼的表征.文獻(xiàn)[114]提出的SySeVR 模型使用基于數(shù)據(jù)依賴的語(yǔ)義信息表征代碼.文獻(xiàn)[115]提出了IVDetect 模型,提取代碼中的數(shù)據(jù)和控制依賴關(guān)系生成5 個(gè)維度的向量表示,統(tǒng)一交由RNN 模型訓(xùn)練學(xué)習(xí),實(shí)驗(yàn)結(jié)果表明,IVDetect 模型帶來(lái)了精度的提升并能夠定位到漏洞所在函數(shù)塊.基于此,文獻(xiàn)[116]提出了LineVul 模型,使用CodeBERT 預(yù)訓(xùn)練模型完成代碼的詞向量轉(zhuǎn)化,使用行粒度數(shù)據(jù)集進(jìn)行訓(xùn)練,使用GNN 捕獲文本中的依賴關(guān)系,模型得到更高預(yù)測(cè)準(zhǔn)確性的同時(shí)能夠定位漏洞所在代碼行.

討論7:從文本挖掘的角度來(lái)提取文件中的漏洞特征能夠更充分地捕獲代碼的語(yǔ)法語(yǔ)義特征.計(jì)算機(jī)算力的提升和深度學(xué)習(xí)方法的引入也使得研究者得以從復(fù)雜冗長(zhǎng)的代碼中提取出豐富的特征.這一領(lǐng)域的學(xué)者們主要圍繞如何完成代碼到連續(xù)值向量的轉(zhuǎn)換以及深度學(xué)習(xí)模型的搭建對(duì)漏洞預(yù)測(cè)任務(wù)的優(yōu)化提升展開研究.通過總結(jié)歸納發(fā)現(xiàn)在代碼特征表征階段,AST 和RNN 這2 個(gè)思路被大多數(shù)研究者所選擇,AST 可以很好地輔助理解代碼中的邏輯結(jié)構(gòu),RNN 則可以在代碼量巨大的文件中捕獲長(zhǎng)距離的依賴關(guān)系.除了AST 和RNN,近年來(lái)的工作開始逐漸轉(zhuǎn)向大規(guī)模語(yǔ)言模型(例如CodeBERT),這些大規(guī)模語(yǔ)言模型在程序語(yǔ)言任務(wù)上進(jìn)行了預(yù)訓(xùn)練,因此可以更好地捕獲和理解程序語(yǔ)言特征以應(yīng)用于各項(xiàng)程序語(yǔ)言相關(guān)的下游任務(wù).

觀點(diǎn)4:即便使用了AST 來(lái)表征代碼的語(yǔ)法結(jié)構(gòu),如何用向量盡可能充分地表征一個(gè)代碼文件依舊是研究的熱點(diǎn)所在.當(dāng)代碼量過大時(shí),RNN 對(duì)于代碼中的依賴關(guān)系并不能充分捕獲,梯度消失問題依舊存在,所以或許一種新的學(xué)習(xí)模型能夠給漏洞預(yù)測(cè)領(lǐng)域的研究帶來(lái)突破.此外,目前漏洞預(yù)測(cè)的結(jié)果較為單一,無(wú)法全方位多角度地描述漏洞,因此更細(xì)粒度的漏洞預(yù)測(cè)結(jié)果也是近年來(lái)研究的一個(gè)熱點(diǎn).

5.2 漏洞預(yù)測(cè)和缺陷預(yù)測(cè)的區(qū)別與聯(lián)系

5.2.1 漏洞與缺陷的區(qū)別與聯(lián)系

漏洞與缺陷不是2 個(gè)完全分離的概念,具體來(lái)說(shuō)漏洞是一種特殊的安全性缺陷.

文獻(xiàn)[117]表示軟件缺陷是導(dǎo)致功能單元無(wú)法執(zhí)行其所需功能的功能性缺陷,軟件漏洞是軟件規(guī)范、開發(fā)或配置中的缺陷實(shí)例,漏洞的執(zhí)行會(huì)違反安全策略.文獻(xiàn)[118]認(rèn)為漏洞是缺陷的子集,漏洞是一種特定類型的安全性軟件缺陷.文獻(xiàn)[119]表示,漏洞是能夠被人利用來(lái)進(jìn)行入侵行為的缺陷,漏洞的出現(xiàn)是人嘗試攻擊的結(jié)果,而不是機(jī)器運(yùn)行的結(jié)果.

根據(jù)文獻(xiàn)的調(diào)研結(jié)果,缺陷與漏洞之間的相似性與不同如表10 所示.漏洞與缺陷的產(chǎn)生都與硬件[120]、代碼的復(fù)雜性[117-119]以及編程人員能力[121]有關(guān),且都會(huì)對(duì)軟件造成巨大的影響.文獻(xiàn)[120]指出硬件在漏洞和缺陷的產(chǎn)生過程中扮演了重要的角色.絕大多數(shù)的電子設(shè)備都采用典型的片上系統(tǒng)(system-on-chip,SoC)作為設(shè)備的核心部件,它由多個(gè)知識(shí)產(chǎn)權(quán)(intellectual property,IP)組成,包括處理器、內(nèi)存和輸入輸出設(shè)備等.為了降低SoC 設(shè)計(jì)成本并且滿足上市時(shí)間的要求,SoC 的開發(fā)涉及多個(gè)第三方公司的供應(yīng)鏈.然而,第三方的IP 依賴性也引起了硬件安全問題,因?yàn)閺牟皇苄湃蔚墓?yīng)商收集的硬件IP 帶有硬件木馬、后門等其他問題.文獻(xiàn)[121]指出軟件開發(fā)者的經(jīng)驗(yàn)和代碼復(fù)雜性與缺陷密切相關(guān),該文作者對(duì)2003—2011 年期間Linux 的不同版本進(jìn)行了分析,研究發(fā)現(xiàn)盡管Linux 的規(guī)模在不斷增加,但缺陷數(shù)量呈現(xiàn)減少的趨勢(shì).此外,Block,Null 等類型缺陷仍然在新的文件中引入和修復(fù),但這些類型缺陷的影響各不相同.與缺陷不同的是,攻擊者可以利用漏洞實(shí)施一系列攻擊,造成更為嚴(yán)重的后果.

Table 10 Differences and Connections Between Defects and Vulnerabilities表10 缺陷和漏洞的區(qū)別與聯(lián)系

文獻(xiàn)[122]的結(jié)果表明,沒有一套通用的指標(biāo)可以有效地預(yù)測(cè)漏洞,漏洞預(yù)測(cè)不像缺陷預(yù)測(cè)那么容易,在相同的度量元下,缺陷預(yù)測(cè)可以獲得合理的精度和召回率,但是漏洞預(yù)測(cè)的精度和召回率卻不盡如人意.文獻(xiàn)[123]使用3 種傳統(tǒng)的缺陷度量構(gòu)建了缺陷預(yù)測(cè)模型和漏洞預(yù)測(cè)模型,測(cè)量缺陷預(yù)測(cè)模型預(yù)測(cè)漏洞文件的準(zhǔn)確性,結(jié)果表明傳統(tǒng)的缺陷預(yù)測(cè)指標(biāo)可以檢測(cè)大部分易受攻擊的文件,但是誤報(bào)率較高.文獻(xiàn)[124]發(fā)現(xiàn),缺陷預(yù)測(cè)和漏洞預(yù)測(cè)模型提供了相似的預(yù)測(cè)性能,當(dāng)模型使用傳統(tǒng)的軟件度量時(shí),兩者可以互換使用,且缺陷和漏洞預(yù)測(cè)的性能在很大程度上受先前版本中報(bào)告的缺陷數(shù)量和漏洞數(shù)量的影響.

討論8:基于軟件度量的缺陷預(yù)測(cè)和漏洞預(yù)測(cè)提供了相似的預(yù)測(cè)性能.但是傳統(tǒng)的軟件度量不能識(shí)別語(yǔ)義不同的代碼,因?yàn)榇蠖鄶?shù)情況下2 段代碼具有相同的復(fù)雜度,但是受到的攻擊可能不同.未來(lái)研究者可以從語(yǔ)義角度自動(dòng)提取缺陷和漏洞相關(guān)特征,探究缺陷預(yù)測(cè)模型在漏洞預(yù)測(cè)問題上的可移植性.

5.2.2 基于語(yǔ)法語(yǔ)義的預(yù)測(cè)模型

隨著人工智能技術(shù)在各個(gè)領(lǐng)域表現(xiàn)出強(qiáng)大的預(yù)測(cè)能力,近年來(lái)安全研究領(lǐng)域也引入人工智能技術(shù)用于執(zhí)行缺陷預(yù)測(cè)和漏洞預(yù)測(cè)任務(wù).

缺陷和漏洞預(yù)測(cè)的研究需要提取不同的軟件度量,基于人工智能技術(shù)的預(yù)測(cè)模型也逐漸有了類似的結(jié)構(gòu),包括向量表征、提取特征和ML/DL 分類器訓(xùn)練等流程.通過對(duì)缺陷和漏洞任務(wù)中的深度學(xué)習(xí)模型統(tǒng)計(jì)發(fā)現(xiàn),CNN,RNN,DBN 等模型均是缺陷和漏洞預(yù)測(cè)任務(wù)中的常見方法,大量的研究工作用它們搭配不同的特征提取方法進(jìn)行預(yù)測(cè).

AST 能夠高效地表征程序語(yǔ)言的語(yǔ)法語(yǔ)義,因此AST 特征提取是目前最主流的缺陷預(yù)測(cè)和漏洞預(yù)測(cè)的向量表征方法.由于軟件代碼平均長(zhǎng)度較長(zhǎng),所以許多研究也開始使用LSTM 模型來(lái)捕獲長(zhǎng)距離代碼之間的語(yǔ)義依賴關(guān)系,基于LSTM 模型的注意力機(jī)制被廣泛用于定位具體缺陷和漏洞的位置.隨著BERT 模型的出現(xiàn),一些大規(guī)模語(yǔ)言模型加入數(shù)據(jù)流、控制流等深層次的程序語(yǔ)言依賴關(guān)系來(lái)幫助模型更好地捕獲和理解程序語(yǔ)言的語(yǔ)義特征.

討論9:隨著深度神經(jīng)網(wǎng)絡(luò)的可解釋性逐步增強(qiáng),面臨具體問題時(shí)應(yīng)當(dāng)選擇的網(wǎng)絡(luò)模型也愈發(fā)明晰.而缺陷與漏洞的預(yù)測(cè)模型越來(lái)越相似,也從某方面說(shuō)明2 個(gè)任務(wù)在實(shí)現(xiàn)思路上具有較強(qiáng)的共性,缺陷預(yù)測(cè)的可移植性問題也值得探究.

6 未來(lái)研究展望

本節(jié)通過梳理和歸納缺陷預(yù)測(cè)和漏洞預(yù)測(cè)任務(wù)的研究成果,總結(jié)了這2 個(gè)研究領(lǐng)域現(xiàn)階段面臨的挑戰(zhàn)與機(jī)遇,如表11 所示.

Table 11 Opportunities and Challenges of Defect Prediction and Vulnerability Prediction Tasks表11 缺陷預(yù)測(cè)和漏洞預(yù)測(cè)任務(wù)的挑戰(zhàn)與機(jī)遇

6.1 數(shù)據(jù)集的來(lái)源與處理

缺陷預(yù)測(cè)常用數(shù)據(jù)集及其屬性如表4 所示,研究者主要使用NASA,PROMISE,AEEEM 缺陷公共倉(cāng)庫(kù)中的CM1,JM1,KC1,KC2,KC3 等數(shù)據(jù)集進(jìn)行缺陷預(yù)測(cè)相關(guān)研究,但這些缺陷數(shù)據(jù)集大多數(shù)已經(jīng)無(wú)人維護(hù).

隨著深度神經(jīng)網(wǎng)絡(luò)(deep neural network,DNN)在缺陷預(yù)測(cè)模型中的發(fā)展,預(yù)測(cè)模型對(duì)于數(shù)據(jù)集質(zhì)量的要求也越來(lái)越高.這些公共數(shù)據(jù)集不包含缺陷相關(guān)的細(xì)節(jié)信息,不能給DL 模型提供充分的特征信息.因此,創(chuàng)建新的數(shù)據(jù)集、增加多標(biāo)簽預(yù)測(cè)是未來(lái)的研究點(diǎn).

除了數(shù)據(jù)集的來(lái)源,數(shù)據(jù)集的標(biāo)注也是一個(gè)值得關(guān)注的方面.當(dāng)前研究發(fā)現(xiàn)通過GNN 或者注意力機(jī)制等方法能夠具體定位到預(yù)測(cè)缺陷和漏洞出現(xiàn)的函數(shù)塊或代碼行,并且數(shù)據(jù)標(biāo)注越細(xì)粒度,模型所能捕獲的信息也越具體.

目前軟件缺陷預(yù)測(cè)和漏洞預(yù)測(cè)使用的數(shù)據(jù)集往往具有類不平衡、維度過高、預(yù)測(cè)特征不足、分類標(biāo)簽不足等缺點(diǎn).類不平衡和維度過高問題可以通過研究者人工規(guī)范化或者降維處理來(lái)緩解,但特征和標(biāo)簽不足的問題則只能尋求更加高質(zhì)量、平衡且無(wú)噪音的數(shù)據(jù).因此,為了更好地預(yù)測(cè)缺陷、改善資源分配和修復(fù)缺陷代碼,研究者需要?jiǎng)?chuàng)建一個(gè)高質(zhì)量的缺陷數(shù)據(jù)集.

6.2 代碼向量表征方法

目前的代碼向量表征研究嘗試了包括變量名稱和類型、AST、程序依賴圖、數(shù)據(jù)依賴在內(nèi)的多種方法來(lái)表征代碼蘊(yùn)含的語(yǔ)法語(yǔ)義信息.

除了單一表征方法外,許多研究也著眼于多維度的混合表征方法,并給模型帶來(lái)了一定的性能提升.其中,AST 能夠出色提取代碼中語(yǔ)法結(jié)構(gòu)特征,因此被廣泛應(yīng)用于各種模型的代碼表征階段.但如何在不丟失語(yǔ)法結(jié)構(gòu)特征和語(yǔ)義信息內(nèi)容的前提下,將源代碼嵌入到向量空間,從而更好地完成代碼表征工作,仍需要研究者們繼續(xù)探索.

6.3 預(yù)訓(xùn)練模型的提高

人工定義的各種代碼表征方法似乎已經(jīng)走到一個(gè)瓶頸,當(dāng)前許多工作嘗試了各種方法來(lái)提取代碼中的特征,但都不能全面地捕獲程序語(yǔ)言的全部語(yǔ)義信息,于是有的研究工作開始嘗試引入code2vec模型.

近年來(lái)出現(xiàn)的Glove 等詞向量模型給代碼表征帶來(lái)了一定的啟發(fā).最近人工智能領(lǐng)域也提出了許多諸如CodeBERT 的大規(guī)模預(yù)訓(xùn)練程序語(yǔ)言模型,但它不能深入地捕獲到程序語(yǔ)言的語(yǔ)義級(jí)別信息,它的后繼者GraphCodeBERT 加入了數(shù)據(jù)流的依賴關(guān)系,得到了更多的代碼語(yǔ)義表征,并在多個(gè)程序分析相關(guān)下游任務(wù)中取得了SOTA 成果.可以預(yù)見,引入更好的預(yù)訓(xùn)練模型也會(huì)給漏洞挖掘領(lǐng)域的DL 方法帶來(lái)極大提升.

6.4 深度學(xué)習(xí)模型探索

由于軟件代碼的長(zhǎng)度較長(zhǎng),代碼中經(jīng)常出現(xiàn)遠(yuǎn)距離的數(shù)據(jù)和控制依賴關(guān)系,因此盡可能完整地提取其中的語(yǔ)法結(jié)構(gòu)特征和語(yǔ)義信息內(nèi)容一直是相關(guān)研究面臨的一個(gè)難題.

選擇合適的深度學(xué)習(xí)模型就可以幫助研究者更好地捕獲語(yǔ)法語(yǔ)義信息,目前主流的觀點(diǎn)認(rèn)為使用具有記憶門單元的RNN 系列模型可以幫助提取部分遠(yuǎn)距離依賴關(guān)系的特征,但有些研究指出RNN 在更長(zhǎng)的代碼文本中同樣力有未逮.因此,更適合缺陷和漏洞的預(yù)測(cè)任務(wù)的深度學(xué)習(xí)模型仍待研究者們進(jìn)一步探索.

6.5 細(xì)粒度預(yù)測(cè)技術(shù)

為了在實(shí)際應(yīng)用中減少查找、修復(fù)缺陷和漏洞的成本,預(yù)測(cè)任務(wù)中也產(chǎn)生了定位可能出現(xiàn)的缺陷或漏洞的位置需求,因此如何更加細(xì)粒度地定位缺陷和漏洞也是未來(lái)研究工作的突破方向之一.

通過各種圖算法或者注意力機(jī)制,目前大部分預(yù)測(cè)工作可以對(duì)代碼文件或者具體函數(shù)進(jìn)行缺陷和漏洞定位,甚至還有部分研究工作實(shí)現(xiàn)了將缺陷和漏洞具體定位到代碼行.可以預(yù)見,細(xì)粒度預(yù)測(cè)技術(shù)會(huì)隨著算法的改進(jìn)和數(shù)據(jù)集的精細(xì)化而得到提升.

6.6 缺陷預(yù)測(cè)和漏洞預(yù)測(cè)模型的遷移

缺陷和漏洞都與代碼或者設(shè)計(jì)的復(fù)雜性有關(guān).漏洞和缺陷之間的相似性使得能夠用傳統(tǒng)的缺陷預(yù)測(cè)指標(biāo)進(jìn)行漏洞預(yù)測(cè).如果缺陷預(yù)測(cè)模型可以用于漏洞預(yù)測(cè),則不需要花費(fèi)額外的時(shí)間和資源為漏洞創(chuàng)建單獨(dú)的模型.

基于軟件度量的缺陷預(yù)測(cè)模型在一定程度上提供類似于漏洞預(yù)測(cè)的功能.一些缺陷預(yù)測(cè)模型可能會(huì)具有預(yù)測(cè)漏洞的性能,但是這種缺陷預(yù)測(cè)模型并不是專門為預(yù)測(cè)漏洞而產(chǎn)生的,如果要預(yù)測(cè)漏洞則需要對(duì)模型進(jìn)行一定的改進(jìn).未來(lái),研究者可以開發(fā)一種通用模型區(qū)分缺陷與漏洞.

7 結(jié)束語(yǔ)

軟件缺陷預(yù)測(cè)借助機(jī)器學(xué)習(xí)或深度學(xué)習(xí)方法提前發(fā)現(xiàn)軟件缺陷,可以減少軟件修復(fù)成本并提高產(chǎn)品的質(zhì)量.研究開源軟件缺陷預(yù)測(cè),能夠提高對(duì)各類項(xiàng)目的軟件缺陷的認(rèn)識(shí),更好地指導(dǎo)代碼檢測(cè)和測(cè)試工作.本文通過調(diào)研分析軟件預(yù)測(cè)研究領(lǐng)域相關(guān)文獻(xiàn),以機(jī)器學(xué)習(xí)和深度學(xué)習(xí)為切入點(diǎn),梳理了基于軟件度量和基于語(yǔ)法語(yǔ)義的2 類預(yù)測(cè)模型.基于這2類模型,分析了軟件缺陷預(yù)測(cè)和漏洞預(yù)測(cè)之間的區(qū)別與聯(lián)系.最后,對(duì)軟件預(yù)測(cè)的六大前沿?zé)狳c(diǎn)問題進(jìn)行詳盡分析,指出軟件缺陷預(yù)測(cè)未來(lái)的發(fā)展方向.

通過總結(jié)軟件缺陷預(yù)測(cè)相關(guān)的研究,本文認(rèn)為,未來(lái)的研究方向可以從4 個(gè)方面展開:1)創(chuàng)建一個(gè)高質(zhì)量的缺陷數(shù)據(jù)集有助于預(yù)測(cè)缺陷、改善資源分配和修復(fù)缺陷代碼;2)構(gòu)建一種最大程度蘊(yùn)含語(yǔ)法語(yǔ)義信息的表征方法、利用其他領(lǐng)域訓(xùn)練好的詞向量嵌入能夠提高缺陷預(yù)測(cè)模型的性能;3)適應(yīng)細(xì)粒度的預(yù)測(cè)技術(shù)可以更加精確地定位缺陷和漏洞可能出現(xiàn)的位置;4)開發(fā)一種通用模型區(qū)分缺陷與漏洞,可以更好地預(yù)測(cè)易受攻擊的代碼位置.

作者貢獻(xiàn)聲明:田笑負(fù)責(zé)設(shè)計(jì)研究方案及論文撰寫和最終版本的修訂;常繼友負(fù)責(zé)調(diào)研分析、數(shù)據(jù)統(tǒng)計(jì)及畫圖;張弛負(fù)責(zé)部分論文的撰寫;榮景峰和王子昱負(fù)責(zé)調(diào)研分析;張光華、王鶴、伍高飛、胡敬爐負(fù)責(zé)論文的整體修訂;張玉清提出論文的整體研究思路,及最終論文的審核與修訂.

猜你喜歡
軟件缺陷度量漏洞
漏洞
鮑文慧《度量空間之一》
模糊度量空間的強(qiáng)嵌入
基于源文件可疑度的靜態(tài)軟件缺陷檢測(cè)方法研究
迷向表示分為6個(gè)不可約直和的旗流形上不變愛因斯坦度量
基于NPE-SVM的軟件缺陷預(yù)測(cè)模型
開源程序的軟件缺陷分布特征的量化分析研究
三明:“兩票制”堵住加價(jià)漏洞
漏洞在哪兒
地質(zhì)異常的奇異性度量與隱伏源致礦異常識(shí)別