本發(fā)明涉及軟件測試領(lǐng)域,更具體地,涉及指針修改影響的分析方法和系統(tǒng)。
背景技術(shù):
在計算機(jī)科學(xué)領(lǐng)域,指向分析是一種用于分析指針和內(nèi)存引用所指向的變量或內(nèi)存地址的靜態(tài)代碼分析技術(shù)。指向分析技術(shù)是很多更為復(fù)雜的代碼分析技術(shù)的基礎(chǔ),例如編譯優(yōu)化、代碼缺陷檢測以及本文提到的指針修改影響分析。
steensgaard算法和andersen算法為兩種公認(rèn)的經(jīng)典指向分析算法。steensgaard算法效率較高,其時間復(fù)雜度幾乎是線性的,但精度低;andersen算法有較高的精度,但時間復(fù)雜度接近o(n3)。
指針修改影響分析技術(shù)能夠反映程序中的由指針引起的跨函數(shù)定義使用關(guān)系,在編譯優(yōu)化、基于數(shù)據(jù)流的檢測、增量靜態(tài)語義分析等諸多領(lǐng)域被廣泛使用。高效的指針修改分析技術(shù)在程序分析和編譯領(lǐng)域都是十分必要的。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供一種克服上述問題或者至少部分地解決上述問題的指針修改影響的分析方法和系統(tǒng)。
根據(jù)本發(fā)明的一個方面,提供一種指針修改影響的分析方法,包括:
s1、在程序代碼中查找該語句中變量的等價變量,并查找該等價變量所有的定義點(diǎn),構(gòu)成分析結(jié)果集合;
s2、基于定義點(diǎn)、語句以及程序入口的關(guān)系,獲得對應(yīng)該定義點(diǎn)的多個路徑條件;以及
s3、判斷所有所述路徑條件是否可同時滿足,若不可同時滿足,則將該定義點(diǎn)從所述分析結(jié)果集合中剔除。
根據(jù)本發(fā)明的一個方面,還提供一種判斷修改程序的指針是否造成影響的系統(tǒng),包括:
初步判斷模塊,用于在程序代碼中查找該語句中變量的等價變量,并查找該等價變量所有的定義點(diǎn),構(gòu)成分析結(jié)果集合;
結(jié)果集合模塊,在程序代碼中查找該語句中變量的等價變量,并查找該等價變量所有的定義點(diǎn),構(gòu)成分析結(jié)果集合;以及
再判斷模塊,判斷所有所述路徑條件是否可同時滿足,若不可同時滿足,則將該定義點(diǎn)從所述分析結(jié)果集合中剔除。
本申請?zhí)岢鲆环N指針修改影響的分析方法和系統(tǒng)。在傳統(tǒng)指針修改影響分析算法的基礎(chǔ)上,利用跨函數(shù)的多個條件計算,精化獲得的結(jié)果,從而提高結(jié)果的精度,做到了部分路徑敏感以及流敏感,使采用該分析算法的靜態(tài)代碼缺陷檢測結(jié)果更加精確。
附圖說明
圖1為現(xiàn)有技術(shù)中示意圖;
圖2為根據(jù)本發(fā)明實(shí)施例中采用本發(fā)明所述方法的示例程序一的代碼示意圖;
圖3為根據(jù)本發(fā)明實(shí)施例中采用本發(fā)明所述方法的示例程序一的控制流圖;
圖4為根據(jù)本發(fā)明實(shí)施例中采用本發(fā)明所述方法的示例程序一的超圖;
圖5為根據(jù)本發(fā)明實(shí)施例中采用本發(fā)明所述方法的示例程序一的指向圖;
圖6為根據(jù)本發(fā)明實(shí)施例中采用本發(fā)明所述方法的示例程序二的代碼示意圖;
圖7為根據(jù)本發(fā)明實(shí)施例中采用本發(fā)明所述方法的示例程序二的控制流圖;
圖8為根據(jù)本發(fā)明實(shí)施例中采用本發(fā)明所述方法的示例程序二的超圖;
圖9為根據(jù)本發(fā)明實(shí)施例中采用本發(fā)明所述方法的示例程序二的指向圖;
圖10為根據(jù)本發(fā)明實(shí)施例中采用本發(fā)明所述方法的示例程序三的代碼示意圖;
圖11為根據(jù)本發(fā)明實(shí)施例中采用本發(fā)明所述方法的示例程序三的控制流圖;
圖12為根據(jù)本發(fā)明實(shí)施例中采用本發(fā)明所述方法的示例程序三的超圖;
圖13為根據(jù)本發(fā)明實(shí)施例中采用本發(fā)明所述方法的示例程序三的指向圖。
具體實(shí)施方式
下面結(jié)合附圖和實(shí)施例,對本發(fā)明的具體實(shí)施方式作進(jìn)一步詳細(xì)描述。以下實(shí)施例用于說明本發(fā)明,但不用來限制本發(fā)明的范圍。
圖1示出了本發(fā)明提供的一種指針修改影響的分析方法,包括:
s1、在程序代碼中查找該語句中變量的等價變量,并查找該等價變量所有的定義點(diǎn),構(gòu)成分析結(jié)果集合;
s2、基于定義點(diǎn)、語句以及程序入口的關(guān)系,獲得對應(yīng)該定義點(diǎn)的多個路徑條件;以及
s3、判斷所有所述路徑條件是否可同時滿足,若不可同時滿足,則將該定義點(diǎn)從所述分析結(jié)果集合中剔除。
在一個實(shí)施例中,所述步驟s2包括:
從所述定義點(diǎn)至該語句的路徑條件;
從所述定義點(diǎn)的程序的入口至所述定義點(diǎn)的路徑條件;
從所述語句的程序的入口至該語句的路徑條件;以及
從使不同變量產(chǎn)生等價關(guān)系的控制流語句的程序入口至該控制流語句的路徑條件。
在一個實(shí)施例中,所述步驟s2進(jìn)一步包括:所述步驟s2包括:從每一個路徑條件的終點(diǎn)進(jìn)行逆向遞歸搜索,獲得從起點(diǎn)至終點(diǎn)間的所有路徑,對具有相同路徑的路徑條件進(jìn)行&&操作,再對不同路徑的路徑條件進(jìn)行||操作,得到該條件;
其中,所述遞歸搜索在遇到起點(diǎn)、遇到覆蓋起點(diǎn)的定義點(diǎn)或搜索到的語句沒有前驅(qū)語句時停止。
對于第一條件,該條件的起點(diǎn)為定義點(diǎn),終點(diǎn)為語句,對于第二條件,該條件的起點(diǎn)為定義點(diǎn)的程序的入口,終點(diǎn)為定義點(diǎn),對于第三條件,該條件的起點(diǎn)為語句的程序的入口,終點(diǎn)為語句,對于第四條件,該條件的起點(diǎn)為所述控制流語句的程序入口,終點(diǎn)為控制流語句。
兩個語句之間的條件示例:
在所述sg中,“intc=0”到“c++”的條件為“a>b”,“intc=0”到“c--”的條件為“!(a>b)”。
在一個實(shí)施例中,所述步驟s1包括:
s1.1、基于程序的控制流圖cfg,分別獲得靜態(tài)單賦值形式的控制流圖ssa_cfg和超圖sg;
靜態(tài)單賦值(staticsingle-assignment,ssa)是程序的一種中間表示,支持高效的數(shù)據(jù)流分析技術(shù),每個變量名字在ssa形式的程序中只會被賦值一次。目前幾乎所有的編譯器,包括很多虛擬機(jī)、解釋器中,都有ssa的應(yīng)用??蓾M足性模理論(satisfiabilitymodulotheories)用于研究布爾表達(dá)式的可滿足性問題,它是對多類型階邏輯公式進(jìn)行可滿足性判定的理論。常量傳播(constantpropagation)技術(shù)被應(yīng)用于編譯優(yōu)化和代碼靜態(tài)分析領(lǐng)域當(dāng)中,可將程序中能夠計算出結(jié)果的變量替換為常量,用于計算程序中的控制流約束。
超圖(supergraph)描述了程序跨函數(shù)控制流關(guān)系的有向圖,可反映函數(shù)間的調(diào)用關(guān)系,也可在其中獲取程序的數(shù)據(jù)流信息。
s1.2、對所述ssa_cfg進(jìn)行指向分析,獲得指針指向圖pg,基于所述pg,獲得語句中變量的等價信息;以及
s1.3、基于所述等價信息,在所述sg上進(jìn)行正向數(shù)據(jù)流分析,獲得指針修改產(chǎn)生的、初步判斷為具有定義使用關(guān)系的定義點(diǎn),構(gòu)成分析結(jié)果集合;
其中,所述變量包括指針以及指針?biāo)赶虻膬?nèi)存地址。
在一個實(shí)施例中,所述步驟s1.2包括對所述ssa_cfg中函數(shù)內(nèi)的指向分析:
對于賦值語句a=&b,在所述pg中創(chuàng)建結(jié)點(diǎn)“a”、“&b”和“b”(若已存在則無需再創(chuàng)建),并使得結(jié)點(diǎn)“a”和“&b”均指向結(jié)點(diǎn)“b”,并在有向邊上記錄該指向產(chǎn)生的語句“a=&b”;
對于賦值語句“a=b;”,且a和b的類型皆為指針,則在所述pg中創(chuàng)建結(jié)點(diǎn)“a”和“b”,并使得結(jié)點(diǎn)“a”指向結(jié)點(diǎn)“b”所指向的所有結(jié)點(diǎn),若“b”未指向任何結(jié)點(diǎn),則創(chuàng)建結(jié)點(diǎn)“a=b”并使得該結(jié)點(diǎn)被結(jié)點(diǎn)“a”、“b”指向,并在有向邊上記錄該指向產(chǎn)生的語句“a=b”;
對于程序中的變量“*a”,在所述pg中創(chuàng)建結(jié)點(diǎn)“a”和“*a”,并使得結(jié)點(diǎn)“a”指向“*a”;以及
對于程序中的變量“&a”,在所述pg中創(chuàng)建結(jié)點(diǎn)“a”和“&a”,并使得結(jié)點(diǎn)“&a”指向“a”。
在一個實(shí)施例中,所述步驟s1.2還包括對所述ssa_cfg中函數(shù)間的指向分析:
基于函數(shù)調(diào)用語句“c”及其原型“d”,在所述pg中創(chuàng)建結(jié)點(diǎn)“c”和“d”,并使得“c”和“d”指向彼此所指向的結(jié)點(diǎn),若二者均未指向任何結(jié)點(diǎn),則創(chuàng)建結(jié)點(diǎn)“c=d”,并使得該結(jié)點(diǎn)被結(jié)點(diǎn)“c”、“d”指向,并在有向邊上記錄該指向產(chǎn)生的語句“c”。
在一個實(shí)施例中,所述步驟s1.2中的等價信息包括:
等價類指針,即指向同一個結(jié)點(diǎn)的指針;以及
等價類內(nèi)存地址,即被同一個結(jié)點(diǎn)指向的內(nèi)存地址。
在一個實(shí)施例中,所述步驟s1.3包括:
s1.3.1、基于所述sg,獲得定義點(diǎn)、對應(yīng)該定義點(diǎn)的被賦變量、使用點(diǎn)和對應(yīng)該使用點(diǎn)的使用變量;以及
s1.3.2、對所述sg中的每一個語句,從所有定義點(diǎn)中搜索該語句的前驅(qū)語句對應(yīng)的定義點(diǎn),獲得對應(yīng)該語句的分析結(jié)果集合;
其中,所述定義點(diǎn)用于對語句中的被賦變量進(jìn)行賦值,所述使用點(diǎn)用于對語句中的賦值變量進(jìn)行使用。
以下列程序?yàn)槔?/p>
其中指針“a”和指針“b”為等價類,其等價關(guān)系由語句“b=a”產(chǎn)生,該程序?qū)⒌玫饺缦露x使用關(guān)系:
{*a=5}—>printf(“%d”,*b)。
在一個實(shí)施例中,當(dāng)所述語句為賦值語句時,所述步驟s1.3還包括:
s1.3.3、從所述分析結(jié)果集合中刪除對所述被賦變量或被賦變量的等價類進(jìn)行定義的定義點(diǎn),并將該賦值語句添加至所述分析結(jié)果集合中。
圖2示出了采用本發(fā)明的示例程序一的代碼示意圖,本實(shí)施例以代碼中第11行(*m)++為例,計算對該語句產(chǎn)生影響的別名修改位置,該語句對變量m進(jìn)行解引用,所以需要考慮m及其等價類的相關(guān)定義點(diǎn)產(chǎn)生的影響。
首先構(gòu)造示例程序一的控制流圖和超圖,圖3示出了示例程序一的控制流圖,圖4示出了示例程序一的超圖,
圖4中每一個橢圓框代表一個語句,圖中語句entry-g到語句*z=x之間需要滿足條件:*x大于*y(語句switch*x>*y就是條件),在條件下面有兩條邊出去,帶*的表示條件成立的時候執(zhí)行的語句,帶0的表示條件不成立的時候要執(zhí)行的語句,如圖可知,如果*x小于*y,entry-g就無法到達(dá)*z=x。
在這個程序里,得到的定義點(diǎn)是*z=null,使用點(diǎn)是(*m)++,需要計算四個條件:
1.*z=null到(*m)++的條件;
2.entry-g到*z=null的條件;
3、entry-f到(*m)++的條件;
4、entry-f到callg()的條件。
以計算*z=null到(*m)++的條件為例:當(dāng)*x>*y時,會執(zhí)行*z=x,導(dǎo)致*z被重新賦值,這樣*z=null的賦值會被覆蓋掉,所以首先要滿足條件!(*x>*y);當(dāng)*x<=*y時,會執(zhí)行*z=y(tǒng),導(dǎo)致*z被重新賦值,這樣*z=null的賦值會被覆蓋掉,所以首先要滿足條件!(*x<=*y)。
通過指向分析,獲得指針指向圖,圖5示出了示例程序一的指針指向圖。
在指針指向圖中計算,獲取m等價類集合{m,*z}。
在supergraph上進(jìn)行數(shù)據(jù)流分析,得到定義使用集合,在(*m)++位置,變量m的分析結(jié)果集合為{m=null},*z的分析結(jié)果集合為{*z=x,*z=y(tǒng),*z=null}。在supergraph中,{m=null}到(*m)++之間的定義使用關(guān)系,必將被{*z=x,*z=y(tǒng),*z=null}所覆蓋,所以本步驟所得到的指針修改影響結(jié)果為{*z=x,*z=y(tǒng),*z=null}。
計算條件,發(fā)現(xiàn)*z=null到(*m)++之間的條件為(!(*x>*y)&&!(*x<=*y)),經(jīng)smtinterpol判定為不可滿足,將其從結(jié)果集中刪除,最終的指針修改影響結(jié)果為{*z=x,*z=y(tǒng)}。
*z=null到(*m)++之間的定義使用關(guān)系,在傳統(tǒng)的代碼靜態(tài)分析過程中會被誤認(rèn)為是空指針解引用缺陷,而本算法所給出的結(jié)果則成功解決了這一問題。
圖6示出了采用本發(fā)明的方法的示例程序二的代碼示意圖,本實(shí)施例以代碼中第10行return*a為例,計算對該語句產(chǎn)生影響的別名修改位置,該語句對變量a進(jìn)行解引用,所以需考慮*m及其等價類的相關(guān)定義點(diǎn)產(chǎn)生的影響。
首先構(gòu)造示例程序二的控制流圖和超圖,圖7示出了示例程序二的控制流圖,圖8示出了示例程序二的超圖。
通過指向分析,獲得指針指向圖,圖9示出了示例程序二的指針指向圖。
在supergraph上進(jìn)行數(shù)據(jù)流分析,得到定義使用集合,在printf語句位置,關(guān)于變量m的值得分析結(jié)果集合為{*m=10,*p=5},所以本步驟所得到指針修改影響結(jié)果為{*m=10,*n=9};
計算條件,發(fā)現(xiàn)m與*p產(chǎn)生等價關(guān)系的語句“m=n”和所計算語句printf語句在邏輯上不可同時被執(zhí)行,語句執(zhí)行的條件分別為“a==b”和“a>b”,而smtinterpol判定(a==b&&a>b)為不可滿足,所以將*p相關(guān)從結(jié)果集中刪除,最終的指針修改影響結(jié)果為{*m=10}。
圖10示出了采用本發(fā)明的方法的示例程序三的代碼示意圖,本實(shí)施例以代碼中第15行returnnum[b]為例,計算對該語句產(chǎn)生影響的別名修改位置,該語句使用變量b作為數(shù)組下標(biāo),考慮b及其等價類的相關(guān)定義點(diǎn)產(chǎn)生的修改影響,獲取其數(shù)值范圍。
首先構(gòu)造示例程序三的控制流圖和超圖,圖11示出了示例程序三的控制流圖,圖12示出了示例程序三的超圖。
通過指向分析,獲得指針指向圖,圖13示出了示例程序三的指針指向圖。
在指針指向圖中計算,變量b等價類集合{a,b,*m,*n}。
在supergraph上進(jìn)行數(shù)據(jù)流分析,得到定義使用集合,可得在returnnum[b]位置,變量b的定義點(diǎn)集合為{*m=10,*n=9}。
計算條件,對于*m=10到returnnum[b]的定義使用關(guān)系進(jìn)行計算:
*m=10到returnnum[b]的路徑條件為true;
entry-f到returnnum[b]的路徑條件為true;
entry-f到*m=10的路徑條件為!(b>9);
entry-f到m=n的路徑條件為b>9;
將四個路徑條件進(jìn)行&&操作,得到最終的條件為(b>9)&&!(b>9),經(jīng)smt判定為不可滿足,所以該定義使用關(guān)系不成立,將其從結(jié)果集中刪除。
同理可得,*n=9到returnnum[b]的定義使用關(guān)系成立。
最終的指針修改影響結(jié)果為{*n=9}。
在一個實(shí)施例中,本發(fā)明還提供一種判斷修改程序的指針是否造成影響的系統(tǒng),包括:
初步判斷模塊,用于在程序代碼中查找該語句中變量的等價變量,并查找該等價變量所有的定義點(diǎn),構(gòu)成分析結(jié)果集合;
結(jié)果集合模塊,在程序代碼中查找該語句中變量的等價變量,并查找該等價變量所有的定義點(diǎn),構(gòu)成分析結(jié)果集合;以及
再判斷模塊,判斷所有所述路徑條件是否可同時滿足,若不可同時滿足,則將該定義點(diǎn)從所述分析結(jié)果集合中剔除。
最后,本申請的方法僅為較佳的實(shí)施方案,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。