一種基于狀態(tài)分區(qū)的靜態(tài)缺陷檢測(cè)求精方法
【專利摘要】本發(fā)明涉及一種基于狀態(tài)分區(qū)的靜態(tài)缺陷檢測(cè)求精方法,包括:S1:將待檢測(cè)的缺陷模式屬性狀態(tài)機(jī)集合置于待測(cè)函數(shù)控制流入口;S2:程序通過路徑由前置位置執(zhí)行到目標(biāo)位置;S3:屬性狀態(tài)機(jī)的狀態(tài)沿程序路徑進(jìn)行傳遞以及變化,在目標(biāo)位置處到達(dá)預(yù)設(shè)狀態(tài);S4:取控制流當(dāng)前節(jié)點(diǎn),判斷是否為控制流最后節(jié)點(diǎn);S5:如果不為控制流最后節(jié)點(diǎn),則根據(jù)當(dāng)前節(jié)點(diǎn)信息更新屬性狀態(tài)條件以及屬性狀態(tài)分區(qū)集合信息。本發(fā)明提供的基于狀態(tài)分區(qū)技術(shù)的缺陷檢測(cè)求精方法,給出了缺陷模式的定義,缺陷模式狀態(tài)機(jī)的定義,路徑條件的定義,狀態(tài)條件的定義,狀態(tài)分區(qū)的定義,基于狀態(tài)分區(qū)技術(shù),給出缺陷檢測(cè)求精方法,從而提高缺陷檢測(cè)的精度。
【專利說明】一種基于狀態(tài)分區(qū)的靜態(tài)缺陷檢測(cè)求精方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)軟件靜態(tài)缺陷檢測(cè)中的檢測(cè)求精技術(shù),尤其涉及一種基于狀態(tài)分區(qū)的靜態(tài)缺陷檢測(cè)求精方法。
【背景技術(shù)】
[0002]代碼中的缺陷是導(dǎo)致軟件故障和安全漏洞問題的重要原因?;谌毕莸能浖y(cè)試技術(shù)可以分為動(dòng)態(tài)檢測(cè)技術(shù)和靜態(tài)檢測(cè)技術(shù)。
[0003]其中,靜態(tài)檢測(cè)技術(shù)不運(yùn)行被測(cè)程序,主要通過各種靜態(tài)分析方法來發(fā)現(xiàn)程序中的缺陷,從可計(jì)算性理論的角度看,靜態(tài)分析是一個(gè)不可判定問題,靜態(tài)分析的不可判定性實(shí)際上意味著任何自動(dòng)化的靜態(tài)分析系統(tǒng),針對(duì)一個(gè)程序的非平凡屬性,例如是否存在運(yùn)行時(shí)錯(cuò)誤,不可能做到既是可靠的又是完備的??煽康撵o態(tài)分析意味著,如果分析結(jié)果沒有報(bào)告某類運(yùn)行時(shí)錯(cuò)誤,則程序中肯定不存在某類運(yùn)行時(shí)錯(cuò)誤,也就是說沒有漏報(bào);完備的靜態(tài)分析意味著,如果分析結(jié)果報(bào)告了某類運(yùn)行時(shí)錯(cuò)誤,則程序中肯定存在某類運(yùn)行時(shí)錯(cuò)誤,也就是說沒有誤報(bào),大量的誤報(bào)會(huì)使人對(duì)檢測(cè)工具失去信心。
[0004]基于數(shù)據(jù)流分析的路徑敏感檢測(cè)方法考慮程序路徑分支間的組合關(guān)系,可以記錄控制流圖上的不同路徑信息,從而有效減少靜態(tài)分析時(shí)的誤報(bào),精確的路徑敏感分析方法會(huì)記錄程序中的所有路徑信息,在控制流分支較多或存在循環(huán)時(shí)會(huì)導(dǎo)致路徑爆炸,從而無法進(jìn)行分析,因此,實(shí)用的路徑敏感分析方法往往會(huì)采用一些折衷策略:不同路徑上的數(shù)據(jù)流信息在控制流匯合處合并,例如采用變量的抽象取值來表示狀態(tài)條件,在控制流匯合節(jié)點(diǎn)通過合并相同狀態(tài)中的狀態(tài)條件來避免路徑爆炸,但該方法的狀態(tài)合并策略沒有區(qū)分在哪些匯合節(jié)點(diǎn)可以進(jìn)行安全的狀態(tài)合并,導(dǎo)致與缺陷有關(guān)的路徑信息丟失從而引起誤報(bào)。
【發(fā)明內(nèi)容】
[0005]本發(fā)明所要解決的技術(shù)問題是如何避免全路徑敏感分析時(shí)的路徑爆炸問題,且不會(huì)因?yàn)榇植诘暮喜⒉呗詭淼木葥p失引起的誤報(bào)的關(guān)鍵問題。
[0006]為此目的,本發(fā)明提出了一種基于狀態(tài)分區(qū)的靜態(tài)缺陷檢測(cè)求精方法,包括具體以下步驟:
[0007]S1:將待檢測(cè)的缺陷模式的屬性狀態(tài)機(jī)的狀態(tài)集合置于待測(cè)函數(shù)控制流入口 ;
[0008]S2:程序通過路徑由前置位置執(zhí)行到目標(biāo)位置;
[0009]S3:屬性狀態(tài)機(jī)的狀態(tài)沿程序路徑進(jìn)行傳遞以及變化,在所述目標(biāo)位置處到達(dá)預(yù)設(shè)狀態(tài);
[0010]S4:取控制流當(dāng)前節(jié)點(diǎn),判斷是否為控制流最后節(jié)點(diǎn);
[0011]S5:如果不為控制流最后節(jié)點(diǎn),則根據(jù)當(dāng)前節(jié)點(diǎn)信息更新屬性狀態(tài)條件以及屬性狀態(tài)分區(qū)集合信息。
[0012]具體地,所述置于待測(cè)函數(shù)控制流入口的集合為從控制流頭節(jié)點(diǎn)依次進(jìn)行狀態(tài)迭代的缺陷模式屬性狀態(tài)機(jī)集合,其中,每個(gè)狀態(tài)機(jī)的當(dāng)前狀態(tài)都關(guān)聯(lián)當(dāng)前控制流節(jié)點(diǎn)的所有變量取值信息。
[0013]進(jìn)一步地,所述步驟S5進(jìn)一步包括:
[0014]將相同狀態(tài)的所述屬性狀態(tài)條件進(jìn)行合并,所述屬性狀態(tài)分區(qū)不變。
[0015]進(jìn)一步地,所述步驟S5進(jìn)一步包括:
[0016]通過所述屬性狀態(tài)條件判斷不可達(dá)路徑,并刪除所述屬性狀態(tài)分區(qū)中不可達(dá)屬性狀態(tài)分區(qū)信息。
[0017]進(jìn)一步地,所述步驟S5進(jìn)一步包括:若存在$err0r,則判定為缺陷狀態(tài)遷移。
[0018]具體地,若所述屬性狀態(tài)條件包含屬性狀態(tài)分區(qū)信息,則保存該屬性狀態(tài)分區(qū)信息,若所述屬性狀態(tài)條件與所述狀態(tài)分區(qū)信息不存在包含關(guān)系,則刪除屬性狀態(tài)分區(qū)信息。
[0019]具體地,還包括,刪除重復(fù)所述屬性狀態(tài)分區(qū)信息。
[0020]通過采用本發(fā)明所公開一種基于狀態(tài)分區(qū)的靜態(tài)缺陷檢測(cè)求精方法,該方法能夠處理同一路徑引入的隱含變量關(guān)聯(lián)關(guān)系,從而能夠減少對(duì)控制流匯合節(jié)點(diǎn)進(jìn)行狀態(tài)合并帶來的精度損失,具體地,給出了缺陷模式的定義,缺陷模式狀態(tài)機(jī)的定義,路徑條件的定義,狀態(tài)條件的定義,狀態(tài)分區(qū)的定義,基于狀態(tài)分區(qū)技術(shù),給出缺陷檢測(cè)求精方法,從而提高缺陷檢測(cè)的精度,該方法可以表示同一路徑引入的隱含變量關(guān)聯(lián)關(guān)系,避免了不同分支的數(shù)據(jù)流信息“過早”地進(jìn)行聚合所造成的精度損失,進(jìn)而提高了分析精度。
【專利附圖】
【附圖說明】
[0021]通過參考附圖會(huì)更加清楚的理解本發(fā)明的特征和優(yōu)點(diǎn),附圖是示意性的而不應(yīng)理解為對(duì)本發(fā)明進(jìn)行任何限制,在附圖中:
[0022]圖1示出了本發(fā)明實(shí)施例中的一種基于狀態(tài)分區(qū)的靜態(tài)缺陷檢測(cè)求精方法的步驟流程圖;
[0023]圖2示出了本發(fā)明另一實(shí)施例中的一種基于狀態(tài)分區(qū)的靜態(tài)缺陷檢測(cè)求精方法的步驟流程圖。
【具體實(shí)施方式】
[0024]下面將結(jié)合附圖對(duì)本發(fā)明的實(shí)施例進(jìn)行詳細(xì)描述。
[0025]首先,缺陷模式是對(duì)程序?qū)傩缘囊环N描述,如果違反該屬性則造成一個(gè)缺陷。例如,申請(qǐng)的資源在使用完后必須釋放,否則造成資源泄露缺陷,且缺陷模式可以用缺陷狀態(tài)機(jī)來表示,其中,狀態(tài)機(jī)是對(duì)程序語(yǔ)義的一種常用和易于理解的抽象表示,缺陷模式狀態(tài)機(jī)用于描述缺陷模式的有限狀態(tài)機(jī),包括狀態(tài)集合D、狀態(tài)遷移集合T以及遷移條件集合 Conditions,其中 D = {$start, $erro;r} U Dother, T:DXConditions — D.$start 和$error分別表示起始狀態(tài)和錯(cuò)誤狀態(tài),Dother表示其它中間狀態(tài)的集合。
[0026]進(jìn)一步地,數(shù)組下標(biāo)的使用必須在其數(shù)組聲明大小范圍以內(nèi),否則會(huì)造成數(shù)組越界缺陷;指針在解引用之前必須確保其指向非空,否則會(huì)造成空指針引用缺陷。
[0027]為了更好的理解與應(yīng)用本發(fā)明提供的一種基于狀態(tài)分區(qū)的靜態(tài)缺陷檢測(cè)求精方法,進(jìn)行以下圖示。
[0028]如圖1所示,本發(fā)明提供了一種基于狀態(tài)分區(qū)的靜態(tài)缺陷檢測(cè)求精方法,包括具體以下步驟:[0029]步驟S1:將待檢測(cè)的缺陷模式的屬性狀態(tài)機(jī)的狀態(tài)集合置于待測(cè)函數(shù)的控制流入口。
[0030]步驟S2:程序通過路徑由前置位置執(zhí)行到目標(biāo)位置。
[0031]步驟S3:屬性狀態(tài)機(jī)的狀態(tài)沿程序路徑進(jìn)行傳遞以及變化,在目標(biāo)位置處到達(dá)預(yù)設(shè)狀態(tài)。
[0032]具體地,置于待測(cè)函數(shù)控制流入口的集合為從控制流頭節(jié)點(diǎn)依次進(jìn)行狀態(tài)迭代的缺陷模式屬性狀態(tài)機(jī)集合,其中,每個(gè)狀態(tài)機(jī)的當(dāng)前狀態(tài)都關(guān)聯(lián)當(dāng)前控制流節(jié)點(diǎn)的所有變
量取值信息。
[0033]步驟S4:取控制流當(dāng)前節(jié)點(diǎn),判斷是否為控制流最后節(jié)點(diǎn)。
[0034]步驟S5:如果不為控制流最后節(jié)點(diǎn),則根據(jù)當(dāng)前節(jié)點(diǎn)信息更新屬性狀態(tài)條件以及屬性狀態(tài)分區(qū)集合信息。
[0035]進(jìn)一步地,步驟S5進(jìn)一步包括:將相同狀態(tài)的屬性狀態(tài)條件進(jìn)行合并,屬性狀態(tài)分區(qū)不變;通過屬性狀態(tài)條件判斷不可達(dá)路徑,并刪除屬性狀態(tài)分區(qū)中不可達(dá)屬性狀態(tài)分
區(qū)信息。
[0036]更進(jìn)一步地,若屬性狀態(tài)條件包含屬性狀態(tài)分區(qū)信息,則保存該屬性狀態(tài)分區(qū)信息;若屬性狀態(tài)條件與狀態(tài)分區(qū)信息不存在包含關(guān)系,則刪除屬性狀態(tài)分區(qū)信息;刪除重復(fù)屬性狀態(tài)分區(qū)信息。若存在$error,則判定為缺陷狀態(tài)遷移。
[0037]如圖2所示,為本發(fā)明另一實(shí)施例中的一種基于狀態(tài)分區(qū)的靜態(tài)缺陷檢測(cè)求精方法的步驟流程圖。
[0038]步驟SlOl:將產(chǎn)生的狀態(tài)機(jī)制實(shí)例集合置于待測(cè)函數(shù)控制流入口。
[0039]步驟S102:取下一節(jié)點(diǎn),判斷是否為最后節(jié)點(diǎn)。
[0040]步驟S103,若不為最后節(jié)點(diǎn),則根據(jù)當(dāng)前節(jié)點(diǎn)信息更新屬性狀態(tài)條件以及屬性狀態(tài)分區(qū)集合信息。
[0041]步驟S104:根據(jù)當(dāng)前節(jié)點(diǎn)屬性狀態(tài)條件,刪除屬性狀態(tài)分區(qū)中不可達(dá)屬性狀態(tài)分
區(qū)信息。
[0042]步驟S105:根據(jù)屬性狀態(tài)條件以及屬性狀態(tài)分區(qū)進(jìn)行缺陷狀態(tài)遷移。
[0043]步驟S106:結(jié)束遍歷。
[0044]為了更好的理解與應(yīng)用本發(fā)明提出的一種基于狀態(tài)分區(qū)的靜態(tài)缺陷檢測(cè)求精方法,結(jié)合程序代碼進(jìn)行以下示例。
[0045]在程序P的執(zhí)行過程中,程序的執(zhí)行狀態(tài)可由二元組口 1,P □表示。其中,I代表當(dāng)前的程序執(zhí)行位置;P代表該狀態(tài)下的環(huán)境。程序環(huán)境記錄了程序中當(dāng)前每一個(gè)變量X的值,在環(huán)境P下,變量X的取值記作P (X)。路徑敏感的缺陷檢測(cè)方法,從控制流圖頭節(jié)點(diǎn)依次進(jìn)行狀態(tài)迭代,每個(gè)狀態(tài)都關(guān)聯(lián)當(dāng)前控制流點(diǎn)的所有變量取值信息。
[0046]程序通過路徑S執(zhí)行到位置1,則S上的謂詞和賦值操作對(duì)I處環(huán)境P中各變量的可能取值范圍進(jìn)行了限定。本發(fā)明將S在I處限定的變量取值范圍集合稱作S在I處的路徑條件。記作R(S,I)。例如:在如下程序中,L2處的路徑條件為{dump[true], flag[l, I]}。
[0047]其中,程序通過路徑S執(zhí)行到位置1,屬性狀態(tài)機(jī)的狀態(tài)沿S進(jìn)行傳遞和變化,在I處到達(dá)狀態(tài)σ,將R(s,l)記錄在σ上,稱為屬性狀態(tài)條件。包含條件的屬性狀態(tài)表示為o:{R(S,l)}。例如:在如下程序中L2處,資源泄漏狀態(tài)機(jī)的屬性狀態(tài)為:$start:{dump[true], flag[l, I]}。
[0048]進(jìn)一步地,本發(fā)明用變量的抽象取值來表示狀態(tài)條件,在數(shù)據(jù)流迭代過程中不斷更新狀態(tài)條件,就會(huì)導(dǎo)致缺陷狀態(tài)發(fā)生遷移,一旦發(fā)現(xiàn)狀態(tài)遷移$err0r就表示程序中存在該類型的缺陷.例如如下的程序代碼片段,dump和flag分別用于不同的資源操作,dump僅申請(qǐng)資源而flag僅釋放資源,這種編程模式在實(shí)際中也是常見的,對(duì)其中存在的資源泄露
缺陷進(jìn)行檢測(cè),采用相同狀態(tài)合并的路徑敏感分析方法,其狀態(tài)遷移序列如表I所示.[0049]
【權(quán)利要求】
1.一種基于狀態(tài)分區(qū)的靜態(tài)缺陷檢測(cè)求精方法,其特征在于,包括具體以下步驟: S1:將待檢測(cè)的缺陷模式的屬性狀態(tài)機(jī)的狀態(tài)集合置于待測(cè)函數(shù)控制流入口 ; 52:程序通過路徑由前置位置執(zhí)行到目標(biāo)位置; 53:屬性狀態(tài)機(jī)的狀態(tài)沿程序路徑進(jìn)行傳遞以及變化,在所述目標(biāo)位置處到達(dá)預(yù)設(shè)狀態(tài); 54:取控制流當(dāng)前節(jié)點(diǎn),判斷是否為控制流最后節(jié)點(diǎn); 55:如果不為控制流最后節(jié)點(diǎn),則根據(jù)當(dāng)前節(jié)點(diǎn)信息更新屬性狀態(tài)條件以及屬性狀態(tài)分區(qū)集合信息。
2.如權(quán)利要求1所述的方法,其特征在于,所述置于待測(cè)函數(shù)控制流入口的集合為從控制流頭節(jié)點(diǎn)依次進(jìn)行狀態(tài)迭代的缺陷模式屬性狀態(tài)機(jī)集合,其中,每個(gè)狀態(tài)機(jī)的當(dāng)前狀態(tài)都關(guān)聯(lián)當(dāng)前控制流節(jié)點(diǎn)的所有變量取值信息。
3.如權(quán)利要求1所述的方法,其特征在于,所述步驟S5進(jìn)一步包括: 將相同狀態(tài)的所述屬性狀態(tài)條件進(jìn)行合并,所述屬性狀態(tài)分區(qū)不變。
4.如權(quán)利要求1所述的方法,其特征在于,所述步驟S5進(jìn)一步包括: 通過所述屬性狀態(tài)條件判斷不可達(dá)路徑,并刪除所述屬性狀態(tài)分區(qū)中不可達(dá)屬性狀態(tài)分區(qū)信息。
5.如權(quán)利要求1所述的方法,其特征在于,所述步驟S5進(jìn)一步包括:若存在$error,則判定為缺陷狀態(tài)遷移。
6.如權(quán)利要求4所述的方法,其特征在于,若所述屬性狀態(tài)條件包含屬性狀態(tài)分區(qū)信息,則保存該屬性狀態(tài)分區(qū)信息,若所述屬性狀態(tài)條件與所述狀態(tài)分區(qū)信息不存在包含關(guān)系,則刪除屬性狀態(tài)分區(qū)信息。
7.如權(quán)利要求4所述的方法,其特征在于,還包括,刪除重復(fù)所述屬性狀態(tài)分區(qū)信息。
【文檔編號(hào)】G06F11/36GK103927258SQ201410138438
【公開日】2014年7月16日 申請(qǐng)日期:2014年4月8日 優(yōu)先權(quán)日:2014年4月8日
【發(fā)明者】金大海, 張大林, 宮云戰(zhàn), 王雅文, 黃俊飛 申請(qǐng)人:北京郵電大學(xué)