国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種代碼靜態(tài)檢測(cè)方法

      文檔序號(hào):9249188閱讀:1013來源:國(guó)知局
      一種代碼靜態(tài)檢測(cè)方法
      【技術(shù)領(lǐng)域】
      [0001] 一種代碼靜態(tài)檢測(cè)方法,應(yīng)用于源代碼中的數(shù)組越界,除零錯(cuò)誤和空指針引用,設(shè) 及編譯器理論,程序內(nèi)存模型,SMT約束求解,形式化方法,一階謂詞邏輯等領(lǐng)域,具體設(shè)及 一種基于LLVMIR的符號(hào)執(zhí)行算法一一利用給予程序變量符號(hào)初值技術(shù)領(lǐng)域。
      【背景技術(shù)】
      [0002] 隨著計(jì)算機(jī)技術(shù)的發(fā)展,軟件系統(tǒng)已經(jīng)被運(yùn)用到我們生活的方方面面,依賴互聯(lián) 網(wǎng)我們足不出戶就可W網(wǎng)上購(gòu)物(淘寶/京東)、接受遠(yuǎn)程教育(coursera/網(wǎng)易公開課)、 與朋友聊天(QQ/微信)、甚至網(wǎng)上看病等。
      [000引 2014年9月19日,阿里己己在美國(guó)紐交所正式進(jìn)行IP0,其市值超過化cebook成 為僅次于google的全球第二大互聯(lián)網(wǎng)公司。該也標(biāo)志著我國(guó)口業(yè)逐漸走向國(guó)際市場(chǎng)。近 年來我國(guó)IT業(yè)發(fā)展迅速,2013年我國(guó)軟件業(yè)實(shí)現(xiàn)業(yè)務(wù)收入總量規(guī)模達(dá)到3. 1萬億元,同比 增長(zhǎng)24. 6%,比同期電子信息制造業(yè)增速高13. 6%。與此同時(shí)我國(guó)軟件應(yīng)用水平和產(chǎn)業(yè)創(chuàng) 新能力也得到逐步提升。2013年軟件類產(chǎn)品登記數(shù)總數(shù)達(dá)39821件,相比同期增長(zhǎng)11. 5%, 軟件著作權(quán)登記數(shù)量達(dá)164349件,相比同期增長(zhǎng)18. 04%,整個(gè)行業(yè)總體投入研發(fā)經(jīng)費(fèi)同 比增長(zhǎng)6. 3%。
      [0004] 軟件技術(shù)的發(fā)展極大的方便了我們的生活,提高了我們的工作效率。軟件業(yè)蓬勃 發(fā)展,未來會(huì)有更多人員投入到軟件開發(fā)中,軟件開發(fā)對(duì)從業(yè)人員的口檻也會(huì)越來越低。新 華(大連)軟件和信息技術(shù)服務(wù)業(yè)發(fā)展指數(shù)報(bào)告指出2014年中國(guó)信息技術(shù)服務(wù)業(yè)和軟件 開發(fā)從業(yè)人員高達(dá)470萬,是2001年數(shù)據(jù)的15倍。
      [0005] 但是另一方面由于軟件的廣泛使用使得一旦軟件出現(xiàn)崩潰或者被惡意攻擊便會(huì) 帶來極為嚴(yán)重的后果,所W對(duì)于軟件質(zhì)量的要求將越來越高。該種從業(yè)口檻的降低和對(duì)軟 件質(zhì)量要求的增高無疑形成了一對(duì)激烈的矛盾。該種矛盾的直接后果就是對(duì)軟件測(cè)試、源 代碼分析等技術(shù)提出了更高的要求。
      [0006] 近些年來,隨著民用航空事業(yè)的蓬勃發(fā)展和部隊(duì)飛行訓(xùn)練任務(wù)的逐步加重,國(guó)內(nèi) 飛機(jī)的數(shù)目與日俱增,空域內(nèi)航線日益密集,飛行器流量日益加大,又由于飛機(jī)只能在平流 層平穩(wěn)飛行,使得飛機(jī)可飛行空間是一個(gè)相對(duì)有限的空間,該就造成了空域變得越來越擁 擠,擁擠意味著沖突。無論是航線設(shè)定過密,飛機(jī)本身故障或是風(fēng)力等環(huán)境因素,都可能造 成飛機(jī)發(fā)生碰撞沖突。由于飛機(jī)運(yùn)輸?shù)奶厥庑裕坏╋w機(jī)在空中發(fā)生沖突,就很難保證乘客 人身及財(cái)產(chǎn)安全。同時(shí),如不能有效地疏通該種擁擠,也會(huì)降低空域資源的利用率,極大地 阻礙國(guó)家航空事業(yè)的發(fā)展。因此,能夠提前預(yù)知沖突的發(fā)生,并及早地采取有效的防范措施 就顯得尤為重要。
      [0007] 符號(hào)執(zhí)行能夠有效的給復(fù)雜的程序生成高覆蓋率的測(cè)試用例和發(fā)現(xiàn)深層次的漏 洞,最近幾年受到了極大的關(guān)注。符號(hào)執(zhí)行的核屯、思想在1976年被引入,但最近幾年才被 有效的運(yùn)用于實(shí)際工程中。主要原因在于約束求解器等技術(shù)的發(fā)展符號(hào)執(zhí)行的一個(gè)關(guān)鍵目 標(biāo)是在給定的時(shí)間內(nèi)探索盡量多不同的程序路徑,對(duì)于每一條路徑(1)生成一組具體的輸 入使得程序在實(shí)際運(yùn)行時(shí)能夠執(zhí)行該條路徑。(2)在該路徑上檢測(cè)各種常見的錯(cuò)誤如斷言 失敗,未捕獲異常,內(nèi)存泄露等。能生成具體的測(cè)試用例是符號(hào)執(zhí)行的一個(gè)強(qiáng)大能力。從軟 件測(cè)試的角度,它能產(chǎn)生高覆蓋率的的輸入,從探測(cè)bug的角度,它能給開發(fā)者提供一個(gè)能 觸發(fā)bug的輸入,W便于幫助開發(fā)者分析漏洞是如何發(fā)生的。在漏洞的檢測(cè)中,從某種程度 上來說符號(hào)執(zhí)行相比于傳統(tǒng)的測(cè)試執(zhí)行技術(shù)如Valgrind和化rify等更加強(qiáng)大。因?yàn)樵撔?傳統(tǒng)工具依賴于實(shí)際執(zhí)行程序所輸入的參數(shù),如果該些參數(shù)不能夠觸發(fā)漏洞,則該些工具 是無法發(fā)現(xiàn)該些漏洞的。另外符號(hào)執(zhí)行不但能探測(cè)到傳統(tǒng)測(cè)試工具能檢查到的漏洞,如內(nèi) 存泄露等,更能檢查到一些程序高層次的性質(zhì),比如復(fù)雜的程序斷言邏輯。

      【發(fā)明內(nèi)容】

      [000引本發(fā)明針對(duì)現(xiàn)有技術(shù)的不足之處提供了一種代碼靜態(tài)檢測(cè)方法,解決現(xiàn)在技術(shù)中 的靜態(tài)檢測(cè)方法支持語言單一、不能較好的處理指針和別名問題,探測(cè)潛在的程序漏洞等 問題。
      [0009] 為了實(shí)現(xiàn)上述目的,本發(fā)明采用的技術(shù)方案為:
      [0010] 一種代碼靜態(tài)檢測(cè)方法,其特征在于,如下步驟:
      [0011] (1)獲取源代碼,并將源代碼進(jìn)行預(yù)處理轉(zhuǎn)換為L(zhǎng)LVM匯編程序;
      [0012] (2)將轉(zhuǎn)換得到的LLVM匯編程序,運(yùn)用符號(hào)執(zhí)行算法模擬解釋執(zhí)行LLVM匯編程 序,并記錄各個(gè)變量在不同路徑上的符號(hào)值和各條路徑的約束條件;
      [0013] (3)根據(jù)記錄各個(gè)變量在不同路徑上的符號(hào)值和各條路徑的約束條件,調(diào)用SMT 求解器Z3檢查變量的符號(hào)值是否滿足路徑約束和漏洞約束,判斷程序是否存在潛在漏洞。
      [0014] 進(jìn)一步,所述步驟(1)中,將源代碼進(jìn)行預(yù)處理轉(zhuǎn)換為L(zhǎng)LVM匯編程序的具體步驟 如下:
      [0015] (11)調(diào)用編譯器clang檢查源代碼是否存在語法錯(cuò)誤,如有錯(cuò)誤,修改語法錯(cuò)誤 直到編譯器不報(bào)錯(cuò),W得到語法正確的源代碼;
      [0016] (12)將得到的語法正確的源代碼利用編譯器Clang轉(zhuǎn)化為L(zhǎng)LVM匯編程序。
      [0017] 進(jìn)一步,所述步驟(2)中,模擬解釋執(zhí)行LLVM匯編程序的具體步驟如下:
      [001引 (21)調(diào)用LLVM基礎(chǔ)庫(kù),將LLVM匯編程序輸入LLVM基礎(chǔ)庫(kù)并轉(zhuǎn)化為文本形式程序 的LLVM匯編程序CFG,LLVM基礎(chǔ)庫(kù)返回的CFG中包含的具體對(duì)象有全局變量,全局變量對(duì) 應(yīng)全局變量對(duì)象g,每一個(gè)函數(shù)LLVM匯編程序?qū)?yīng)函數(shù)對(duì)象F,每個(gè)函數(shù)對(duì)象F包含函數(shù)參 數(shù)P和若干代碼塊b,而每個(gè)代碼塊又包含多個(gè)指令instruction;
      [0019] (22)對(duì)于被分析函數(shù)對(duì)象,為其引用到全局變量對(duì)象、函數(shù)參數(shù)和內(nèi)存對(duì)象,內(nèi)存 對(duì)象是一個(gè)四元組,其結(jié)構(gòu)為:
      [0020] SValue=(化XvalXptrXdata)G(llvm: :Type*XStringXSValue*X(intXS Value*)),
      [002U其中SValue是內(nèi)存對(duì)象,用于描述各變量的符號(hào)狀態(tài),tp、val、ptr和data分別 是,化代表數(shù)據(jù)的類型,val代表符號(hào)值,表示一個(gè)字符串的類型為String,ptr代表符號(hào) 指針值,data是一個(gè)數(shù)字到符號(hào)值指針的映射,用于記錄數(shù)組類型和結(jié)構(gòu)體,llvm::Type*, String,SValue*,(intXSValue*)分別是對(duì)應(yīng)分量tp、val、ptr、data的數(shù)據(jù)類型, LIvm: :Type是LLVM基礎(chǔ)庫(kù)中的一個(gè)描述LLVM匯編程序類型的對(duì)象,LLVM: :Type*代表該 類型對(duì)象的指針,string是C++標(biāo)準(zhǔn)庫(kù)中的字符串對(duì)象類型,SValue是內(nèi)存對(duì)象,也稱為符 號(hào)對(duì)象,int代表C++基礎(chǔ)類型中的整數(shù)類型;
      [0022] 系統(tǒng)的初始狀態(tài)為PT、PTS,首先初始化一個(gè)長(zhǎng)度為1的根路徑PT,將該路徑存放 到可執(zhí)行路徑PTS中,解釋執(zhí)行的過程類似于一個(gè)有限狀態(tài)機(jī)的狀態(tài)遷移,解釋器的狀態(tài) WPT和PTS進(jìn)行描述,每解釋執(zhí)行一條指令狀態(tài)就發(fā)生遷移,將初始化好的第一條路徑放 入PTS中;該些初始化的過程可W表示為如下指令語義模式操作公式:
      [0023]
      [0024] 其中,PT代表當(dāng)前正在探索的可行路徑,PTS代表目前發(fā)現(xiàn)的所有未探測(cè)的可行 路徑集合,B代表LLVM匯編程序CFG中的一個(gè)代碼塊,PT.cuitB代表當(dāng)前路徑正在探索的 代碼塊,F(xiàn)表示當(dāng)前正在被分析的函數(shù),F(xiàn).firs巧lock代表函數(shù)的第一個(gè)代碼塊,PT.vars 代表路徑上所有的變量,它是一個(gè)映射,PT.vars[key=value]代表的是將鍵值對(duì)化ey, value)存入映射vars當(dāng)中,其中key代表映射的索引,value代表映射的key索引所對(duì) 應(yīng)的值,k巧和value可W被替換為各種值,公式中PT.vars[g=SValue(g.typeO),P =SValue(p.type0)]是PT.vars[g=SValue(g.type())]和PT.vars[p=SValue(p. type0)]的縮寫形式,代表將鍵值對(duì)(g,SValue(g.type〇))和(p,SValue(p.type))存入 PT.vars中,此處的g和p作為key,SValue(g.type0)和SValue(p.type)則作為值value 部分,SValue(type)是符號(hào)對(duì)象的構(gòu)造函數(shù),它有一個(gè)參數(shù)type表明符號(hào)對(duì)象,即表示數(shù) 據(jù)的類型,g代表全局變量,g.type0表示全局變量的類型,P代表函數(shù)F的參數(shù),P.type0 表示參數(shù)的類型,SValue(p.typeO)代表根據(jù)參數(shù)P的類型構(gòu)造內(nèi)存對(duì)象,SValue(g. type0)代表根據(jù)全局變量g的類型構(gòu)造內(nèi)存對(duì)象,PT.it代表當(dāng)前路徑所執(zhí)行到的指令, PT.currB.firstinstruction代表當(dāng)前路徑當(dāng)前塊的第一條指令,PTS.add(PT)將一條路 徑PT添加到可行路徑集合PTS中,init代表該是一個(gè)初始化動(dòng)作,在任何具體指令分析之 前應(yīng)該進(jìn)行該操作,它不對(duì)應(yīng)任何指令;
      [0025] (23)判斷PTS是否為空,如果PTS不為空,則彈出其中一條路徑存放到PT中,并執(zhí) 行步驟(24);若PTS為空,則模擬執(zhí)行結(jié)束;
      [0026] (24)若PT路徑中的當(dāng)前執(zhí)行位置PT.it所指指令為非跳轉(zhuǎn)指令,則執(zhí)行步驟 (25),否則執(zhí)行(26);
      [0027] (25)根據(jù)不同的非跳轉(zhuǎn)指令類型,執(zhí)行不同的指令語義模式操作公式;
      [002引 (26)根據(jù)不同的跳轉(zhuǎn)指令類型,執(zhí)行不同的指令語義模式操作公式;
      [0029] (27)判斷步驟(25)或步驟(26)直到發(fā)現(xiàn)致命性錯(cuò)誤或者PTS為空,否則PT.it++ 繼續(xù)執(zhí)行步驟(23)至步驟(26)。
      [0030] 進(jìn)一步,所述步驟(22)中,指令語義模式的結(jié)構(gòu)如下公式所示:
      [0031]
      [0032] 其中〈currentstate〉代表系統(tǒng)的當(dāng)前狀態(tài),<endstate〉代表語句執(zhí)行后程序 的狀態(tài),computation是狀態(tài)遷移計(jì)算過程的一些細(xì)節(jié)展示,stmt代表被執(zhí)行的語句包含 的所有指令,具體指令如下所示:
      [0033] (11)ret[voidI<typeXvalue>];
      [0034] (I2)briKcond〉,1油eKiftrue〉,labeKiffalse〉;
      [0035] (I3)br1油eKdest〉;
      [0036] (14) <result> =[add|sub|mul|udiv|sdiv|urem|srem] <tyXopl>, <op2>;
      [0037] (15)<result> =icmp<cond><tyXopl>, <op2> ;
      [0038] (16)<result> =alloca<type>[, <ty><NumElements>];
      [0039] (17)〈result〉 =load<ty〉*<pointer〉;
      [0040] (18)store<tyXvalue>, <ty>*<pointer> ;
      [0041] (19)<result> =getelementptrinbounds<pty〉*<ptrval〉{,<tyXidx〉} * ;
      [0042] (110)<result> =invoke<ptrtofunctiontyXfunctionptrval>?function args>;
      [0043] II代表函數(shù)返回指令,它分為有參數(shù)值和無參數(shù)值返回,無參數(shù)值retvoid,有參 數(shù)值ret<typeXvalue〉,其中〈value〉代表具體的返回值,〈type〉代表返回值的類型,ret 表示該是一條函數(shù)返回;
      [0044] 12代表有條件跳轉(zhuǎn)指令,其中<cond>代表跳轉(zhuǎn)的條件,il代表布爾類型, <iftrue>代表?xiàng)l件為真時(shí)跳轉(zhuǎn)到的目標(biāo)代碼塊,<ifTalse>代表?xiàng)l件為假時(shí)跳轉(zhuǎn)到的目標(biāo) 代碼塊,1油el代表是一個(gè)標(biāo)簽類型,br表示該是一條跳轉(zhuǎn)指令;
      [0045] 13代表無條件跳轉(zhuǎn)指令,<dest>代表無條件跳轉(zhuǎn)到的目標(biāo)代碼塊,1油el代表是 一個(gè)標(biāo)簽類型,br表示該是一條跳轉(zhuǎn)指令;
      [0046] 14代表算術(shù)運(yùn)算指令,[
      當(dāng)前第1頁(yè)1 2 3 4 5 6 
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1