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

?

基于標(biāo)識符的代碼影響域自動(dòng)化分析方法

2021-08-23 09:02付高生
計(jì)算機(jī)測量與控制 2021年8期
關(guān)鍵詞:標(biāo)識符隊(duì)列語句

紀(jì) 承,付高生,白 洋

(北京京航計(jì)算通訊研究所,北京 100074)

0 引言

軟件在軍隊(duì)裝備中的作用和地位日益提高,軟件質(zhì)量對軍隊(duì)?wèi)?zhàn)斗力生成有著直接影響,只有確保裝備軟件可靠、穩(wěn)定,才能保證軍隊(duì)裝備在關(guān)鍵時(shí)候發(fā)揮作用[1]。為避免因軟件故障而造成裝備無法使用的情況,軍隊(duì)對裝備軟件的可靠性和穩(wěn)定性要求極高。對裝備軟件進(jìn)行質(zhì)量評測可以大幅度提升裝備軟件的可靠性和穩(wěn)定性,因而質(zhì)量評測方法的研究對提高裝備軟件的質(zhì)量有重要意義[2]。軟件質(zhì)量評測過程中自動(dòng)化工具只能實(shí)現(xiàn)部分測試功能[3],還有較多工作是由人工操作完成。根據(jù)相關(guān)軍用軟件測試標(biāo)準(zhǔn)和規(guī)定,裝備軟件評測過程要經(jīng)過多輪迭代,不斷修正通過軟件測試發(fā)現(xiàn)的軟件問題。每一輪迭代前后的兩個(gè)版本的代碼差異較大,修改后代碼的影響域分析至關(guān)重要,目前該部分軟件評測完全依賴人工實(shí)現(xiàn)。為節(jié)約裝備軟件質(zhì)量評測所耗費(fèi)的成本和時(shí)間,在質(zhì)量評測過程中使用代碼自動(dòng)化比對工具是現(xiàn)今測試機(jī)構(gòu)廣泛使用的方法,對軟件評測自動(dòng)化工具進(jìn)行研究顯得格外重要。本文首先介紹了基于標(biāo)識符的代碼對比方法提取修改特征的流程,并介紹了基于修改特征分析影響域的代碼分析方法,然后通過實(shí)驗(yàn)證明在大型工程代碼比對工作中該分析方法有較好效果,最后就該方法的有效性和實(shí)用性進(jìn)行了分析,并對后續(xù)研究方向進(jìn)行展望。

1 相關(guān)工作

軟件評測領(lǐng)域與惡意代碼檢測、程序編譯等多個(gè)領(lǐng)域均有交集,各種方法繁雜混亂,在軟件影響域分析問題上并沒有已經(jīng)成型的方法。軟件質(zhì)量評測分析方法一般分為動(dòng)態(tài)分析方法[4]和靜態(tài)分析方法[5]兩種,動(dòng)態(tài)分析方法需要運(yùn)行程序,而靜態(tài)分析方法則是對源代碼進(jìn)行分析。代碼自動(dòng)化比對工具的分析內(nèi)容以程序源代碼為主,主要應(yīng)用靜態(tài)分析方法。代碼的靜態(tài)分析方法有很多種,一般使用較為廣泛的包括基于抽象語法樹、結(jié)構(gòu)圖、標(biāo)識符、度量值的代碼分析方法。基于抽象語法樹的代碼分析方法[6]在分析過程中引入編譯器生成的抽象語法樹,可以精準(zhǔn)的分析代碼結(jié)構(gòu)和改變,但是時(shí)間復(fù)雜度較高,不適合代碼規(guī)模較大的代碼對比?;诳刂屏鲌D的代碼分析方法[7]從代碼語義結(jié)構(gòu)角度出發(fā),分析思路與基于抽象語法樹的方法有一定相似,但是也不適合大型工程代碼比對?;跇?biāo)識符屬性特征向量相似度的代碼分析方法[8]使用了標(biāo)識符和屬性度量值兩種方法,具有時(shí)間復(fù)雜度低、容易擴(kuò)展到多種語言的特點(diǎn),但是需要根據(jù)具體問題衡量代碼分析方法的有效性?,F(xiàn)有代碼對比靜態(tài)分析方法主要從代碼語句角度分析代碼的相似度,但缺乏影響域分析等對代碼的深層邏輯分析。代碼深層邏輯分析可以挖掘軟件的隱藏隱患,更加符合軟件質(zhì)量評測工作的需求,對代碼深層邏輯分析方法的研究愈發(fā)受到重視。軟件質(zhì)量評測目前有成熟的靜態(tài)分析工具,但該工具只分析每次迭代前后的代碼變化項(xiàng),無法分析代碼變化項(xiàng)的影響域,導(dǎo)致裝備軟件迭代修改后的代碼必須作為全新代碼重新進(jìn)行整體質(zhì)量評測,耗費(fèi)大量資源和人力,影響裝備批產(chǎn)效率。因此,對裝備軟件代碼變化項(xiàng)影響域的自動(dòng)化分析方法進(jìn)行研究是有重要意義的。

