葛紅美,徐 超+,何炎祥
1.南京審計(jì)大學(xué) 工學(xué)院,南京 211815
2.武漢大學(xué) 計(jì)算機(jī)學(xué)院,武漢 430072
嵌入式系統(tǒng)主要以應(yīng)用控制為主,根據(jù)具體的應(yīng)用需求來(lái)制定系統(tǒng)的功能、結(jié)構(gòu)、體積、組成等,具有系統(tǒng)內(nèi)核小、專用性強(qiáng)、運(yùn)行環(huán)境復(fù)雜、系統(tǒng)集成度高、運(yùn)行穩(wěn)定可靠、時(shí)效性高等特點(diǎn)[1-2]。隨著信息時(shí)代的高速發(fā)展,嵌入式系統(tǒng)得到了最為廣泛的應(yīng)用。小到電子手表、家用電器、自助取款機(jī),大到汽車、火車、飛機(jī)、火箭,嵌入式系統(tǒng)已經(jīng)深入到經(jīng)濟(jì)、教育、科技和軍事的方方面面[3]。
對(duì)于嵌入式系統(tǒng)而言,可靠性是不容忽視的重要問(wèn)題。嵌入式系統(tǒng)一旦出現(xiàn)故障,將會(huì)嚴(yán)重威脅到人們的生命財(cái)產(chǎn)和國(guó)防安全。在美國(guó),僅僅因?yàn)橐幻秲r(jià)值45美分的極小的集成電路失效,令北美防空聯(lián)合司令部指揮中心兩次發(fā)出虛假的進(jìn)攻警報(bào),造成一千枚洲際彈道導(dǎo)彈處于初級(jí)戒備狀態(tài),全體軍官待命,多架戰(zhàn)斗機(jī)起飛。在歐洲,由于火箭設(shè)計(jì)師們忽略了軟件的可靠性,只重視火箭硬件的可靠性設(shè)計(jì),導(dǎo)致火箭慣性制導(dǎo)系統(tǒng)軟件出現(xiàn)規(guī)格和設(shè)計(jì)錯(cuò)誤,造成阿里亞那火箭升空40秒后自爆,損失5億英鎊。在美國(guó),1983年科羅拉多州洪水泛濫,正是由于計(jì)算機(jī)發(fā)出錯(cuò)誤預(yù)告,導(dǎo)致水庫(kù)被沖垮。在意大利,由于計(jì)算機(jī)設(shè)備存在故障,國(guó)家數(shù)據(jù)庫(kù)被破壞6秒鐘,需要6年才能修復(fù)。在中國(guó),2011年7月23日甬溫線發(fā)生動(dòng)車追尾事故,由于信號(hào)設(shè)備存在安全故障,造成35死210傷的悲劇。從以上事例可以看出,系統(tǒng)軟件的安全性、可靠性在嵌入式系統(tǒng)中占重要地位,如何加強(qiáng)嵌入式系統(tǒng)可靠性具有十分重要的研究?jī)r(jià)值,如何提高嵌入式系統(tǒng)的可靠性已經(jīng)成為不容忽視的重要問(wèn)題。
嵌入式系統(tǒng)軟件的可靠性是系統(tǒng)中非常重要的組成部分。隨著嵌入式系統(tǒng)智能化程度的不斷增強(qiáng),嵌入式系統(tǒng)越來(lái)越復(fù)雜,其實(shí)現(xiàn)方式已由初始的匯編實(shí)現(xiàn)改為了高級(jí)語(yǔ)言(主要是C語(yǔ)言)實(shí)現(xiàn)。因此,要加強(qiáng)嵌入式系統(tǒng)的可靠性,首先必須對(duì)代碼進(jìn)行加強(qiáng),即提升代碼的可靠性,減少漏洞。
本文以編譯前端的語(yǔ)法語(yǔ)義分析為基礎(chǔ),結(jié)合構(gòu)件化技術(shù),提出了一種多層次迭代分析可構(gòu)件化代碼識(shí)別方法。該方法對(duì)C語(yǔ)言實(shí)現(xiàn)的嵌入式系統(tǒng)源代碼進(jìn)行分析,通過(guò)對(duì)比當(dāng)前源代碼和可靠構(gòu)件代碼的相似性,找出其中相似度高的代碼塊。然后借助于人機(jī)交互技術(shù),將其中某些未經(jīng)驗(yàn)證的程序轉(zhuǎn)為可靠構(gòu)件的實(shí)現(xiàn),利用可靠構(gòu)件的可靠性獲得源代碼可靠性的加強(qiáng)。
本文組織結(jié)構(gòu)如下:第2章介紹了編譯前端分析技術(shù)和構(gòu)件化方法的相關(guān)背景知識(shí);第3章重點(diǎn)闡述了基于編譯前端分析自動(dòng)構(gòu)件化代碼加強(qiáng)方法;第4章通過(guò)模擬實(shí)驗(yàn)驗(yàn)證了可靠性加強(qiáng)方法的效果;最后對(duì)全文進(jìn)行了總結(jié)。
由于源程序是嵌入式系統(tǒng)軟件的基本輸入,源程序本身的可靠程度直接決定了最終生成的目標(biāo)代碼的質(zhì)量。而編譯前端通過(guò)語(yǔ)法語(yǔ)義分析,掌握了源代碼結(jié)構(gòu)和語(yǔ)義的全面信息,是對(duì)源程序較為全面的一種分析技術(shù),因此不少學(xué)者以編譯器為基礎(chǔ),對(duì)源代碼加強(qiáng)方法進(jìn)行研究。目前的研究主要集中于代碼安全漏洞防范和代碼安全屬性證明這兩方面。
2.1.1 代碼漏洞防范技術(shù)
此類研究主要針對(duì)代碼中某種常見的安全漏洞,通過(guò)在編譯過(guò)程中對(duì)代碼進(jìn)行修改,來(lái)防范安全漏洞可能引發(fā)的惡意攻擊。此類研究具有代表性的就是針對(duì)最常見的緩沖區(qū)溢出攻擊的StackGuard[4]和StackShield[5]方法。StackGuard通過(guò)編譯過(guò)程對(duì)程序進(jìn)行修改,使其每次在調(diào)用函數(shù)時(shí),將返回地址壓棧后,再將一個(gè)隨機(jī)產(chǎn)生字壓棧。當(dāng)函數(shù)調(diào)用完畢后,查看此隨機(jī)字是否被修改,若改動(dòng),說(shuō)明有溢出攻擊發(fā)生,則報(bào)警并停止程序運(yùn)行。StackShield使用了另一種技術(shù),它更改程序使其在運(yùn)行時(shí)創(chuàng)建一個(gè)特別的堆棧,用來(lái)存儲(chǔ)函數(shù)返回地址的一份拷貝,并在受保護(hù)的函數(shù)開頭和結(jié)尾分別增加一段代碼,開頭處代碼用來(lái)將函數(shù)返回地址拷貝到這個(gè)特殊堆棧中,而結(jié)尾處代碼則用來(lái)將返回地址從特殊堆棧中拷貝回原程序運(yùn)行堆棧。
代碼安全屬性證明方法研究主要針對(duì)編譯過(guò)程中程序的可靠性證明問(wèn)題。其最具代表性的工作就是由Carnegie Mellon大學(xué)的Necula和Lee提出的攜帶證明的代碼(proof carrying code,PCC)[6-7],此方法主要用于驗(yàn)證代碼是否遵循預(yù)先定義的某些安全性條件。PCC提出了一種程序驗(yàn)證框架,首先在代碼發(fā)送方,根據(jù)用戶所提安全條件,對(duì)代碼進(jìn)行分析,產(chǎn)生一種安全形式化證明信息,并將此信息“證書”附加于原始代碼上形成攜帶證明的代碼;在代碼接收方,根據(jù)相同安全條件,參照PCC中的“證書”,對(duì)代碼進(jìn)行驗(yàn)證,如果通過(guò)驗(yàn)證,則認(rèn)為此代碼是可靠的,允許執(zhí)行。PCC中安全條件均采用一階邏輯謂詞進(jìn)行描述,證明過(guò)程采用邏輯推理的方法,代碼驗(yàn)證通過(guò)類型檢查機(jī)制實(shí)現(xiàn)。PCC主要用于移動(dòng)通信中代碼的驗(yàn)證。PCC對(duì)源代碼沒有做任何修改,只是將安全性證明信息附加在代碼中,供代碼使用者驗(yàn)證所用。但是PCC存在“證書”代碼量過(guò)大的問(wèn)題,一般為待驗(yàn)證代碼量的3到7倍,嚴(yán)重影響了驗(yàn)證效率。與PCC相似,Cornell大學(xué)的Kozen帶領(lǐng)的研究小組提出了ECC(efficient code certification)[8-9],一種簡(jiǎn)單有效的程序驗(yàn)證方法。ECC也可以看作是一種攜帶證明的代碼驗(yàn)證方法,只是它的“證書”不是完整的形式化證明過(guò)程,而只是一些證明的引導(dǎo)信息。ECC可以保證通過(guò)驗(yàn)證的代碼具有控制流安全、內(nèi)存安全、堆棧安全等特性。最重要的是,ECC可采用對(duì)已有編譯器進(jìn)行修改的方式實(shí)現(xiàn)。雖然ECC對(duì)代碼安全性的描述能力沒有PCC強(qiáng),但是其證明過(guò)程更加簡(jiǎn)單,驗(yàn)證過(guò)程效率更高。該類方法還可以應(yīng)用于編譯器本身的可靠性驗(yàn)證、編譯優(yōu)化可靠性驗(yàn)證以及運(yùn)行嵌入式系統(tǒng)可靠性加強(qiáng)[10-18]。
2.1.2 構(gòu)件化
構(gòu)件化開發(fā)是將一個(gè)個(gè)相對(duì)獨(dú)立的、被充分證明為可靠的構(gòu)件,通過(guò)給定的標(biāo)準(zhǔn)接口進(jìn)行組裝,形成滿足對(duì)應(yīng)功能軟件的開發(fā)方法。它不但能有效提升軟件開發(fā)效率,而且由于每個(gè)構(gòu)件已經(jīng)經(jīng)過(guò)了充分驗(yàn)證,有效避免了不同軟件開發(fā)人員由于個(gè)人編程經(jīng)驗(yàn)不足而導(dǎo)致的不可靠性,使得生成的軟件具有較高的質(zhì)量。不少國(guó)內(nèi)外公司和組織制定了相應(yīng)的構(gòu)件標(biāo)準(zhǔn),如微軟的COM、Oracle的JavaBean、OMG組織的CORBA(common object request broker architecture)等。
但構(gòu)件是嚴(yán)格封裝的,完全使用構(gòu)件化進(jìn)行嵌入式系統(tǒng)開發(fā)在一定程度上限制了軟件開發(fā)的靈活性,這對(duì)于希望盡可能高效地利用各種資源的嵌入式系統(tǒng)是極其不利的。因此,如果能夠在已有源代碼的基礎(chǔ)上提取出其中可構(gòu)件化的代碼進(jìn)行優(yōu)化,不但保持了嵌入式程序的靈活性,而且對(duì)于嵌入式程序可靠性的提升將有著顯著作用。
本文將結(jié)合構(gòu)件化軟件開發(fā)的方法,通過(guò)對(duì)源程序的分析,提取出其中可構(gòu)件化成分,然后選擇最合適的構(gòu)件進(jìn)行映射,以最大程度提升源程序的質(zhì)量。其中,可構(gòu)件化代碼識(shí)別和使用何種構(gòu)件進(jìn)行代碼映射是確保源程序質(zhì)量最為關(guān)鍵的兩個(gè)步驟,本文將重點(diǎn)研究這兩個(gè)過(guò)程。
為提高源程序本身的可靠性,緩解由于程序員本身經(jīng)驗(yàn)缺乏導(dǎo)致的代碼不可靠性以及實(shí)現(xiàn)的低效率性,本文設(shè)計(jì)了一種基于編譯前端分析自動(dòng)構(gòu)件化的代碼加強(qiáng)技術(shù)。該方法首先對(duì)編譯器前端預(yù)處理器之后的源程序進(jìn)行分析,然后借助于一套可靠構(gòu)件庫(kù),根據(jù)其結(jié)構(gòu)特征,采用模糊匹配的方式,從源程序中識(shí)別出與可靠構(gòu)件相似程度高的代碼塊。
由于采用的是基于程序結(jié)構(gòu)相似度進(jìn)行的模糊匹配,識(shí)別的源程序并不一定具備可構(gòu)件化的能力。而且同一段代碼也許會(huì)有針對(duì)不同使用場(chǎng)景的多種實(shí)現(xiàn)方式,對(duì)于識(shí)別的源程序模塊具體該使用哪個(gè)可靠構(gòu)件進(jìn)行替換需要程序員根據(jù)具體的應(yīng)用場(chǎng)景才能確定。因此,在識(shí)別了可構(gòu)件化的程序片段后,將利用人機(jī)交互的方式確定該程序片段是否可以使用可靠構(gòu)件進(jìn)行替換,以及使用哪個(gè)構(gòu)件進(jìn)行替換更為合適。
該方法的總體框架如圖1所示,主要包括兩個(gè)過(guò)程:多層次迭代分析可構(gòu)件化代碼識(shí)別和基于人機(jī)交互的功能模塊構(gòu)件化映射。
2.2.1 多層次迭代分析可構(gòu)件化代碼識(shí)別方法
對(duì)于可構(gòu)件化代碼識(shí)別過(guò)程,本文擬采用一種多層次迭代分析的方法對(duì)源程序中可構(gòu)件化部分進(jìn)行識(shí)別。該方法以函數(shù)為識(shí)別的基本單位,從最底層函數(shù)(即函數(shù)調(diào)用關(guān)系圖中的葉子節(jié)點(diǎn))開始,依次向上迭代分析,利用可靠構(gòu)件集查找源程序中可構(gòu)件化部分。
如圖1所示,首先對(duì)預(yù)處理后代碼進(jìn)行分析,構(gòu)件函數(shù)調(diào)用關(guān)系圖(函數(shù)調(diào)用圖中每個(gè)節(jié)點(diǎn)表示源程序中一個(gè)函數(shù),每條邊表示函數(shù)調(diào)用關(guān)系)。然后,對(duì)該圖中第0層節(jié)點(diǎn)進(jìn)行分析,計(jì)算該節(jié)點(diǎn)同可靠構(gòu)件集中的每個(gè)構(gòu)件在程序結(jié)構(gòu)上的相似度,并保存相似度大于閾值的節(jié)點(diǎn)作為該節(jié)點(diǎn)可選構(gòu)件。接著分析第1層中的節(jié)點(diǎn),識(shí)別其中可構(gòu)件化的節(jié)點(diǎn)保存到可靠構(gòu)件化映射表中。以此迭代分析,直到第n層。其中,第n層節(jié)點(diǎn)是指該節(jié)點(diǎn)到最遠(yuǎn)葉子節(jié)點(diǎn)的路徑上經(jīng)過(guò)的節(jié)點(diǎn)數(shù)目。
在該步驟中,代碼相似度檢測(cè)是核心,本文主要基于文獻(xiàn)[21]中使用的代碼相似度計(jì)算方法,檢測(cè)包含以下3個(gè)步驟:
(1)分析源程序,將其轉(zhuǎn)化為具有數(shù)據(jù)流和控制流信息的抽象中間表示形式,如抽象語(yǔ)法樹(abstract syntax tree,AST);
(2)應(yīng)用變換法則對(duì)中間表示形式進(jìn)行規(guī)范化處理,以便降低理解的復(fù)雜度;
Fig.1 Code reliability enhancement method based on automatic component and compiler front-end analysis圖1 基于編譯前端分析自動(dòng)構(gòu)件化代碼加強(qiáng)方法
(3)分析規(guī)范化處理結(jié)果,識(shí)別出程序中包含的語(yǔ)義及知識(shí)信息,然后進(jìn)行分析與推理,獲取程序設(shè)計(jì)者的意圖。
但由于待檢測(cè)的代碼是可能包含缺陷的嵌入式代碼,在步驟(2)進(jìn)行代碼規(guī)則化處理時(shí),忽略了以下3類語(yǔ)句:
(1)如果控制語(yǔ)句是針對(duì)數(shù)組索引值的判斷或空指針的判斷,則忽略該控制語(yǔ)句;
(2)如果內(nèi)存申請(qǐng)與釋放語(yǔ)句(如malloc、free等),則忽略該語(yǔ)句;
(3)如果是針對(duì)指針賦值為空的操作,則忽略該語(yǔ)句。
同時(shí),由于本文的可靠構(gòu)件主要是基于函數(shù)進(jìn)行封裝的,在對(duì)函數(shù)進(jìn)行分析時(shí),不再進(jìn)行遞歸展開,而是將其作為一個(gè)普通順序節(jié)點(diǎn)進(jìn)行處理。
代碼之間的相似度按照規(guī)模相似度SizeS、結(jié)構(gòu)相似度StructS、語(yǔ)句相似度StateS和知識(shí)點(diǎn)相似度PivotS這4個(gè)維度進(jìn)行計(jì)算,具體公式如下:
算法1描述了多層次迭代分析查找源代碼與可靠構(gòu)件相似代碼的具體過(guò)程。
算法1多層次迭代分析可構(gòu)件化算法
下面詳細(xì)分析4個(gè)維度相似度的計(jì)算方法及權(quán)重選擇策略。
2.2.2 規(guī)模相似度
規(guī)模相似度計(jì)算時(shí)將程序分為4種類型:循環(huán)語(yǔ)句、選擇語(yǔ)句、賦值語(yǔ)句和其他語(yǔ)句。然后遍歷AST樹,統(tǒng)計(jì)各類語(yǔ)句節(jié)點(diǎn)的個(gè)數(shù),得到待檢測(cè)代碼規(guī)模向量Vs和所有可靠構(gòu)件代碼規(guī)模向量Vt。最后按照式(2)計(jì)算規(guī)模相似度。
規(guī)模相似度主要衡量不同代碼塊之間各種類型語(yǔ)句在數(shù)量上的一致性,并不分析具體語(yǔ)義。
2.2.3 結(jié)構(gòu)相似度
結(jié)構(gòu)相似度主要衡量待檢測(cè)代碼AST樹與可靠構(gòu)件代碼AST樹在樹結(jié)構(gòu)上的相似度。
定義兩棵樹T1、T2的節(jié)點(diǎn)對(duì)(v1,v2)是匹配節(jié)點(diǎn),當(dāng)且僅當(dāng):(1)v1與v2具有相同的符號(hào),即相同的類型、運(yùn)算符、被調(diào)用的函數(shù)名;(2)v1、v2的父節(jié)點(diǎn)是匹配節(jié)點(diǎn)對(duì);(3)假設(shè)w1和w2是匹配節(jié)點(diǎn)對(duì),v1與w1是兄弟節(jié)點(diǎn),v2與w2是兄弟,那么如v1在w1前出現(xiàn),則v2在w2前出現(xiàn);(4)v1至多能和T2中的1個(gè)節(jié)點(diǎn)匹配,v2至多能和T1中的1個(gè)節(jié)點(diǎn)匹配。
因此,求待檢測(cè)代碼與可靠構(gòu)件代碼結(jié)構(gòu)相似度問(wèn)題,即可轉(zhuǎn)為兩棵AST樹節(jié)點(diǎn)匹配問(wèn)題。本文將借助文獻(xiàn)[21]的方法對(duì)結(jié)構(gòu)匹配程度進(jìn)行計(jì)算,最后按照式(3)計(jì)算結(jié)構(gòu)相似度。其中StructMatch(S,T)表示樹S(待檢測(cè)代碼的AST樹)和樹T(可靠構(gòu)件代碼的AST樹)匹配的節(jié)點(diǎn)數(shù)目。
2.2.4 語(yǔ)句相似度和知識(shí)點(diǎn)相似度
語(yǔ)句相似度和知識(shí)點(diǎn)相似度主要是為了進(jìn)一步突出語(yǔ)義的相似性而增加的額外維度。程序語(yǔ)義通常由表達(dá)式或者功能函數(shù)進(jìn)行描述,因此語(yǔ)句相似度則強(qiáng)調(diào)比較待檢測(cè)代碼與可靠構(gòu)件代碼在表達(dá)式上的相似程度,而知識(shí)點(diǎn)相似度則強(qiáng)調(diào)比較待檢測(cè)代碼與可靠構(gòu)件代碼在函數(shù)調(diào)用方面的相似度。它們都是在結(jié)構(gòu)相似度的基礎(chǔ)上,專門針對(duì)表達(dá)式節(jié)點(diǎn)、函數(shù)調(diào)用節(jié)點(diǎn)的相似程度重新進(jìn)行計(jì)算得到的。
具體計(jì)算時(shí),算法依次遍歷匹配AST樹,獲得待檢測(cè)代碼中表達(dá)式節(jié)點(diǎn)和函數(shù)調(diào)用節(jié)點(diǎn)的數(shù)目Gst和Gpv。然后遍歷結(jié)構(gòu)相似節(jié)點(diǎn),如果該節(jié)點(diǎn)是表達(dá)式節(jié)點(diǎn),則將valuest加1;如果是相同函數(shù)調(diào)用節(jié)點(diǎn),則將 valuepv值加1。最后分別根據(jù)式(4)和式(5)計(jì)算語(yǔ)句相似度和知識(shí)點(diǎn)相似度。
2.2.5 權(quán)重參數(shù)的選擇
由于規(guī)模相似度主要衡量不同代碼塊之間各種類型語(yǔ)句在數(shù)量上的一致性,并不分析具體語(yǔ)義,其權(quán)重值不宜設(shè)置較大。
同時(shí),語(yǔ)句相似度和知識(shí)點(diǎn)相似度均是在結(jié)構(gòu)相似度的基礎(chǔ)上針對(duì)語(yǔ)義進(jìn)行的強(qiáng)化,因此這兩個(gè)維度的值也不宜設(shè)置較大。
結(jié)構(gòu)相似度既包含了代碼形式上的相似,同時(shí)也兼顧了語(yǔ)義方面的內(nèi)容,其對(duì)于代碼相似度的評(píng)估最為全面,因此其權(quán)重值可以設(shè)置為較大值。
在實(shí)驗(yàn)時(shí),將 u1、u3、u4的值設(shè)置為0.1,將 u2的值設(shè)置為0.7。
在對(duì)識(shí)別的可構(gòu)件化代碼進(jìn)行構(gòu)件化的過(guò)程中,本文擬采用人機(jī)交互的方式提高構(gòu)件轉(zhuǎn)換的質(zhì)量。它以識(shí)別的可靠構(gòu)件映射表M為輸入,通過(guò)人機(jī)交互信息生成器將識(shí)別的可構(gòu)件化程序部分及其可選的構(gòu)件以友好的方式展示給程序員,并將程序選擇好的結(jié)果傳遞給人機(jī)交互構(gòu)件化轉(zhuǎn)換模塊,以生成通過(guò)構(gòu)件化處理后加強(qiáng)的源程序,獲得源代碼本身質(zhì)量的加強(qiáng)。
為獲得較好的人機(jī)交互效果,需要將識(shí)別的構(gòu)件與對(duì)應(yīng)的程序片段以簡(jiǎn)單而精確的方式顯示出來(lái)。為此,本文根據(jù)構(gòu)件本身的特點(diǎn),將構(gòu)件的適用場(chǎng)景、需要的前提條件等應(yīng)用相關(guān)的信息以xml的形式保存,當(dāng)需要使用該構(gòu)件時(shí)再通過(guò)xml解析器將信息分層顯示,以便于程序員選擇。
具體算法如算法2所示。
算法2人機(jī)交互的功能模塊構(gòu)件化映射方法
要提升源代碼的可靠性,最重要的是盡可能地消除源代碼中的漏洞。由于可靠構(gòu)件是已經(jīng)被證明的無(wú)漏洞代碼,本文通過(guò)將源代碼中可能存在漏洞的代碼替換為語(yǔ)義等價(jià)的可靠構(gòu)件,從而實(shí)現(xiàn)源代碼可靠性的加強(qiáng)。因此,要獲得源代碼可靠性的加強(qiáng),最關(guān)鍵的任務(wù)是自動(dòng)識(shí)別出源代碼中與漏洞代碼對(duì)應(yīng)的語(yǔ)義等價(jià)的可靠構(gòu)件。
因此本文以Mibench[19]為基準(zhǔn)測(cè)試用例集,以LLVM 3.9.0[20]為基礎(chǔ)編譯器,主要針對(duì)可靠構(gòu)件識(shí)別的正確性和全面性,對(duì)基于編譯前端分析自動(dòng)構(gòu)件化代碼加強(qiáng)方法進(jìn)行了實(shí)驗(yàn),選擇相似度值大于80%的值作為相似代碼。其中代碼相似性參數(shù)分別設(shè)置為:
為便于評(píng)估該方法的有效性,本文對(duì)Mibench測(cè)試用例集中的源程序進(jìn)行了修改,人為加入了一些不可靠的代碼,包括數(shù)組越界訪問(wèn)、野指針、空指針、內(nèi)存泄漏四方面漏洞,每個(gè)測(cè)試用例中每種漏洞20個(gè),并依據(jù)程序功能模塊設(shè)計(jì)了對(duì)應(yīng)的可靠構(gòu)件庫(kù)。
圖2顯示了本文方法相對(duì)于文獻(xiàn)[21]方法對(duì)相似代碼識(shí)別準(zhǔn)確率的提升值。測(cè)試用例i類型j的漏洞,其識(shí)別準(zhǔn)確度提升率V的計(jì)算如式(6):
其中,SemSimloc(i,k)表示本文方法針對(duì)測(cè)試用例i第k個(gè)漏洞與對(duì)應(yīng)的可靠構(gòu)件源代碼的相似度;SemSim[21](i,k)表示文獻(xiàn)[21]的方法針對(duì)測(cè)試用例i第k個(gè)漏洞與對(duì)應(yīng)的可靠構(gòu)件源代碼的相似度。
Fig.2 Recognition accuracy contrast圖2 識(shí)別準(zhǔn)確率對(duì)比
由以上實(shí)驗(yàn)結(jié)果可以看出,本文方法針對(duì)漏洞代碼在規(guī)則化部分對(duì)文獻(xiàn)[21]的方法進(jìn)行了修正,因此獲得的漏洞代碼與可靠構(gòu)件代碼的相似度明顯高于文獻(xiàn)[21]。其中,野指針類漏洞識(shí)別度提升值最高達(dá)到了70%左右(即tiff2bw),最低也達(dá)到了10%左右(即ipell),平均識(shí)別率約為35%;對(duì)于內(nèi)存泄漏類漏洞,識(shí)別度提升值最高達(dá)到了80%左右(即jpeg),最低也達(dá)到了35%左右(如crc32、fft),平均識(shí)別率約為55%;而針對(duì)數(shù)組越界、空指針類型的漏洞,由于增加了分支節(jié)點(diǎn),修改了控制結(jié)構(gòu),使得在計(jì)算相似度時(shí),本文方法比文獻(xiàn)[21]方法有明顯改善,對(duì)于數(shù)據(jù)越界和空指針類漏洞,大部分測(cè)試用例漏洞代碼與可靠代碼的相似度,本文方法比文獻(xiàn)[21]方法提升了1倍以上,而對(duì)于測(cè)試用例dijkstra、gsm、blowfish的空指針類漏洞,jpeg和tiff2bw的數(shù)組越界類漏洞,識(shí)別相似度提升值均超過(guò)1.5倍,blowfish的空指針類漏洞,識(shí)別相似度提升值甚至接近2倍,有效提升了可靠構(gòu)件對(duì)不可靠代碼的自動(dòng)匹配。
圖3、圖4分別顯示了本文方法獲得各測(cè)試用例對(duì)于注入漏洞的召回率和準(zhǔn)確率。其中,正確率=提取出的正確漏洞數(shù)/提取出的漏洞總數(shù);召回率=提取出的正確漏洞數(shù)/注入的漏洞總數(shù)。
Fig.3 Recall rate of vulnerability detection圖3 漏洞檢測(cè)的召回率
Fig.4 Correct rate of vulnerability detection圖4 漏洞檢測(cè)的正確率
由圖3可以看出,由于本文方法是基于結(jié)構(gòu)相似性進(jìn)行對(duì)比,對(duì)于引起結(jié)構(gòu)變化的漏洞,如空指針類的漏洞,需要增加對(duì)應(yīng)的判斷條件分支語(yǔ)句,召回率相對(duì)較低。但嵌入式系統(tǒng)控制語(yǔ)句較多,較小的結(jié)構(gòu)差異不會(huì)對(duì)總體的相似度造成較大影響,因此總體的漏洞召回率較高,最低召回率可以達(dá)到85%(如測(cè)試用例jpeg、dijkstra),而其他的測(cè)試用例召回率均在90%以上。而對(duì)于其他類型的漏洞,所有測(cè)試用例的召回率均在90%以上,平均召回率超過(guò)了95%,特別是數(shù)值越界類漏洞,所有測(cè)試用例的召回率都達(dá)到了100%。由此可見,本文方法能夠有效識(shí)別漏洞代碼與對(duì)應(yīng)的可靠構(gòu)件,便于實(shí)現(xiàn)自動(dòng)替換。
由圖4可以看出,雖然程序函數(shù)塊較多,但由于結(jié)構(gòu)相似度大的塊較少,本文方法檢測(cè)的正確率較高,檢測(cè)的正確率最低達(dá)到了87.2%(即測(cè)試用例basicmath),最高的達(dá)到了100%(即測(cè)試用例ispell、crc32、fft),平均約為94.5%,能夠有效減少無(wú)效的人機(jī)交互,保證了本文方法的可用性和高效性。
隨著嵌入式系統(tǒng)應(yīng)用范圍的不斷擴(kuò)大,特別是其廣泛應(yīng)用于關(guān)系國(guó)際民生的關(guān)鍵領(lǐng)域,其可靠性越來(lái)越受到人們的關(guān)注。針對(duì)嵌入式系統(tǒng)的可靠性,設(shè)計(jì)了一種基于編譯前端分析自動(dòng)構(gòu)件化代碼加強(qiáng)方法。本文方法結(jié)合構(gòu)件化軟件開發(fā)的思路,通過(guò)對(duì)源程序的分析,自動(dòng)提取出其中可構(gòu)件化成分,然后通過(guò)人機(jī)交互選擇最合適的可靠構(gòu)件進(jìn)行映射,以最大程度提升源程序的質(zhì)量。
實(shí)驗(yàn)結(jié)果表明,本文方法能夠有效找出其中90%以上的漏洞,且正確率高達(dá)94.5%,這對(duì)于提升源程序本身的可靠性是十分有利的。
當(dāng)然,可靠構(gòu)件庫(kù)本身的建立也是一個(gè)需要研究的方面。在實(shí)際應(yīng)用中,一方面可以通過(guò)有經(jīng)驗(yàn)的工程師根據(jù)應(yīng)用領(lǐng)域的特點(diǎn)事先給出,然后利用完備的測(cè)試完成庫(kù)的構(gòu)建;另一方面可以在實(shí)踐中根據(jù)具體的應(yīng)用情況,將穩(wěn)定可靠的代碼塊作為可靠構(gòu)件入庫(kù)。在后續(xù)的工作中將對(duì)可靠構(gòu)件庫(kù)的構(gòu)建進(jìn)行深入研究。