亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        一種面向缺陷檢測過程的警報自動確認方法

        2022-08-03 02:40:46孔焦龍金大海宮云戰(zhàn)
        計算機測量與控制 2022年7期
        關鍵詞:指令集字符串狀態(tài)機

        孔焦龍,金大海, 宮云戰(zhàn)

        (北京郵電大學 網(wǎng)絡與交換技術國家重點實驗室,北京 100876)

        0 引言

        軟件出現(xiàn)在現(xiàn)代生活的方方面面,從社交媒體到基礎設施。由于軟件正在變得越來越復雜,其不可避免的存在重大的缺陷,這些缺陷可能會給人類社會造成重大的損失[1]。然而,由于有限的預算以及緊張的日程安排,僅僅通過軟件測試來找出缺陷是不切實際的,因為這通常需要大量的時間來運行各種各樣的測試用例。靜態(tài)分析(SA,static analysis)能很好的彌補這一點,不需要運行程序也能檢驗程序源碼,并且可以考慮到所有可能的程序執(zhí)行。但是,通過靜態(tài)分析在程序中找到的相關缺陷通常是不可判定的,這一點限制了靜態(tài)分析工具的實用性[2]。因此靜態(tài)分析工具報告出的有關代碼缺陷的警報信息中會存在一部分錯誤,本文稱之為誤報,人工確認潛在缺陷是一項費時費力的工作[3]。

        為了減輕人工確認的負擔,大量能使這一過程自動化的方法已經(jīng)被提出[4-5]。其中有通過設計并提取一系列的手工特征來訓練有效的分類模型,這些被提取的特征主要和源代碼的統(tǒng)計特征有關,包括McCabe metrics[6], Halstead metrics[7], 和CK metrics[8],然而當前文獻表明這些特征在表示源代碼深層語義信息的時候缺乏準確性。另外,之前大部分方法主要針對工程內的任務,即訓練集和測試集來自同一個工程??绻こ檀_認的一個主要的問題在于不同工程之間數(shù)據(jù)分布的差異性。因此,直接把基于源工程特征構建起來的模型應用到目標工程,大部分情況下無法達到令人滿意的效果。

        最近,越來越多靜態(tài)分析和人工智能結合的研究成為了解決上述問題的重要手段。明確地說,基于深度學習的方法已被廣泛應用于特征的自動生成[9-13]。它們的主要思路是將從源代碼對應的語法樹(AST,abstract syntax tree)上獲取的符號序列表示為符合深度神經(jīng)網(wǎng)絡的輸入形式,再利用神經(jīng)網(wǎng)絡學到的特征去訓練更準確的分類模型。相關實驗結果表明基于深度學習的方法能夠更好的獲取軟件缺陷相關的語義特征,因此它們的表現(xiàn)會勝過僅使用手工特征的傳統(tǒng)方法。

        本文提出一種面向缺陷檢測過程的自動確認方法,即基于缺陷模式狀態(tài)機[14]的檢測過程。通過搜集在檢測過程中與缺陷模式狀態(tài)機實例狀態(tài)轉換相關的指令集,提取指令集中所包含的細粒度的語法、語義信息并轉換為結構化的序列,將這些序列集合映射到高維向量空間后作為神經(jīng)網(wǎng)絡的輸入,訓練出能有效自動確認警報的模型。該方法一定程度上可以抵消不同工程之間的特征分布差異,本文將其命名為State2Vec。

        1 相關工作

        1.1 缺陷模式狀態(tài)機

        缺陷模式描述了程序的某種屬性,如果違反該屬性則生成一條缺陷。例如:若某處申請的資源在使用完后未釋放,則造成資源泄露缺陷(RL,resource leak);若對空指針解引用操作,會導致空指針引用缺陷(NPD,null pointer dereference)。

        圖1 RL和NPD缺陷模式狀態(tài)機

        缺陷模式狀態(tài)機包含多種缺陷模式,是對所有缺陷的一種統(tǒng)稱。若要對函數(shù)內部某些具體缺陷模式檢測,需要根據(jù)其各自的狀態(tài)機實例創(chuàng)建條件,創(chuàng)建相應實例。例如根據(jù)函數(shù)中每一處資源分配創(chuàng)建一個RL狀態(tài)機實例;對每一處可能被解引用的變量創(chuàng)建一個NPD狀態(tài)機實例。

        1.2 基于缺陷模式狀態(tài)機的測試方法

        定義2:檢查點(IP,inspection point)。設P是待測程序,將缺陷模式S分成N類,類,S={S1,S2,…,Sn},每類分成K種,Si={Si1,Si2,…,SiK}, 從P中計算出和S相匹配的檢查點的集合IP={IP1,IP2,…,IPm}。

        定義3:警報點(AP,alarm point)。在IP集合中,每一條記錄由一個三元組{S,P,J}表示:S為靜態(tài)分析報告中一條記錄對應的缺陷模式。P為一個六元組,用于描述IP前5個分別表示工程名,變量名、變量出現(xiàn)的位置、文件名、行號、IP所在方法名,若兩個及以上相同變量出現(xiàn)在同一行代碼中,Index表示變量出現(xiàn)的索引。J表示對此 IP 自動確認后的結果,未進行缺陷確認前,該值為 NULL,缺陷確認后,真實缺陷(True),誤報(False Alarm)。

        現(xiàn)對選定程序P缺陷檢測,首先選定要檢測的缺陷模式種類,根據(jù)各自條件創(chuàng)建相應的狀態(tài)機實例,新創(chuàng)建的實例初始狀態(tài)為$start,且實例之間互相獨立。接著結合數(shù)據(jù)流分析,采用對控制流圖進行迭代的方法,對當前節(jié)點各個實例可能的狀態(tài)集合進行迭代。數(shù)據(jù)流分析中,數(shù)據(jù)流信息通過建立和解方程來收集方程聯(lián)系程序不同點的信息。

        基于缺陷模式狀態(tài)機的檢測過程如算法1所示,算法描述如下。

        算法1:

        輸入:程序控制流圖和缺陷模式描述狀態(tài)機

        輸出:每個控制流節(jié)點的inStateSet[n]和outStateSet[n]

        1:begin

        2:for 每個控制流節(jié)點n do

        3:inStateSet[n] ← ?/*初始化*/

        4:outStateSet[n] ← ?

        5:outStateSet[Entry] ← D{$start(Var[])} /*入口節(jié)點的初始狀態(tài)集合*/

        6:statechange ← true

        7:while statechange do begin

        8:statechange ← false

        9:for 除 Entry的每個節(jié)點n do begin

        10:nStateSet[n] ← Up∈pred[n]outStateSet[p]

        11:oldout ← outStateSet[n]

        12:outStateSet[n] ← genState[n] U(inStateSet[n]-kill[n])

        13:if outStateSet[n] ≠ oldout

        14:hen statechange ← true

        15:end

        16:end

        end

        算法1中,輸入被測程序P的控制流圖以及狀態(tài)機描述文件,得到控制流各節(jié)點輸入及輸出的實例狀態(tài)集合。其中inStateSet[n] 表示進入節(jié)點n之前的所有實例狀態(tài)集合,outStateSet[n]表示通過節(jié)點n之后所有實例狀態(tài)集合。genState[n]表示在節(jié)點n處新產生得到的所有實例狀態(tài)集合,kill[n]表示在節(jié)點n處被注銷的所有實例的狀態(tài)集合。pred[n]表示節(jié)點n的入度節(jié)點集合,即n的前驅節(jié)點。

        2 面向缺陷檢測過程的警報自動確認

        本文基于缺陷模式狀態(tài)機的檢測機理提取相關指令集,并設計了一種新的細粒度的特征提取方法,結合程序語言處理的相關技術,提升在跨工程場景下警報確認的效果。本文將該自動確認方法命名為State2Vec,共計三部分。

        State2Vec可分為以下三部分:1)基于缺陷模式狀態(tài)機的檢測機理提取相關指令集,通過提取狀態(tài)機實例沿著控制流計算過程中狀態(tài)發(fā)生改變的節(jié)點集合,得到相應的代碼段集合,稱之為相關指令集。2)設計并利用一種新的細粒度的特征提取方法,提取相關指令集所包含的細粒度的語法、語義信息。3)利用詞嵌入技術,將結構化的字符串序列映射到高維向量空間,作為神經(jīng)網(wǎng)絡的輸入,并將合適的深度學習模型與之相結合,訓練得到可以學習缺陷語義特征的深度神經(jīng)網(wǎng)絡。該方法整體流程如圖2所示。

        圖2 State2Vec工作流程

        2.1 基于缺陷模式狀態(tài)機的指令集提取方法

        目前大部分缺陷語義相關的指令集提取技術都存在以下問題——關于程序特征的指令集序列通過人工建模的方式提取,這類方法的缺陷在于人工提取的指令集較為粗糙,無法準確獲取代碼深層次的語義信息。

        本文采用面向缺陷檢測過程的指令集提取技術——將空指針引用、資源泄露等具體的程序缺陷抽象為一種缺陷模型, 通過缺陷模式狀態(tài)機的創(chuàng)建條件及程序語義確定是否創(chuàng)建該缺陷的狀態(tài)機實例,并通過在為源代碼構建的分析底層框架(控制流圖等)上迭代狀態(tài)引發(fā)狀態(tài)間的轉換檢測出程序中的潛在缺陷,在此缺陷檢測過程中,收集并提取導致狀態(tài)發(fā)生改變的控制流節(jié)點集合,這些節(jié)點對應的源代碼片段即為相關指令集。基于該原理的指令集提取過程如算法2所示。

        算法2:

        輸入 程序控制流圖和缺陷模式描述狀態(tài)機

        輸出 缺陷模式狀態(tài)機實例狀態(tài)轉換對應的控制流節(jié)點集合

        1:for n in G(N, E, Entry, Exit) do

        2:inStateSet[n] ← ?

        3:outStateSet[n] ← ? /*初始化*/

        4:end

        5:changeList ← List() /*聲明changeList用來存放狀態(tài)改變的控制流節(jié)點*/

        6:outStateSet[Entry]←D{$start(Var[])}/*入口節(jié)點的初始狀態(tài)集合*/

        7:statechange ← true

        8:while statechange do

        9:statechange ← false

        10:for 除 Entry的每個節(jié)點n do

        11:inStateSet[n] ←

        12:Up∈pred[n]outStateSet[p]13:oldout ← outStateSet[n]outStateSet[n] ← gen[n]

        14:U (inStateSet[n]-kill[n])if outStateSet[n] ≠oldout then /*滿足該條件時狀態(tài)發(fā)生改變*/

        15:statechange ← true

        16:changeList.add(n) /*將狀態(tài)改變的控制流節(jié)點放入list*/

        17:end

        18: end

        19:end

        20: return changeList

        以bad函數(shù)的源碼為例,相關指令集提取的具體細節(jié)如圖3所示。bad函數(shù)共有5個控制流節(jié)點,在節(jié)點Entry處,狀態(tài)機實例處于start狀態(tài);在節(jié)點n1處,結構體指針twoInts初始化為NULL,此時發(fā)生狀態(tài)轉換START->MAYNULL;在節(jié)點n2處,twoInts在位操作符&后發(fā)生解引用,此時狀態(tài)轉換MAYNULL->ERROR。因此,bad函數(shù)中與NPD警報相關的指令集為控制流節(jié)點n1、n2對應的代碼段。

        圖3 bad函數(shù)相關指令集提取

        2.2 基于指令集的細粒度特征提取方法

        源代碼語句中細粒度結構信息在之前的方法中往往會被忽視。為了做一個簡單的解釋,本文引入兩個C語言函數(shù)為例,如圖4所示。兩個函數(shù)都有類型聲明type declaration 語句,if語句,以及函數(shù)調用function invocation語句。兩者唯一的區(qū)別在于if語句中操作符不同,使用單一的&操作符會使表達式的兩側均被計算,從而導致NPD缺陷,正如bad函數(shù)展示的那樣。但是在good函數(shù)中,使用&&操作符可以避免NPD缺陷,當表達式左側不滿足條件時,右側將不會被計算?,F(xiàn)有的基于深度學習的方法大多只是根據(jù)上下文信息將代碼片段映射為字符串序列,這樣無法區(qū)別條件謂詞表達式中細微的區(qū)別。因此兩個函數(shù)的字符串序列表示也是一樣的,可以用序列[TYPE_DECLARATION, IF_STATEMENT, FUNCTION_INVOCATION]表示,但是它們的確認結果是完全相反的。

        圖4 兩個C語言函數(shù)

        本文提出一種新的細粒度的特征提取方法,可以準確地反映條件謂詞表達式中各操作符與操作數(shù)之間的細微區(qū)別。該方法從以下5種類型的語法樹節(jié)點中提取特征:1)Assignment Expression Node;2)Declaration Node;3)Function Invocation Node;4)SelectionStatement Node(例如 if、switch語句);5)IterationStatement Node(例如for、while語句);6)JumpStatement Node(例如return、break語句)。通過從這些節(jié)點及其子節(jié)點中提取操作符及操作數(shù),再按照表達式從左到右的順序將他們排序,最后以該順序映射為定義好的字符串序列。

        圖5列出了本文中使用的所有選定節(jié)點類型和原子指令,使用每個節(jié)點的名稱類型和原子指令作為標識符。考慮到函數(shù)和變量的名稱通常是特定于工程的,不同工程中具有相同名稱的函數(shù)可能實現(xiàn)不同的功能,為了保證跨工程確認的可行性,本文使用兩種類型名稱,表示庫函數(shù)和用戶定義函數(shù)分別標記函數(shù)調用節(jié)點而不是使用特定名稱,字符串LIBRARY_FUNCTION_INVOCATION和USER_DEFINE_FUNCTION_INVOCATION分別表示庫函數(shù)和用戶自定義函數(shù)調用。對于IP(Inspection Point)變量——在檢查點與缺陷直接相關的變量,本文用VAR_IP表示,其他變量用VAR_OTHER表示。

        圖5 各節(jié)點類型和原子指令對應字符

        以bad函數(shù)警報相關的指令集為例,將其映射為上下文相關的字符串序列,特征提取的詳細過程及結果如圖6所示。在該函數(shù)中,有一條NPD警報生成,在控制流節(jié)點n1和n2處缺陷模式狀態(tài)機實例發(fā)生狀態(tài)轉換,n1處狀態(tài)轉換為START->NULL,n2處狀態(tài)轉換為NULL->ERROR。

        圖6 相關指令集特征提取

        節(jié)點n1對應代碼行是聲明語句,對應語法樹節(jié)點Declaration Node類型,twoIntsStruct是結構體類型,twoInts是一個結構體指針,twoInts是IP變量,且初始化為NULL,因此節(jié)點n1相關指令可以映射為字符串序列{DECLARATION,STRUCT_TYPE,POINTER,VAR_IP,NULL}。

        節(jié)點n2對應代碼行是選擇語句,對應語法樹節(jié)點SelectionStatement Node類型, twoInts->intOne是其他變量,“!=”和“#”是比較操作符,“&”是位操作符,“5”是常數(shù),因此節(jié)點n2相關指令可以映射為字符串序列{IF_SELECTION,VAR_IP,NOT_EQUAL,NULL,INCLUSIVE_AND,VAR_OTHER,EQUAL,CONSTANT}。

        2.3 字符串編碼以及深度神經(jīng)網(wǎng)絡的構建和訓練

        2.3.1 字符串向量編碼

        因為字符串序列無法直接作為神經(jīng)網(wǎng)絡的輸入,需要通過詞嵌入技術將其轉換為數(shù)值向量。本文首先統(tǒng)計字符串的總類,將每一種字符串都對應一個正整數(shù)索引,從1開始。由于低維的整數(shù)無法有效描述字符串序列中的結構及上下文信息,本文將其映射到高維的向量空間,并且有著相似上下文的字符串在高維向量空間中的分布會更加接近。

        (1)

        因為Word2vec本質上也是訓練神經(jīng)網(wǎng)絡,本文采用隨機梯度下降(SGD,stochastic gradient descent)進行優(yōu)化。最終每一個字符串都被表示成了一個n維向量Rn,n的大小可以自己設置,本文將n設置為150,負采樣樣本大小k設置為100。

        由于字符串序列的長度存在差異,而神經(jīng)網(wǎng)絡的輸入要求每一個樣本的長度相同,本文需要對長度較短的序列進行填充(padding),將多個padding字符串填充在較短的序列末尾,使其長度和樣本中最長的字符串序列相同,padding字符串用n維零向量表示。

        2.3.2 訓練模型及警報自動確認

        循環(huán)神經(jīng)網(wǎng)絡(RNN,recurrent neural networks)是一個在時間上傳遞的神經(jīng)網(wǎng)絡,網(wǎng)絡的深度就是時間的長度。該神經(jīng)網(wǎng)絡是專門用來處理時間序列問題的,能夠提取時間序列的信息。如果是前向神經(jīng)網(wǎng)絡,每一層的神經(jīng)元信號只能夠向下一層傳播,樣本的處理在時刻上是獨立的。對于循環(huán)神經(jīng)網(wǎng)絡而言,神經(jīng)元在這個時刻的輸出可以直接影響下一個時間點的輸入,該神經(jīng)網(wǎng)絡能夠處理時間序列方面的問題。因此,RNN對具有序列特性的數(shù)據(jù)非常有效,它能挖掘時序信息以及語義信息,利用這種能力,使深度學習模型在解決語音識別、語言模型、機器翻譯以及時序分析等NLP領域的問題有所突破。同樣,RNN網(wǎng)絡也可以應用到程序語言處理(PLP,program language process)問題中。

        因為模型的輸入是存在上下文依賴關系的向量序列,本文選擇RNN作為基本模型,通過調整RNN的種類,具體表現(xiàn)為長短期記憶網(wǎng)絡(LSTM,long-short term memory)與門控循環(huán)單元網(wǎng)絡(GRU,gated recurrent unit)。 RNN的層數(shù)為兩層,RNN的方向為雙向,并與邏輯回歸(LR,logistic regression)分類器結合。首先把5個開源工程中所有的警報人工確認好,按照State2Vec的前兩步映射為對應的字符串序列,接著按照第三步將每種出現(xiàn)的字符串訓練為詞向量,將每一條字符串序列轉換為向量集合,并在它們末尾以零向量填充,數(shù)據(jù)集構建完成。開始進行工程內的自動確認實驗,將5個工程的數(shù)據(jù)集依次分為訓練集和測試集,再分別用5個工程的訓練集訓練,調整RNN的類型搭配,分別訓練出LSTM和GRU類型的RNN模型,再分析不同的模型在不同工程測試集內的自動確認情況。挑選出效果最好的模型,進行跨工程的實驗。因為在同一工程內,訓練集和測試集樣本的分布可以認為在同一向量空間,本文提出的細粒度的特征提取方法也是盡可能縮小不同工程間樣本在向量空間中分布的差異性。因此,在使用此特征提取方法的前提下,工程內確認效果更好的模型理論上在跨工程確認場景中也會取得更好的效果??绻こ虒嶒灥挠柧毤悄?個工程全部樣本的集合,測試集是另一個工程的全部樣本,實驗過程中依次將每個工程的全部樣本作為測試集。

        3 實驗

        3.1 實驗構建

        針對模型的構建和訓練,本文使用Pytorch框架進行實驗,版本為1.7.1,python版本為3.8.5,實驗在服務器上運行,服務器環(huán)境如下:Ubuntu 18.04.5 LTS,Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10 GHz,160 GB RAM,GPU TITAN Xp (12 GB memory)。

        3.1.1 數(shù)據(jù)準備

        本文用5個開源C工程(如表1所示)中人工標簽好的警報作為數(shù)據(jù)集,從近期的研究方法[16-18]中挑選了4個工程,它們的警報由SA工具測出,已通過人工確認打上標簽。最后,本文制作了基于android-4.0 C 語言源碼的漏洞數(shù)據(jù)庫,通過SA工具DTS[19]對其C源碼分析得到警報,再人工確認并打上標簽。這些工程代碼行數(shù)從1 991到325 164 1不等,警報數(shù)量從74到5 235不等,警報中陽性比例(確認結果為True)最小占50.0%,最大占87.3%。

        表1 5個開源C工程基本信息

        3.1.2 實驗表現(xiàn)度量元

        過去的研究[20-21]表明,當數(shù)據(jù)集中正負樣本比例不平衡時,用精準率(precision)和召回率(recall)來衡量實驗的表現(xiàn)是存在問題的,因為它們對正負樣本的分布比較敏感。同時,LR閾值(threshold)的設置也會對它們產生影響。因此,本文采用曲線下面積(AUC,area under curve)來度量模型自動確認的表現(xiàn)。

        在二分類實驗中,本文一般關注4個指標:1)真陽性(TP,true positive):數(shù)據(jù)集中本身既是缺陷也被模型預測為缺陷的警報的數(shù)量;2)假陽性(FP,false positive):數(shù)據(jù)集中本身不是缺陷卻被模型預測為缺陷的警報的數(shù)量;3)真陰性(TN,true negative):數(shù)據(jù)集中本身既不是缺陷也被模型預測為非缺陷的警報的數(shù)量;4)假陰性(FN,false negative):數(shù)據(jù)集中本身是缺陷卻被模型預測為非缺陷的警報的數(shù)量。AUC表示受試者工作特征(ROC,receiver operating characteristic)曲線下的面積,ROC曲線是基于樣本的真實類別和預測概率來畫的。具體來說,ROC曲線的x軸是假陽性率(FPR,false positive rate),y軸是真陽性率(TPR,true positive rate),F(xiàn)PR和TPR的計算見示(2)和式(3)。

        FPR=FP/(FP+TN)

        (2)

        TPR=TP/(TP+FN)

        (3)

        AUC的值在區(qū)間[0,1]內,值越接近1,說明模型的表現(xiàn)越好。若接近0.5,說明分類器近似于隨機分類。若小于0.5,這種情況說明分類器趨向把正樣本分類為負樣本,負樣本分類為正樣本。AUC的計算方法同時考慮了分類器對于正例和負例的分類能力,在樣本不平衡的情況下,依然能夠對分類器做出合理的評價。

        3.1.3 實驗參數(shù)設置

        1)詞向量訓練相關參數(shù):詞典大小是63,即一共有63種字符串。通過詞嵌入映射成的高維向量維度設置為150,學習率( LR,Learning Rate)設置為0.1,訓練時每一批數(shù)據(jù)數(shù)量為128,優(yōu)化器選擇SGD,迭代次數(shù)Epoch為5次。

        2)RNN相關參數(shù):工程內確認實驗時,對比雙層雙向LSTM和雙層雙向GRU,隱層神經(jīng)元均設置為100個。訓練時每一批數(shù)據(jù)數(shù)量為64,LR=0.01,優(yōu)化器選擇SGD,迭代次數(shù)Epoch為200次??绻こ檀_認實驗時,選擇工程內確認實驗效果較好的模型,其他參數(shù)設置不變。

        3.1.4 實驗過程

        本文先分別用5個工程進行工程內的缺陷確認實驗。采用十折交叉驗證的方法,先將每個工程的數(shù)據(jù)集均分為十份,輪流將其中九份作為訓練集,剩下一份作為測試集,共實驗十次,并取十次結果的平均值。在跨工程實驗中,訓練集是某4個工程全部樣本的集合,測試集是另一個工程的全部樣本,并依次將每個工程的全部樣本作為測試集。再訓練之前工程內實驗效果更好的一組RNN模型,計算在不同工程下的AUC值。同時,基于這些工程引入對比試驗。

        為了評價在跨工程任務上的表現(xiàn),本文挑選了兩組基準,與它們的實驗結果對比。

        1)LR:一種傳統(tǒng)的方法,基于28種通用的度量元特征,這些特征的完整定義在[22]中有詳細介紹。

        2)FRM-TL:一種基于路徑變量特征(PVC,path-variable characteristic)等級匹配的跨工程缺陷確認模型[16]。

        3.2 實驗結果及分析

        3.2.1 工程內缺陷確認實驗結果及分析

        工程內缺陷確認(WPDI,within project defect identification)反映了當數(shù)據(jù)集和驗證集在向量空間同一區(qū)域分布時,State2Vec方法的檢測結果,基于各個工程得到的AUC值如表2所示。

        表2 工程內缺陷確認實驗結果

        可以發(fā)現(xiàn),在uucp,sphinxbase和android這3個工程中,GRU組的確認效果會更好一些,而在spell和barcode這兩個工程中,LSTM組的效果更好。具體來看,spell和barcode數(shù)據(jù)集中警報數(shù)量分別為74和129,是5個數(shù)據(jù)集中最少的。樣本數(shù)量的不充足,導致模型一定程度上欠擬合,在GRU組中,spell和barcode的AUC值分別為0.750和0.762,低于LSTM組的0.796和0.805。在uucp,sphinxbase和android數(shù)據(jù)集中,警報的數(shù)量分別為545,240和5235,此時LSTM組的AUC值分別為0.818,0.807和0.865,均低于GRU組的0.843,0.816和0.887。根據(jù)該發(fā)現(xiàn)可以得出,當數(shù)據(jù)集中警報數(shù)量足夠多時,選擇GRU作為神經(jīng)網(wǎng)絡的基本單元,可以更有效地學習特征,達到更好的分類效果。在后續(xù)跨工程缺陷確認的實驗中,訓練集和驗證集的警報數(shù)量都會大幅度提升,選擇GRU作為基本單元更加符合實驗場景。

        3.2.2 跨工程缺陷確認實驗結果及分析

        跨工程缺陷確認(CPDI,cross project defect identification)反映了當訓練集和驗證集在向量空間不同區(qū)域分布時,State2Vec方法的檢測結果。將該方法與LR和FRM-TL兩組基準對比,各方法在各個工程上所得ROC曲線如圖7~11所示,并將各方法實驗結果的AUC值記錄在表3中。在表3中,若State2Vec的實驗結果好于基準FRM-TL,則將State2Vec列的數(shù)據(jù)加粗,若好于基準LR,則加入下劃線。

        表3 跨工程缺陷確認實驗結果

        圖7 uucp數(shù)據(jù)集上各方法跨工程缺陷確認ROC曲線

        圖8 spell數(shù)據(jù)集上各方法跨工程缺陷確認ROC曲線

        圖9 barcode數(shù)據(jù)集上各方法跨工程缺陷確認ROC曲線

        圖10 sphinxbase數(shù)據(jù)集上各方法跨工程缺陷確認ROC曲線

        圖11 android數(shù)據(jù)集上各方法跨工程缺陷確認ROC曲線

        可以發(fā)現(xiàn),在uucp,barcode,sphinxbase和android這4個工程中,使用State2Vec方法確認結果,AUC值分別為0.643,0.556,0.692,0.618,確認效果均好于基準FRM-TL的0.608,0.539,0.598,0.598,以及基準LR的0.561,0.546,0.525,0.559。但在工程spell中,State2Vec的AUC值為0.607,低于FRM-TL的0.637,高于LR的0.546。

        由此得出,當警報訓練集和驗證集分布在向量空間的不同區(qū)域時,State2Vec的確認效果會受到一定程度的限制。與WPDI的結果相比,CPDI的AUC值在5個工程中分別下降了23.72%,5.93%,27.03%,15.20%和30.32%。 但是與FRM-TL的CPDI表現(xiàn)相比,State2Vec方法在工程uucp,barcode以及android上確認效果均有小幅度提升,提升幅度依次為5.76%,3.15%和3.34%;在工程sphinxbase上有較大的提升,提升幅度為15.72%;但是在工程spell中,AUC值下降了4.70%,這是因為工程spell的警報數(shù)據(jù)集中僅含NPD和MLF兩種缺陷模式,而由其他4個工程構成的警報訓練集中包含多種缺陷模式,因此通過學習含有多種缺陷模式的警報數(shù)據(jù)集中的語義信息,無法準確地將所學知識遷移到目標域,導致指標AUC在工程spell的警報驗證集上下降。與LR相比,該方法在工程uucp,spell,sphinxbase,android上確認效果均有較大幅度的提升,AUC指標提升幅度依次為14.62%,12.83%,31.81%,10.55%;在工程barcode上有輕微的提升,提升幅度為1.83%。

        4 結束語

        本文提出State2Vec方法,該方法面向缺陷模式狀態(tài)機的檢測過程,先收集導致缺陷模式狀態(tài)機狀態(tài)發(fā)生改變的指令集,再通過特征提取將指令集轉換成設計好的字符串序列,最后通過詞嵌入技術將字符串映射到高維向量空間。實驗證明,State2Vec方法可以較為有效的提取不同工程中的狀態(tài)指令集,通過定義并構建結構化的可以表示指令集語法及語義信息的字符串序列,加以詞嵌入技術將字符串集合映射到高維向量空間,并以此訓練神經(jīng)網(wǎng)絡模型,使得模型能有效學習指令集中的特征,一定程度上提升了在CPDI任務場景中的泛化能力。

        在日常的開發(fā)過程中構建某新的軟件項目的警報數(shù)據(jù)庫時,通常缺少足夠的歷史數(shù)據(jù),或者能夠用于訓練模型的警報數(shù)據(jù)較為稀疏,導致無法基于同項目警報自動確認技術構建警報數(shù)據(jù)庫,此時可以采用State2Vec方法,利用歷史項目的警報數(shù)據(jù)庫構建該新項目的警報數(shù)據(jù)庫。

        在接下來的工作中,會在更多實際的工程上構建缺陷數(shù)據(jù)庫,用新的數(shù)據(jù)集檢驗本文方法的可行性,以及該方法在新的數(shù)據(jù)集上是否依舊存在較好的泛化能力。因為大多數(shù)的程序語言都有語法樹和控制流圖,也會將該方法拓展到其他程序語言上。另外,未來也考慮構建結構更復雜的神經(jīng)網(wǎng)絡模型,比如將循環(huán)神經(jīng)網(wǎng)絡與卷積神經(jīng)網(wǎng)絡(CNN,convolutional neural network)結合,使模型能夠更好的學習代碼中的語義特征,從而達到更好的分類效果。

        猜你喜歡
        指令集字符串狀態(tài)機
        3DNow指令集被Linux淘汰
        電腦報(2021年49期)2021-01-06 18:36:55
        基于有限狀態(tài)機的交會對接飛行任務規(guī)劃方法
        實時微測量系統(tǒng)指令集及解析算法
        什么是AMD64
        一種新的基于對稱性的字符串相似性處理算法
        基于覆蓋率驅動的高性能DSP指令集驗證方法
        計算機工程(2014年6期)2014-02-28 01:28:03
        依據(jù)字符串匹配的中文分詞模型研究
        一種針對Java中字符串的內存管理方案
        FPGA設計中狀態(tài)機安全性研究
        黑龍江科學(2011年2期)2011-03-14 00:39:36
        基于反熔絲FPGA的有限狀態(tài)機加固設計
        精品国产品香蕉在线| 成人免费无码视频在线网站| 精品人妻一区二区三区av | 久久久精品国产亚洲av网麻豆| 隔壁老王国产在线精品| 国产亚洲一区二区手机在线观看| av无码天堂一区二区三区| 亚洲中文字幕高清在线视频一区 | 91在线观看国产自拍| 日本免费大片一区二区| 一区二区三区人妻无码| 伊人网在线视频观看| 一区二区三区精品偷拍| 精品人妻码一区二区三区剧情| 国产成人一区二区三区影院动漫| 国产爆乳无码一区二区在线| 日本黄色高清视频久久| 狠狠躁夜夜躁人人爽超碰97香蕉| 麻豆一区二区99久久久久| 2020亚洲国产| 久久精品亚洲国产av网站| 人妻丰满熟妇无码区免费 | 久久老子午夜精品无码| 国产午夜精品久久精品| 国产精品人人做人人爽| 黄色成人网站免费无码av| 日本丰满少妇高潮呻吟| 国产自拍视频在线观看免费 | 加勒比东京热一区二区| 免费人妻精品一区二区三区| 无遮挡网站| 久久久亚洲一区二区三区| 亚洲av色香蕉一区二区三区 | 无遮挡18禁啪啪羞羞漫画| 国产女人成人精品视频| 黑人一区二区三区啪啪网站| 国产日韩厂亚洲字幕中文| 日韩制服国产精品一区| 人妻无码人妻有码不卡| 日韩人妻免费视频一专区| 亚洲人成电影在线播放|