2 研究內(nèi)容

2.1 數(shù)據(jù)分析

本文研究的裝備軟件程序?yàn)閏語言工程代碼,具有可靠性高、代碼較規(guī)范和規(guī)模較大的特點(diǎn)。代碼可靠性高即不需要考慮是否存在程序編譯錯(cuò)誤,裝備軟件可以直接按照可運(yùn)行的標(biāo)準(zhǔn)c語言程序處理。代碼規(guī)范整齊節(jié)省了很多數(shù)據(jù)清洗的時(shí)間,代碼使用的標(biāo)識符容易識別,不會(huì)出現(xiàn)混亂的情況,這是我們選擇基于標(biāo)識符的代碼靜態(tài)分析方法原因之一。代碼規(guī)模限制分析算法的時(shí)間復(fù)雜度,大規(guī)模c語言代碼[9]并不適合使用基于抽象語法樹[10]等分析方法,所以我們選擇時(shí)間復(fù)雜度較低的基于標(biāo)識符的代碼分析方法。

本文研究的裝備軟件程序包含多迭代版本,我們選取已經(jīng)迭代穩(wěn)定的版本作為研究數(shù)據(jù),該數(shù)據(jù)不出現(xiàn)大規(guī)模代碼修改,適合修改特征影響域分析。我們選取一個(gè)版本的程序稱為代碼A,然后選取代碼A經(jīng)過軟件質(zhì)量評測后迭代修改一次后的程序稱為代碼B,分析研究代碼A和代碼B之間的修改特征提取和修改特征影響域。代碼A和代碼B均為多文件c語言程序,代碼B是基于代碼A的修改版本,修改操作包含增、刪、改等操作。迭代情況穩(wěn)定后,代碼A和代碼B不出現(xiàn)連續(xù)10行以上的增、刪操作。代碼A和代碼B都符合標(biāo)準(zhǔn)的代碼書寫規(guī)范,我們可以直接考慮行與行之間的修改對比,而不需要考慮空行、符號、斷句不規(guī)范的問題。

2.2 基于標(biāo)識符的修改特征提取

本文提取的修改特征主要是迭代前后代碼直接變化的變量。本節(jié)首先介紹了數(shù)據(jù)清洗過程中代碼行映射關(guān)系表的構(gòu)建,然后介紹了本文使用的標(biāo)識符表的構(gòu)建方法。之后我們具體介紹了提取修改特征過程中,先提取代碼A和代碼B行對應(yīng)狀態(tài),再依據(jù)對應(yīng)狀態(tài)提取變量變化情況的方法。最后我們介紹了特殊標(biāo)識符(for、if、return等)的修改特征提取。

2.2.1 數(shù)據(jù)清洗

代碼A和代碼B都是標(biāo)準(zhǔn)的裝備軟件程序,我們不需要考慮代碼中出現(xiàn)錯(cuò)誤語句、缺失語句等造成程序編譯錯(cuò)誤的問題,也不需要考慮代碼中出現(xiàn)多余語句、無效語句等需要修改源代碼的情況。對代碼A和代碼B的數(shù)據(jù)清洗[11]主要是除去代碼中的注釋、多余的空格和空號。程序數(shù)據(jù)清洗后會(huì)與數(shù)據(jù)清洗前代碼出現(xiàn)行對應(yīng)變化,為方便修改特征與源代碼一一對應(yīng),我們構(gòu)建了數(shù)據(jù)清洗行映射關(guān)系表,該映射關(guān)系表記錄了代碼數(shù)據(jù)清洗前后代碼行對應(yīng)關(guān)系。

