国产精品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>

      一種基于子圖搜索的指針相關(guān)語義錯(cuò)誤定位方法

      文檔序號(hào):9708224閱讀:542來源:國知局
      一種基于子圖搜索的指針相關(guān)語義錯(cuò)誤定位方法
      【技術(shù)領(lǐng)域】
      [0001] 本發(fā)明涉及一種C語言過程內(nèi)的自動(dòng)化錯(cuò)誤定位方法,尤其涉及一種主要針對(duì)指 針語義相關(guān)錯(cuò)誤的,基于子圖搜索的自動(dòng)化錯(cuò)誤定位方法。
      [0002] 發(fā)明背景
      [0003] 據(jù)統(tǒng)計(jì),在使用到指針和動(dòng)態(tài)內(nèi)存的軟件系統(tǒng)中,50 %的軟件故障與指針及動(dòng)態(tài) 內(nèi)存的管理有關(guān)。目前對(duì)于指針錯(cuò)誤定位的研究主要分為兩方面:一方面是對(duì)指針分析算 法的研究,主要用來確定一個(gè)指針可能指向的內(nèi)存地址集或一塊內(nèi)存可能被操作的別名 集。由于這樣的分析通常是不可確定的,因此已有的指針分析算法往往是近似的。另一方 面,一些指針分析工具主要分析特定類型的指針錯(cuò)誤,如空指針引用、內(nèi)存泄露、指針未初 始化等安全方面的隱患。目前,針對(duì)指針的語義錯(cuò)誤的定位方法的相關(guān)研究較少。
      [0004]在大型C/C++程序中,尤其是圖和樹等復(fù)雜結(jié)構(gòu)中,指針的應(yīng)用十分廣泛。而在這 種復(fù)雜結(jié)構(gòu)中,一旦出現(xiàn)錯(cuò)誤,往往需要手動(dòng)調(diào)試,且效率低下。

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

      [0005] 本發(fā)明的技術(shù)解決問題:克服現(xiàn)有技術(shù)的不足,提供一種基于子圖搜索的指針相 關(guān)語義錯(cuò)誤定位方法,它能根據(jù)子圖搜索的方法實(shí)現(xiàn)樹或圖等復(fù)雜結(jié)構(gòu)中的指針相關(guān)語義 錯(cuò)誤的自動(dòng)定位,相比于傳統(tǒng)的別名分析算法,具有更高的準(zhǔn)確性。
      [0006] 本發(fā)明的技術(shù)解決方案:一種基于子圖搜索的指針相關(guān)語義錯(cuò)誤定位方法,其特 征在于步驟如下:
      [0007] (1)根據(jù)失敗的測試用例的輸入,對(duì)程序進(jìn)行符號(hào)執(zhí)行,記錄源程序在這一輸入下 的執(zhí)行軌跡,各個(gè)程序狀態(tài)和指針相關(guān)的復(fù)雜結(jié)構(gòu)的RDF文件;
      [0008] (2)根據(jù)執(zhí)行軌跡,從程序中變量的值與期望值不一致的斷點(diǎn)處,反向?qū)Τ绦蜍壽E 中的每一個(gè)語句生成定位方程組和SPARQL(簡單協(xié)議和RDF查詢語言)查詢文件;
      [0009] (3)通過二分法反向找到使得定位方程組或SPARQL查詢無解的第一個(gè)語句,由斷 點(diǎn)到此語句之間的與斷點(diǎn)變?cè)嚓P(guān)的語句構(gòu)成了一個(gè)極小程序片段;
      [0010] (4) -次定位到的程序片段通常范圍較大,用戶可以再次輸入片段中變量在某個(gè) 狀態(tài)下的預(yù)期值,在此程序片段中再次定位錯(cuò)誤所在的程序片段,不斷重復(fù)這一交互過程, 直到得到的程序片段足夠小,能夠精確地定位到錯(cuò)誤。
      [0011] 根據(jù)本發(fā)明的又一個(gè)方面,其中步驟(1)進(jìn)一步包括步驟:
      [0012] (a)根據(jù)語句類型,包括賦值語句、順序語句、條件語句、循環(huán)語句和空語句,采用 不同的操作語義規(guī)則生成執(zhí)行軌跡;
      [0013] (b)將樹或圖等復(fù)雜結(jié)構(gòu)轉(zhuǎn)換為以XML形式表示的RDF文件;
      [0014]根據(jù)本發(fā)明的又一個(gè)方面,其中步驟(2)進(jìn)一步包括:
      [0015] (a)判斷當(dāng)前語句中是否含有指針變量操作,如果有,轉(zhuǎn)向(b),如果沒有,轉(zhuǎn)向 (c);
      [0016] (b)根據(jù)當(dāng)前語句的類型,采用不同操作語義為該語句生成新的SPARQL查詢,該語 句的定位方程組不更新,與執(zhí)行軌跡中的后一條語句的定位方程組相同;
      [0017] (c)根據(jù)當(dāng)前語句的類型,采用不同操作語義,包括狀態(tài)初始化、賦值語句、條件語 句、循環(huán)語句、輸入,為該當(dāng)前語句生成新的定位方程組,該當(dāng)前語句的SPARQL查詢不更新。
      [0018] 根據(jù)本發(fā)明的又一個(gè)方面,其中步驟(3)進(jìn)一步包括:
      [0019] (a)使用Z3求解器判斷定位方程組是否有解;Z3是微軟研發(fā)的一款可以針對(duì)可滿 足性模理論(SMT的中文翻譯)問題進(jìn)行高效計(jì)算的求解器,被廣泛應(yīng)用于軟件驗(yàn)證和軟件 分析領(lǐng)域,我們使用Z3的動(dòng)態(tài)鏈接庫實(shí)現(xiàn)方程組求解;
      [0020] (b)使用Apache Jena API生成求解SPARQL查詢的插件,以RDF文件和SPARQL文件 作為輸入,求解RDF中是否存在滿足SPARQL中約束的子圖,如果不存在,則表示無解。Apache Jena是一個(gè)開源的Java框架,用于建立語義網(wǎng)和關(guān)聯(lián)數(shù)據(jù)應(yīng)用,其提供了支持SPARQL查詢 的相關(guān)接口。
      [0021] 本發(fā)明與現(xiàn)有技術(shù)相比的優(yōu)點(diǎn)在于:本發(fā)明考慮C語言中指針語義相關(guān)的錯(cuò)誤定 位,通過子圖搜索的方法實(shí)現(xiàn)樹或圖等復(fù)雜結(jié)構(gòu)中的指針相關(guān)語義錯(cuò)誤的自動(dòng)定位,相比 于傳統(tǒng)的別名分析算法,具有更高的準(zhǔn)確性。
      【附圖說明】
      [0022] 圖1為本發(fā)明的算法基本流程圖;
      [0023] 圖2為本發(fā)明的指針賦值語句的處理流程圖;
      [0024]圖3為本發(fā)明的條件語句處理流程圖;
      [0025] 圖4為本發(fā)明的模擬節(jié)點(diǎn)訪問語句處理流程圖。
      【具體實(shí)施方式】
      [0026] 下面參考附圖,對(duì)本發(fā)明的實(shí)施例進(jìn)行詳細(xì)的說明。
      [0027]首先對(duì)本發(fā)明的算法原理進(jìn)行說明。
      [0028] 函數(shù)內(nèi)調(diào)試形式化的基本思路是:當(dāng)程序出現(xiàn)了一個(gè)失敗的測試用例時(shí),根據(jù)用 戶預(yù)期的程序輸入和輸出,從程序中找出與用戶預(yù)期矛盾的極小程序片段。若此程序片段 仍然較大,則通過不斷的與用戶交互,讓用戶標(biāo)記其中正確的語句或者讓用戶進(jìn)一步給出 片段中變量在某些狀態(tài)下的預(yù)期值,利用這些新的信息縮小語句片段的范圍,直到最終定 位到程序中的一個(gè)錯(cuò)誤。
      [0029] 具體而言,本發(fā)明所提出的改進(jìn)算法基本流程如圖1所示。
      [0030] 本發(fā)明主要包括的核心思想:根據(jù)程序的執(zhí)行軌跡和期望值,反向?yàn)槊織l執(zhí)行語 句生成定位方程組和SPARQL查詢,主要通過定位方程組表示普通變量間的約束關(guān)系,以 SPARQL查詢表示指針間的依賴關(guān)系,通過求解定位方程組和SPARQL查詢得到第一條無解的 語句,從而推斷出包含錯(cuò)誤的極小程序片段。
      [0031 ]在描述算法前先定義如下變量及方法:
      [0032] 1 .設(shè)狀態(tài)〇為語句S執(zhí)行時(shí)的狀態(tài),用k-元組σ.:(? η %,…,η 乂)表示,其中 ·' ρ ?,表示變量Xi的值為m;
      [0033] 2.狀態(tài)#記錄了為語句S生成SPARQL查詢時(shí),程序中的指針變量Pi到其在SPARQL中 表示變量ri的映射,由于SPARQL語法規(guī)定所有查詢變量是以問號(hào)開頭的字符串,因此需要 此指針狀態(tài)表進(jìn)行映射。〇-外 H 4D,Pi4ri,ieN,PV={pi,'",pk},AD={ri^",rk};
      [0034] PV表示程序中相關(guān)的指針變量的集合,AD表示這些指針變量在SPARQL查詢中所映 射的變量集合。表示指針變量Pi在SPARQL查詢中用ri表示。
      [0035] 3.令S為一個(gè)if語句或while語句的頭語句,如if(b),〇為語句S執(zhí)行時(shí)的狀態(tài),二 元組〈S, 〇>被稱為一個(gè)B-環(huán)境。用ε表示B-環(huán)境棧,其中每個(gè)元素都是一個(gè)B-環(huán)境;
      [0036] 4.三元組〈S,σ,σ*,ε>為一個(gè)S*_結(jié)構(gòu),π為軌跡棧,π中每個(gè)元素都是S*_結(jié)構(gòu),Τ-結(jié) 構(gòu)定義為:π|〈3,σ,σ'ε>。
      [0037] 5. rq存儲(chǔ)SPARQL查詢語句,eq存儲(chǔ)定位方程組,每條執(zhí)行語句S的相關(guān)信息用三元 組(巧,69,〈5,〇,〇*,8>)表示,0*是一個(gè)由三元組(四,69,〈5,〇,〇*,〖>)結(jié)構(gòu)組成的列表,存儲(chǔ) 執(zhí)行軌跡中所有語句的SPARQL查詢和定位方程組。
      [0038]本發(fā)明的算法描述如下,如圖1:
      [0039] 1.為出錯(cuò)源程序生成執(zhí)行軌跡和RDF文件其中執(zhí)行軌跡的生成遵循如下操作語 義:
      [0040] (a)賦值語句:x = e,計(jì)算表達(dá)式e在當(dāng)前語句的狀態(tài)σ下的值,并用此值更新狀態(tài)σ 中X的值,將當(dāng)前語句對(duì)應(yīng)的結(jié)構(gòu)壓入軌跡棧π中;
      [0041 ] (b)順序語句:如果51和52為相鄰的順序語句,則根據(jù)語句類型,對(duì)Si進(jìn)行符號(hào)執(zhí) 行;
      [0042] (c)if語句:if(b){S1;}else{S2;}將當(dāng)前語句對(duì)應(yīng)的結(jié)構(gòu)壓入軌跡棧π中;計(jì)算 當(dāng)前語句狀態(tài)σ下條件表達(dá)式b的值,若為真,則將條件語句頭if (b)及其真值true壓入環(huán)境 棧ε中,接下來對(duì)Si語句體進(jìn)行軌跡生成;若為假,則將條件語句頭if(b)及其真值false壓 入環(huán)境棧ε中,接下來對(duì)&語句體進(jìn)行軌跡生成。
      [0043] (d)while語句:while(b) {S;}將當(dāng)前語句對(duì)應(yīng)的結(jié)構(gòu)壓入軌跡棧π中;計(jì)算當(dāng) 前語句狀態(tài)σ下條件表達(dá)式b的值,若為真,則將條件語句頭while (b)及其真值true壓入環(huán) 境棧ε中,接下來對(duì)S語句體進(jìn)行軌跡生成,執(zhí)行完S語句體的最后一條語句時(shí),查看環(huán)境棧 頂?shù)恼Z句類型,如果是循環(huán)語句,則重復(fù)本過程;若為假,則將條件語句頭while(b)及其真 值false壓入環(huán)境棧ε中,接下來對(duì)該循環(huán)后的語句進(jìn)行軌跡生成。
      [0044] RDF文件的生成方法如下:若程序中存在樹或圖等復(fù)雜結(jié)構(gòu),則將其表示為XML(可 擴(kuò)展標(biāo)記語言)形式的RDF文件。每個(gè)節(jié)點(diǎn)用一個(gè)〈rdf: Description〉標(biāo)簽進(jìn)行描述,節(jié)點(diǎn)的 每個(gè)屬性都可以用一個(gè)〈rdf: Description〉下的子標(biāo)簽進(jìn)行描述。
      [0045] 2.根據(jù)執(zhí)行軌跡,從程序中變量的值與期望值不一致的斷點(diǎn)處,反向?qū)Τ绦蜍壽E 中的每一個(gè)語句生成定位方程組和SPARQL查詢文件。根據(jù)語句類型不同,有如下操作語義 規(guī)則:
      [0046] (a)初始狀態(tài):如果斷點(diǎn)語句為指針相關(guān)語句,被訪問節(jié)點(diǎn)r的期望值為w,則rq的 初始值為〈?1,'^1116,'\¥>,〇 :1:的內(nèi)容為〈1',?1>,表示指針1'在5?41?(^查詢中用符號(hào)?1表示,?1 的值應(yīng)為w,eq的初始值為空;如果斷點(diǎn)語句不涉及指針,則rq的初始值為空,eq的初始值為 {y = n},表示程序終止時(shí),某個(gè)變量y的期望值為η。綜上,P#的初始值為[(rq,eq,〈skip,0'
      當(dāng)前第1頁1 2 
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1