2.2.2 標(biāo)識符表

構(gòu)建代碼A和代碼B的標(biāo)識符表以用于提取代碼修改特征。代碼A和代碼B均為同類型的代碼,我們可以以相同的方法為代碼A和代碼B構(gòu)建標(biāo)識符表。我們提取的修改特征主要為變量賦值變化,以修改特征提取需求設(shè)計(jì)3個(gè)標(biāo)識符表:類型表、函數(shù)表、變量表。

類型表存儲c語言程序中變量和函數(shù)的類型,在構(gòu)建函數(shù)表和變量表的時(shí)候可以以類型表中標(biāo)識符為索引進(jìn)行檢索。首先在類型表中加入常用的變量類型(int、char、double、float等)以及函數(shù)特有的類型void,可根據(jù)程序加入long long int、short等變量類型。然后,我們在類型表中加入c語言程序的自定義類型,依次加入結(jié)構(gòu)體、枚舉、聯(lián)合體等類型。以結(jié)構(gòu)體為例,我們以struct標(biāo)識符在代碼中檢索結(jié)構(gòu)體聲明位置,將結(jié)構(gòu)體名記錄到類型表中以供后續(xù)使用。在后續(xù)研究中我們將按照統(tǒng)一方式使用類型表中的標(biāo)識符,不區(qū)分常用類型和自定義類型。

函數(shù)表存儲程序中定義的函數(shù),在修改特征提取和影響域分析過程中均會(huì)使用函數(shù)表。我們記錄函數(shù)名為標(biāo)識符,并記錄函數(shù)類型、起始位置、終止位置,在后續(xù)需要分析函數(shù)變化的時(shí)候可以直接檢索到函數(shù)位置。

變量表存儲程序中定義的變量,以類型表中標(biāo)識符檢索變量聲明位置,我們記錄變量名為標(biāo)識符,并記錄變量類型、變量所屬函數(shù)、變量聲明位置,不考慮未聲明直接使用的變量。我們對指針變量和數(shù)組亦做特殊處理,然后存入變量表中作為標(biāo)識符使用。指針變量可以直接在變量名前增加“*”作為標(biāo)識符,不影響后續(xù)使用。數(shù)組提前數(shù)組名作為標(biāo)識符存入變量表,記錄特殊數(shù)組標(biāo)記以在后續(xù)使用時(shí)進(jìn)行特殊處理。結(jié)構(gòu)體等自定義類型變量在記錄標(biāo)識符時(shí)不做特殊處理,在后續(xù)使用時(shí)再進(jìn)行特殊處理。

2.2.3 修改特征提取

本文提取的修改特征是在代碼A和代碼B之間對比提取修改、增加和刪除的代碼。由于代碼A和代碼B不出現(xiàn)大篇幅修改,我們先對比代碼A和代碼B行變化情況,再逐行對比代碼A和代碼B每行變量變化的情況。

行變化情況包括修改、增加、刪除3種狀態(tài),再考慮行未發(fā)生改變的狀態(tài),我們設(shè)置4種行對應(yīng)狀態(tài)來描述代碼A和代碼B各行對應(yīng)狀態(tài)。如果只考慮未發(fā)生改變和修改兩種狀態(tài),代碼A中每一行均可在代碼B中尋得,即代碼A和代碼B是逐行對應(yīng)的,并且從代碼開始到結(jié)束按順序逐一對應(yīng)。增加和刪除兩種狀態(tài)影響了代碼按順序逐一對應(yīng)的關(guān)系,并且增加或者刪除的行可能和未發(fā)生改變或者修改的行產(chǎn)生歧義,即兩行代碼相似度非常高,影響行對應(yīng)狀態(tài)。

本文提出了一種基于行相似度匹配的滑動(dòng)窗口方法,實(shí)現(xiàn)了代碼行對應(yīng)狀態(tài)逐一對應(yīng)關(guān)系檢測。由于代碼不出現(xiàn)連續(xù)10行以上的增、刪操作,我們設(shè)置一個(gè)窗口長度為10的滑動(dòng)窗口,將代碼B逐行放入窗口隊(duì)列中。然后從上往下逐行將代碼A與窗口隊(duì)列中每一行代碼匹配,完全一致的代碼認(rèn)為行匹配成功,記錄匹配信息的同時(shí)更新窗口隊(duì)列;不完全匹配的代碼則記錄代碼相似度,等待進(jìn)一步處理。相似度可通過動(dòng)態(tài)規(guī)劃算法計(jì)算兩行代碼的最長公共子串得到。在代碼A和代碼B匹配完成后,我們得到一個(gè)已確定未發(fā)生改變狀態(tài)的匹配對應(yīng)關(guān)系,然后我們將其中不完全匹配的對應(yīng)關(guān)系按照相似度確定修改、增加、刪除3種狀態(tài)。遍歷匹配對應(yīng)關(guān)系中不完全匹配的關(guān)系,如果存在相似度高于預(yù)設(shè)闕值且沒有已經(jīng)匹配到的修改狀態(tài)對應(yīng)關(guān)系的兩行,我們可以將其設(shè)置為修改狀態(tài)對應(yīng)關(guān)系;然后將代碼A中剩余行設(shè)置為刪除狀態(tài);代碼B中剩余行設(shè)置為增加狀態(tài)。通過上述方法我們獲取了代碼A和代碼B按順序逐一對應(yīng)的行狀態(tài)。該方法具體流程如圖1所示。

圖1 基于行相似度匹配的滑動(dòng)窗口方法

在代碼A和代碼B行對應(yīng)狀態(tài)確定之后,我們通過標(biāo)識符識別提取代碼A和代碼B的修改特征,在本小節(jié)我們主要提取賦值語句中代碼修改的情況,記錄修改內(nèi)容和修改位置(行號)。首先構(gòu)建3個(gè)標(biāo)識符表,考慮到裝備軟件程序?yàn)槎辔募語言程序,我們首先建立代碼A和代碼B的文件調(diào)用關(guān)系,即檢索每個(gè)文件的首部是否調(diào)用其他文件。然后我們依次構(gòu)建每個(gè)文件的類型表、函數(shù)表、變量表,在每個(gè)表構(gòu)建完成后均要按照文件調(diào)用關(guān)系進(jìn)行標(biāo)識符表通信,將每個(gè)文件所引用的標(biāo)識符加入該文件對應(yīng)的標(biāo)識符表中。然后遍歷代碼A和代碼B提取發(fā)生改變的賦值語句中修改的代碼,未發(fā)生改變狀態(tài)的代碼不存在改變的語句,遍歷過程中可以直接跳過。代碼A中刪除狀態(tài)的語句和代碼B中增加狀態(tài)的語句可以直接記錄修改特征。修改狀態(tài)的行需要先進(jìn)行斷句,然后判斷對應(yīng)的賦值語句是否存在或者是否發(fā)生變化,不同的分別在代碼A和代碼B記錄修改特征。經(jīng)過上述處理,我們在代碼A和代碼B中分別記錄了其修改特征。

2.2.4 特殊標(biāo)識符

在本小節(jié)我們將提取幾類特殊標(biāo)識符的修改特征。特殊標(biāo)識符的修改特征與賦值語句修改特征方法不完全相同,我們針對循環(huán)語句、條件語句和return等特殊標(biāo)識符提出了不同的提取方法。

循環(huán)語句(標(biāo)識符for、while)分為循環(huán)體和循環(huán)條件兩部分,循環(huán)體內(nèi)修改特征按照普通修改特征處理。循環(huán)條件的發(fā)生變化時(shí),我們記錄循環(huán)條件發(fā)生的變化以及變化的位置。

標(biāo)識符為if的條件語句處理方法與循環(huán)語句相似,如果條件變化則記錄條件語句修改特征。但是條件語句需要額外考慮在if后出現(xiàn)的else if和else標(biāo)識符。標(biāo)識符else if處理方法與if相同,標(biāo)識符else則需考慮條件語句if和else if的條件是否變化,如果變化則在else處記錄條件語句修改特征。

其他特殊標(biāo)識符種類很多,大部分需要依據(jù)代碼需求專門處理,我們主要提及兩個(gè)常用的標(biāo)識符return和define處理。標(biāo)識符return主要出現(xiàn)在函數(shù)當(dāng)中,用于函數(shù)的返回值,如果函數(shù)的返回值發(fā)生變化,我們對該函數(shù)記錄下來該函數(shù)名和修改位置。標(biāo)識符define是c語言程序中的宏定義,如果宏定義語句出現(xiàn)變化,我們可以將宏定義定義的標(biāo)識符加入變量表,按照變量進(jìn)行處理,并直接記錄其修改特征。

2.3 修改特征影響域分析

修改特征提取只是對代碼變化的直接處理,而影響域分析是基于代碼邏輯對代碼變化深層影響的分析,所以影響域分析是我們對代碼進(jìn)行深層次的邏輯分析,挖掘裝備軟件每次迭代對程序造成的影響。本節(jié)依次介紹了基層影響域和多層影響域的分析方法,然后提出了基于標(biāo)識符檢測隊(duì)列的影響域分析方法,該方法可以實(shí)現(xiàn)復(fù)雜的裝備軟件影響域分析。

2.3.1 基于修改特征的影響域確定

基于修改特征的影響域是指在修改特征提取過程中未提取到修改特征,但受到修改特征影響的變量,我們主要記錄受到影響的標(biāo)識符(主要為變量名)和位置。本文的修改特征是代碼中出現(xiàn)變化的賦值語句、條件語句等,依據(jù)不同類型的修改特征需要分別確定影響域。本文修改特征主要記錄的是賦值語句中修改的代碼和修改位置,影響域?yàn)橘x值語句中被賦值的變量。

特殊標(biāo)識符的修改特征需要特殊處理以確定影響域。循環(huán)語句修改特征是循環(huán)條件的變化,循環(huán)體內(nèi)所有變量均可能因循環(huán)條件的變化而受到影響,所以影響域?yàn)檠h(huán)體內(nèi)所有賦值語句被賦值的變量。條件語句影響域與循環(huán)語句一樣,只是需要分別考慮if、else if和else三種。標(biāo)識符return用于函數(shù)的返回值,如果函數(shù)的返回值發(fā)生變化,即檢測到return后內(nèi)容發(fā)生變化,調(diào)用該函數(shù)的代碼均會(huì)產(chǎn)生影響,所以return標(biāo)識符修改特征的影響域?yàn)檎{(diào)用該函數(shù)的所有賦值語句的被賦值變量。

2.3.2 多層影響域分析

在上小節(jié)中我們介紹了基于修改特征的影響域確定,該影響域?yàn)樾薷奶卣髦苯哟_定的第一層影響域,我們稱其為基層影響域。代碼中可能出現(xiàn)不是修改特征或者基層影響域,但是程序運(yùn)行過程中受基層影響域影響可能出現(xiàn)變化的變量,我們把該種情況的分析過程稱為多層影響域分析。多層影響域我們主要記錄多層影響域的標(biāo)識符(主要為變量名)、位置和分析層數(shù)。相較于基層影響域分析,多層影響域分析邏輯相對復(fù)雜,且可能出現(xiàn)特殊循環(huán)情況。

多層影響域分析是以基層影響域分析為基石,進(jìn)行整個(gè)程序的影響域分析。基層影響域記錄的為變量標(biāo)識符,我們按照變量類型確定基層影響域中每個(gè)標(biāo)識符影響的代碼,仿照基層影響域分析第二層影響域,記錄變量標(biāo)識符和位置,然后重復(fù)上述方法可得多層影響域。變量分為局部、全局、跨文件變量3種類型,變量類型可以通過查詢變量表確定。局部變量只需在聲明函數(shù)里考慮影響域,全局變量則在聲明文件中考慮影響域,跨文件變量在所有文件中都可能受到影響。多文件代碼全局變量需額外考慮出現(xiàn)跨文件調(diào)用全局變量的情況,我們在變量表建立過程中已經(jīng)進(jìn)行過跨文件情況的全局變量通信,只需在影響域檢測過程中檢測引用到的其他文件全局變量即可。

裝備軟件中出現(xiàn)的干擾影響域分析的循環(huán)情況主要包含代碼循環(huán)和邏輯循環(huán)兩種。代碼循環(huán)是在c語言程序中出現(xiàn)的變量交互影響,即在某一位置變量a影響變量b,然后在后續(xù)代碼中變量b又影響變量a,或者多個(gè)變量交互影響的情況,在影響域分析過程中需要特殊處理。邏輯循環(huán)出現(xiàn)在c語言程序中經(jīng)常使用遞歸的方法,主要以遞歸函數(shù)為主,在遞歸函數(shù)中很容易出現(xiàn)一變量發(fā)生改變,并且傳遞到下一次遞歸中,這樣會(huì)出現(xiàn)無窮多層影響域,也需要特殊處理。對代碼中標(biāo)記已檢測的位置并不能很好地解決特殊循環(huán)問題,因?yàn)閏語言程序中的遞歸很多,所以我們提出了一種解決影響域分析過程中特殊循環(huán)情況的方法。我們每次進(jìn)行一層影響域的分析,在后續(xù)影響域分析過程中,對代碼中已經(jīng)標(biāo)記影響域的位置,我們要檢測新影響域變量標(biāo)識符是否與已有影響域記錄的標(biāo)識符完全相同,如果相同則不會(huì)開啟新一層影響域分析。在下一小節(jié)中我們敘述了通過標(biāo)識符檢測隊(duì)列應(yīng)用該策略解決特殊循環(huán)情況,保證多層影響域分析的可行性。

2.3.3 基于標(biāo)識符檢測隊(duì)列的影響域分析

裝備軟件修改特征影響域分析既包含了從修改特征中分析基層影響域,又包含了從基層影響域分析多層影響域。多層影響域的分析邏輯相當(dāng)復(fù)雜,時(shí)間復(fù)雜度、空間復(fù)雜度都比較高,我們提出了一種基于標(biāo)識符檢測隊(duì)列的影響域分析方法,在降低了時(shí)間、空間復(fù)雜度的情況下準(zhǔn)確分析了多層影響域,適合于裝備軟件修改特征影響域分析。

基于標(biāo)識符檢測隊(duì)列的影響域分析用檢測隊(duì)列存儲多層影響域分析中改變的變量,從程序運(yùn)行邏輯的角度進(jìn)行影響域分析,將多層影響域分析的樹形邏輯轉(zhuǎn)化為線性邏輯。依據(jù)裝備軟件c語言程序特點(diǎn),c語言程序的main函數(shù)一般是程序啟動(dòng)的入口,并且main函數(shù)可以控制程序調(diào)用其他函數(shù)。如果以main函數(shù)為分析的起始點(diǎn),可以遵從程序運(yùn)行的規(guī)則,避免盲目檢索過程中重復(fù)分析不必要片段的操作。我們依據(jù)程序運(yùn)行邏輯依次檢測main函數(shù)和其他調(diào)用函數(shù),在每個(gè)函數(shù)內(nèi)進(jìn)行影響域分析,然后通過檢測隊(duì)列通訊實(shí)現(xiàn)函數(shù)之間的影響域分析。我們在每個(gè)函數(shù)內(nèi)建立了兩個(gè)標(biāo)識符檢測隊(duì)列,分別為局部檢測隊(duì)列和全局檢測隊(duì)列。局部檢測隊(duì)列主要存儲影響域分析過程中記錄的局部變量,并且該函數(shù)影響域分析結(jié)束后清空該隊(duì)列。全局檢測隊(duì)列中既要存儲全局變量,又要存儲跨文件變量。全局檢測隊(duì)列不僅作用于某一函數(shù)的影響域分析,還和其他函數(shù)的影響域分析有關(guān)。

基于標(biāo)識符檢測隊(duì)列的影響域分析主要包含以下幾個(gè)步驟。1)遍歷代碼,依據(jù)修改特征確定基層影響域;2)在c語言程序中找到main函數(shù)并加入待檢測函數(shù),以main函數(shù)為函數(shù)分析的起始點(diǎn)進(jìn)行影響域分析,初始化標(biāo)識符檢測隊(duì)列;3)遍歷待檢測函數(shù)中函數(shù)的代碼,將基層影響域中的變量加入標(biāo)識符檢測隊(duì)列;同時(shí)依據(jù)標(biāo)識符檢測隊(duì)列中標(biāo)識符判斷該行代碼是否受影響,受影響則進(jìn)行影響域分析將結(jié)果加入標(biāo)識符檢測隊(duì)列,此即為多層影響域分析。為解決循環(huán)問題,我們在將變量加入標(biāo)識符檢測隊(duì)列時(shí),先檢測標(biāo)識符檢測隊(duì)列中是否已有該變量,重復(fù)則不加入;4)在遍歷代碼過程中檢測到調(diào)用函數(shù)的情況,將調(diào)用函數(shù)加入待檢測函數(shù),并將全局檢測隊(duì)列傳遞到該函數(shù)影響域分析過程中使用的全局檢測隊(duì)列中,重復(fù)第三步。為解決循環(huán)問題,我們記錄每個(gè)函數(shù)已經(jīng)分析過的標(biāo)識符檢測隊(duì)列為歷史記錄,如果再次調(diào)用該函數(shù)時(shí),標(biāo)識符檢測隊(duì)列與歷史記錄相同,則不再重復(fù)對該函數(shù)檢測?;跇?biāo)識符檢測隊(duì)列的影響域分析具體流程如圖2所示。

圖2 基于標(biāo)識符檢測隊(duì)列的影響域分析

3 實(shí)驗(yàn)結(jié)果與分析

本節(jié)敘述了本文的實(shí)驗(yàn)設(shè)置和結(jié)果。本文進(jìn)行了兩個(gè)實(shí)驗(yàn),功能實(shí)驗(yàn)以自行設(shè)計(jì)的代碼為測試數(shù)據(jù)測試了基于標(biāo)識符修改特征的提取方法和基于標(biāo)識符檢測隊(duì)列的影響域分析方法,展示了本文方法的檢測結(jié)果;公開數(shù)據(jù)集實(shí)驗(yàn)采用公開數(shù)據(jù)集,驗(yàn)證了本文提出的方法在裝備軟件質(zhì)量評測工作中的有效性。

3.1 功能實(shí)驗(yàn)

功能實(shí)驗(yàn)分塊測試了基于標(biāo)識符的修改特征提取方法和基于標(biāo)識符檢測隊(duì)列的影響域分析方法。修改特征分別設(shè)立了增加、刪除、修改3種,影響域分析分別設(shè)立了賦值語句、條件語句、函數(shù)調(diào)用、跨文件調(diào)用4個(gè)模塊的測試。功能實(shí)驗(yàn)數(shù)據(jù)集為自行設(shè)計(jì)的c語言程序,分為版本1和版本2,每個(gè)版本有main.c和test.c兩個(gè)文件,文件詳細(xì)內(nèi)容見附錄。運(yùn)行檢測程序,實(shí)驗(yàn)運(yùn)行時(shí)間不超過1 s,程序運(yùn)行結(jié)果如圖3所示。

圖3 功能實(shí)驗(yàn)結(jié)果

圖3中thisIsOld和thisIsNew分別為版本1和版本2的分析結(jié)果,因代碼修改中存在增加和刪除,版本1和版本2的分析結(jié)果不一一對應(yīng)。實(shí)驗(yàn)輸出為行號和影響域內(nèi)容(下文我們用{行號,修改內(nèi)容}表示),分析結(jié)果的基層影響域如圖3(a)和多層影響域如圖3(b)。在main.c的test1函數(shù)中設(shè)置了賦值語句修改特征,依據(jù)修改特征實(shí)驗(yàn)得到基層影響域{7,a}和多層影響域{8,b}{9,c}。在main.c的test2函數(shù)中設(shè)置了條件語句修改特征,依據(jù)修改特征實(shí)驗(yàn)得到基層影響域{19,temp}和多層影響域{21,result}。在main.c的test3函數(shù)中設(shè)置了修改特征影響函數(shù)調(diào)用過程中的形參和return,依據(jù)修改特征實(shí)驗(yàn)得到基層影響域{34,x}和受形參影響的多層影響域{26,result}、受return影響的{36,z}。在main.c的test4函數(shù)中設(shè)置了跨文件調(diào)用test.c的函數(shù),依據(jù)修改特征實(shí)驗(yàn)得到基層影響域{7,c}{8,c}和多層影響域{8,c}{9,d}{10,e}。

在功能實(shí)驗(yàn)中我們檢測出了所有設(shè)置的修改特征,并且分析出可能受影響的變量標(biāo)識符,準(zhǔn)確率達(dá)100%。依據(jù)上述功能實(shí)驗(yàn)結(jié)果我們得出結(jié)論,以本文提出的修改特征提取和影響域分析方法設(shè)計(jì)的檢測程序可以實(shí)現(xiàn)賦值語句、條件語句、函數(shù)調(diào)用、跨文件調(diào)用等情況下C語言程序的影響域分析。

3.2 公開數(shù)據(jù)集實(shí)驗(yàn)

公開數(shù)據(jù)集實(shí)驗(yàn)以公開數(shù)據(jù)集https://github.com/antirez/sds中sds.c、sds.h、sdsalloc.h、testhelp.h為版本3程序,設(shè)置少量修改為版本4程序,對版本3和版本4代碼進(jìn)行影響域分析。版本3程序修改具體內(nèi)容如表1所示運(yùn)行檢測程序,運(yùn)行時(shí)間不超過1 s,程序運(yùn)行結(jié)果如表2所示。

表1 公開數(shù)據(jù)集修改表

表2 公開數(shù)據(jù)集影響域分析結(jié)果

在公開數(shù)據(jù)集實(shí)驗(yàn)中,我們以公開數(shù)據(jù)集為數(shù)據(jù)測試了基于標(biāo)識符的修改特征提取方法和基于標(biāo)識符檢測隊(duì)列的影響域分析方法。公開數(shù)據(jù)集實(shí)驗(yàn)基層影響域共檢測到4個(gè),多層影響域共檢測到38個(gè),其中錯(cuò)誤識別數(shù)量為6個(gè),實(shí)驗(yàn)結(jié)果準(zhǔn)確率為85.7%。對實(shí)驗(yàn)結(jié)果分析,實(shí)驗(yàn)中錯(cuò)誤識別影響域的原因是檢測程序的檢測規(guī)則設(shè)定不完善,可以按照c語言規(guī)則繼續(xù)完善。公開數(shù)據(jù)集實(shí)驗(yàn)驗(yàn)證了本文提出的方法在大型工程C語言程序中的有效性。

4 結(jié)束語

軟件質(zhì)量評測的自動(dòng)化可以大幅提高評測效率,是未來裝備軟件質(zhì)量評測發(fā)展的主要方向。本文提出的基于標(biāo)識符的修改特征提取方法和基于標(biāo)識符檢測隊(duì)列的影響域分析方法自動(dòng)化實(shí)現(xiàn)了裝備軟件修改特征提取和影響域分析,在質(zhì)量評測領(lǐng)域提出了一種有效的影響域分析方法,推進(jìn)了裝備軟件質(zhì)量評測自動(dòng)化。在后續(xù)的工作中,將軟件影響域分析與其他自動(dòng)化分析工具相結(jié)合,實(shí)現(xiàn)裝備軟件質(zhì)量評測的全面自動(dòng)化,是我們后續(xù)研究的重點(diǎn)內(nèi)容。

猜你喜歡
標(biāo)識符隊(duì)列語句
基于底層虛擬機(jī)的標(biāo)識符混淆方法
DOI標(biāo)識符查找文獻(xiàn)的方法
隊(duì)列隊(duì)形體育教案
隊(duì)列里的小秘密
基于多隊(duì)列切換的SDN擁塞控制*
基于區(qū)塊鏈的持久標(biāo)識符系統(tǒng)①
DOI標(biāo)識符查找文獻(xiàn)的方法
在隊(duì)列里
我喜歡
冠詞缺失與中介語句法損傷研究