欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種基于抽象解釋和模型驗(yàn)證的運(yùn)行時(shí)錯(cuò)誤分析方法

文檔序號(hào):6517337閱讀:309來(lái)源:國(guó)知局
一種基于抽象解釋和模型驗(yàn)證的運(yùn)行時(shí)錯(cuò)誤分析方法
【專利摘要】一種基于抽象解釋和模型驗(yàn)證的運(yùn)行時(shí)錯(cuò)誤分析方法,本發(fā)明包括以下步驟:基于抽象解釋理論,采用前向迭代方法分析程序數(shù)值變量值范圍,獲得程序點(diǎn)達(dá)到穩(wěn)定時(shí)的變量值范圍信息,對(duì)于循環(huán)節(jié)點(diǎn)的迭代計(jì)算采用循環(huán)展開(kāi)和延遲拓寬相結(jié)合的方法實(shí)現(xiàn);根據(jù)待分析的運(yùn)行時(shí)錯(cuò)誤類(lèi)型,在相關(guān)需要檢測(cè)的程序點(diǎn)處將變量值范圍信息轉(zhuǎn)化為斷言或假設(shè)形式插入程序中;將帶有斷言和假設(shè)的程序轉(zhuǎn)化為布爾公式,其中布爾公式包括限制條件和屬性;使用SAT驗(yàn)證器判斷布爾公式中屬性的正確性。若正確,說(shuō)明不存在相關(guān)運(yùn)行時(shí)錯(cuò)誤;若不正確,說(shuō)明存在相關(guān)運(yùn)行時(shí)錯(cuò)誤,并輸出相關(guān)的反例路徑。本發(fā)明實(shí)現(xiàn)了在運(yùn)行時(shí)錯(cuò)誤分析精度和效率之間取得一個(gè)平衡點(diǎn)。
【專利說(shuō)明】一種基于抽象解釋和模型驗(yàn)證的運(yùn)行時(shí)錯(cuò)誤分析方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種基于抽象解釋和模型驗(yàn)證的運(yùn)行時(shí)錯(cuò)誤分析方法,屬于軟件測(cè)試【技術(shù)領(lǐng)域】。
【背景技術(shù)】
[0002]軟件規(guī)模的不斷擴(kuò)大及復(fù)雜性的不斷提升不僅給軟件開(kāi)發(fā)帶來(lái)了更多的困難,也給軟件測(cè)試帶來(lái)了更大的挑戰(zhàn)。即使經(jīng)過(guò)嚴(yán)格的軟件測(cè)試,也不能保證其內(nèi)部沒(méi)有錯(cuò)誤。其中,有一類(lèi)錯(cuò)誤是在特定的運(yùn)行時(shí)條件下才可能出現(xiàn)的,簡(jiǎn)稱“運(yùn)行時(shí)錯(cuò)誤”。運(yùn)行時(shí)錯(cuò)誤是所有軟件錯(cuò)誤中最具風(fēng)險(xiǎn)的,同時(shí)也是最難發(fā)現(xiàn)的,其隱藏在代碼中,傳統(tǒng)的軟件測(cè)試技術(shù)很難發(fā)現(xiàn)這些錯(cuò)誤。因而,某些軟件表面上能正常運(yùn)行,但實(shí)際上可能會(huì)導(dǎo)致意外的系統(tǒng)故障。對(duì)于航空航天、汽車(chē)以及醫(yī)療設(shè)備等安全級(jí)別要求非常高的系統(tǒng)來(lái)說(shuō),一旦出現(xiàn)這樣的運(yùn)行時(shí)錯(cuò)誤,損失就是不可估量的。
[0003]所有運(yùn)行時(shí)錯(cuò)誤類(lèi)別中,有四種類(lèi)別可以歸納為程序變量值范圍的分析,包括數(shù)組越界、除零操作、負(fù)數(shù)開(kāi)偶次方、整數(shù)和浮點(diǎn)數(shù)的上溢出/下溢出四種運(yùn)行時(shí)錯(cuò)誤,簡(jiǎn)稱“數(shù)值型運(yùn)行時(shí)錯(cuò)誤”。目前,形式化的分析方法是檢查數(shù)值型運(yùn)行時(shí)錯(cuò)誤最為有效的方法,包括抽象解釋和模型驗(yàn)證等。其中,基于抽象解釋的程序值變量分析能夠穩(wěn)定的分析程序中各程序點(diǎn)處的變量值范圍,從而檢測(cè)可能存在的運(yùn)行時(shí)錯(cuò)誤。另外,模型檢驗(yàn)也是運(yùn)行時(shí)錯(cuò)誤檢查方法中分析精度較高的一種,它通過(guò)窮盡程序狀態(tài),搜索滿足驗(yàn)證屬性的狀態(tài),而且對(duì)于違反屬性的狀態(tài)能夠給出相應(yīng)的反例路徑。
[0004]但是,抽象解釋和模型驗(yàn)證都有各自的缺點(diǎn):1.在基于抽象解釋的程序值變量分析過(guò)程中,對(duì)于循環(huán)語(yǔ)句中的值范圍分析,為了使循環(huán)迭代能夠保證收斂,一般使用拓寬算子來(lái)實(shí)現(xiàn),但拓寬運(yùn)算帶來(lái)了計(jì)算精度的巨大損失。2.對(duì)于大規(guī)模程序,模型驗(yàn)證需要驗(yàn)證的屬性數(shù)量龐大,驗(yàn)證效率低,而且對(duì)于無(wú)窮系統(tǒng)會(huì)導(dǎo)致?tīng)顟B(tài)空間爆炸。為了解決上面提到的抽象解釋和模型驗(yàn)證各自的局限性問(wèn)題,需要對(duì)循環(huán)語(yǔ)句分析和模型驗(yàn)證做相應(yīng)的改進(jìn),將兩者有機(jī)的結(jié)合在一起,從而在分析精度和分析效率之間找到一個(gè)平衡點(diǎn)。

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

[0005]本發(fā)明的技術(shù)解決的問(wèn)題是:克服現(xiàn)有技術(shù)的不足,提供了一種基于抽象解釋和模型驗(yàn)證的運(yùn)行時(shí)錯(cuò)誤分析方法,實(shí)現(xiàn)了在運(yùn)行時(shí)錯(cuò)誤分析的精度和效率之間取得一個(gè)平衡點(diǎn)。
[0006]本發(fā)明的技術(shù)解決方案是:
[0007]一種基于抽象解釋和模型驗(yàn)證的運(yùn)行時(shí)錯(cuò)誤分析方法包括以下步驟:
[0008]( I)構(gòu)造待分析程序的控制流圖;
[0009](2)從該控制流圖的入口點(diǎn)開(kāi)始,根據(jù)控制流圖的遷移方向利用區(qū)間域基本操作計(jì)算程序中各節(jié)點(diǎn)處的變量值范圍;
[0010](3)當(dāng)程序中各節(jié)點(diǎn)的變量值范圍穩(wěn)定時(shí),變量值范圍計(jì)算終止,所述變量值范圍計(jì)算過(guò)程采用迭代計(jì)算的方法計(jì)算程序中出現(xiàn)的循環(huán)節(jié)點(diǎn);
[0011](4)根據(jù)待分析的運(yùn)行時(shí)錯(cuò)誤類(lèi)型,在待分析程序中需要檢測(cè)的節(jié)點(diǎn)處將變量值范圍信息轉(zhuǎn)化為斷言或假設(shè)并插入程序中;所述的運(yùn)行時(shí)錯(cuò)誤類(lèi)型包括除零操作、數(shù)組越界、負(fù)數(shù)開(kāi)偶次方和數(shù)值溢出;
[0012](5)將步驟(4)中帶有斷言和假設(shè)的程序轉(zhuǎn)化為布爾公式,所述的布爾公式包括限制條件和屬性,其中限制條件為程序的各賦值語(yǔ)句和假設(shè),屬性為斷言;
[0013](6)利用SAT驗(yàn)證器判斷步驟(5)中布爾公式中屬性的正確性,若驗(yàn)證正確,則進(jìn)入步驟(7),否則說(shuō)明存在該類(lèi)運(yùn)行時(shí)錯(cuò)誤并提供相關(guān)的反例路徑;
[0014](7)說(shuō)明不存在該類(lèi)運(yùn)行時(shí)錯(cuò)誤,結(jié)束分析過(guò)程。
[0015]所述步驟(2)中區(qū)間域的基本操作包括區(qū)間域加、減、乘、除、交、并和拓寬。
[0016]所述步驟(3)中循環(huán)節(jié)點(diǎn)的迭代計(jì)算采用循環(huán)展開(kāi)和延遲拓寬相結(jié)合的方法實(shí)現(xiàn):首先通過(guò)預(yù)先設(shè)置循環(huán)展開(kāi)次數(shù),將計(jì)算出的變量的新值替換前一次計(jì)算出的舊值,在迭代計(jì)算到達(dá)設(shè)定的展開(kāi)次數(shù)之后再設(shè)置一定延遲次數(shù),在給定的延遲次數(shù)內(nèi)將每次計(jì)算后的變量的新值與前一次計(jì)算的舊值求并運(yùn)算,最終循環(huán)迭代次數(shù)達(dá)到設(shè)置的延遲次數(shù)之后進(jìn)行拓寬運(yùn)算。
[0017]所述步驟(4)中運(yùn)行時(shí)錯(cuò)誤類(lèi)型分析方法如下;
[0018](I)除零運(yùn)算:在進(jìn)行除法運(yùn)算的程序節(jié)點(diǎn)處,判斷除數(shù)變量取值范圍是否包含0,如果包含則插入該變量不為O的斷言assert (變量! =0),否則不插入斷言,同時(shí)在該程序節(jié)點(diǎn)處以assume ()的形式插入除數(shù)變量的值范圍信息;
[0019](2)數(shù)組越界:判斷數(shù)組下標(biāo)變量值范圍是否落于數(shù)組最大界和最小界之內(nèi),如果大于最大界,則插入該變量小于最大界的斷言assert (變量〈最大界);如果小于最小界,則插入該變量大于最小界的斷言assert (變量 > 最小界);否則不插入斷言,同時(shí)在該程序節(jié)點(diǎn)處以assume ()形式插入數(shù)組下標(biāo)變量的值范圍信息;
[0020](3)負(fù)數(shù)開(kāi)偶次方:在進(jìn)行開(kāi)偶次方運(yùn)算的程序節(jié)點(diǎn)處,判斷被開(kāi)方數(shù)的值范圍是否包含負(fù)值,如果包含則插入被開(kāi)方數(shù)為正的斷言assert (被開(kāi)放數(shù)>=0),否則不插入斷言,同時(shí)在該程序點(diǎn)處以assume ()形式插入被開(kāi)方數(shù)的值范圍信息;
[0021](4)數(shù)值溢出:判斷變量取值范圍是否超過(guò)機(jī)器最大數(shù),如果超過(guò)則插入該變量小于機(jī)器最大數(shù)的斷言assert (變量〈機(jī)器最大數(shù)),否則不插入斷言,同時(shí)在該程序點(diǎn)處以assume ()形式插入該變量的值范圍信息。
[0022]所述步驟(5)中布爾公式轉(zhuǎn)換方法如下:
[0023](I)將程序中的break, continue語(yǔ)句轉(zhuǎn)換成goto語(yǔ)句;將程序中的for, dowhile語(yǔ)句轉(zhuǎn)換成while語(yǔ)句;
[0024](2)設(shè)定循環(huán)次數(shù),將轉(zhuǎn)換后的while語(yǔ)句展開(kāi)成if語(yǔ)句,同時(shí)在最后一次循環(huán)結(jié)束時(shí)插入while循環(huán)判斷條件為假的斷言;對(duì)后向goto語(yǔ)句采用類(lèi)似while循環(huán)體的方式展開(kāi);經(jīng)過(guò)處理的程序僅包含if、前向goto語(yǔ)句、賦值語(yǔ)句、斷言、假設(shè)和標(biāo)簽,稱之為靜態(tài)獨(dú)立程序塊;
[0025](3)將靜態(tài)獨(dú)立程序塊轉(zhuǎn)換成布爾公式,包括限制條件和屬性,其中限制條件為程序的各賦值語(yǔ)句和假設(shè),屬性為需要驗(yàn)證的斷言。
[0026]本發(fā)明與現(xiàn)有技術(shù)相比具有如下優(yōu)點(diǎn):[0027](I)本發(fā)明將抽象解釋和模型驗(yàn)證的方法有機(jī)結(jié)合在一起。首先利用抽象解釋方法計(jì)算變量的值范圍信息,然后將值范圍信息以斷言和假設(shè)的形式插入源程序中,最后利用模型驗(yàn)證的方法驗(yàn)證斷言的正確性。以抽象解釋分析的結(jié)果作為斷言可以減少不必要的斷言,插入假設(shè)可以縮小模型檢驗(yàn)搜索的狀態(tài)空間,這兩者都可以增加模型檢驗(yàn)的效率。
[0028](2)本發(fā)明采用有界模型驗(yàn)證方法,將程序中所有循環(huán)結(jié)構(gòu)轉(zhuǎn)換為while語(yǔ)句,并設(shè)定循環(huán)次數(shù),將轉(zhuǎn)換后的while語(yǔ)句展開(kāi)成if語(yǔ)句。該有界模型驗(yàn)證方法可以減小模型驗(yàn)證的復(fù)雜度,增加模型驗(yàn)證的效率。
[0029](3)本發(fā)明對(duì)于循環(huán)語(yǔ)句的迭代分析,采用循環(huán)展開(kāi)和拓寬延遲相結(jié)合的方法。拓寬操作能夠保證迭代分析的收斂性,但會(huì)損失大量的精度,通過(guò)設(shè)置合理的延遲次數(shù)延遲拓寬運(yùn)算,從而提高運(yùn)算精度。拓寬延遲在一定的程度上提高了循環(huán)語(yǔ)句分析的精度,但還遠(yuǎn)遠(yuǎn)不夠,因而需要結(jié)合循環(huán)展開(kāi)方法。通過(guò)預(yù)先設(shè)置循環(huán)展開(kāi)次數(shù),將循環(huán)計(jì)算出的新值替換前一次迭代計(jì)算出的舊值,在迭代到達(dá)設(shè)定的展開(kāi)次數(shù)之后再采用拓寬延遲的方法。循環(huán)展開(kāi)和拓寬延遲相結(jié)合的方法既保證了迭代分析的收斂性又保證了循環(huán)語(yǔ)句分析的精度。
【專利附圖】

【附圖說(shuō)明】
[0030]圖1為本發(fā)明的流程圖;
[0031]圖2為本發(fā)明具體實(shí)施例中待檢測(cè)程序的控制流圖。
【具體實(shí)施方式】
[0032]下面結(jié)合附圖對(duì)本發(fā)明的【具體實(shí)施方式】進(jìn)行進(jìn)一步的詳細(xì)描述。
[0033]本發(fā)明采用前向迭代算法按照控制流圖中有向邊的遷移順序遍歷節(jié)點(diǎn),針對(duì)每條遷移邊,在區(qū)間抽象域上調(diào)用對(duì)應(yīng)的域操作來(lái)傳播最新的計(jì)算結(jié)果,并更新遷移邊目標(biāo)節(jié)點(diǎn)處的抽象值,獲得各程序點(diǎn)處每個(gè)數(shù)值變量的值范圍信息。然后,根據(jù)待分析的數(shù)值型運(yùn)行時(shí)錯(cuò)誤類(lèi)型,將數(shù)值變量取值信息轉(zhuǎn)化為斷言或假設(shè)形式插入程序中,作為能夠進(jìn)行模型檢驗(yàn)的屬性。最后,將帶有斷言和假設(shè)的程序轉(zhuǎn)化為布爾公式,使用SAT驗(yàn)證器判斷公式的可滿足性,進(jìn)而驗(yàn)證斷言的正確性,若不正確,提供相關(guān)的反例路徑。
[0034]如圖1所示,本發(fā)明具體步驟如下:
[0035]一種基于抽象解釋和模型驗(yàn)證的運(yùn)行時(shí)錯(cuò)誤分析方法包括以下步驟:
[0036]( I)構(gòu)造待分析程序的控制流圖;
[0037]控制流圖是由結(jié)點(diǎn)和有向邊構(gòu)成的有向圖,結(jié)點(diǎn)代表程序中某個(gè)程序點(diǎn)處的信息,有向邊代表兩個(gè)結(jié)點(diǎn)之間的遷移語(yǔ)句。結(jié)點(diǎn)包含了相應(yīng)程序點(diǎn)的行號(hào)和列號(hào)(唯一地定義了程序中的某個(gè)程序點(diǎn))、當(dāng)前狀態(tài)(變量在區(qū)間抽象域上的取值)以及是否為加寬點(diǎn)等信息。有向邊則主要分為:賦值邊、條件測(cè)試邊、函數(shù)調(diào)用和返回邊四種類(lèi)型。
[0038]控制流圖中有兩種特殊的結(jié)點(diǎn):一類(lèi)是接合結(jié)點(diǎn),對(duì)應(yīng)條件分支語(yǔ)句的聚合處,表示在該結(jié)點(diǎn)處將判斷條件為真為假兩種情況下的計(jì)算結(jié)果求接合(U操作);另一類(lèi)是加寬結(jié)點(diǎn),對(duì)應(yīng)循環(huán)語(yǔ)句的入口結(jié)點(diǎn),表示該結(jié)點(diǎn)是循環(huán)語(yǔ)句的開(kāi)始結(jié)點(diǎn)。
[0039](2)從該控制流圖的入口點(diǎn)開(kāi)始,將入口點(diǎn)初始化為抽象域完全格上的最大值T,其他節(jié)點(diǎn)則初始化為抽象域完全格上的最小值丄。根據(jù)控制流圖的遷移方向利用區(qū)間域的基本操作計(jì)算程序中各節(jié)點(diǎn)處的變量值范圍;
[0040]區(qū)間域的基本操作包括區(qū)間域加、減、乘、除、交、并和拓寬,例如給定任思兩個(gè)區(qū)間=D1= [a, b],D2= [m, n]D區(qū)間上的父(Π)、并,也稱為結(jié)合(U)、拓覽(▽)運(yùn)算如下:D1 Π D2= [max (a, m), min (b, η) ] ;DX U D2= [min (a,m),max (b,η)];
D1VD2 = [a,b]v[mji] = [/,,/:],如果 m〈a, I1=- ,否則 Ifa ;如果 n>b, I2=+ 否則 l2=b。 [0041](3)當(dāng)程序中各節(jié)點(diǎn)的變量值范圍穩(wěn)定時(shí),變量值范圍計(jì)算終止,變量值范圍計(jì)算過(guò)程采用迭代計(jì)算的方法計(jì)算程序中的循環(huán)節(jié)點(diǎn);
[0042]循環(huán)節(jié)點(diǎn)均使用有向循環(huán)子圖來(lái)表示,并將循環(huán)節(jié)點(diǎn)設(shè)置為加寬點(diǎn)。加寬點(diǎn)處的抽象值在每次迭代過(guò)程中為本次迭代的抽象值和上次迭代的抽象值的替代、接合或者加寬;而且加寬結(jié)點(diǎn)必須穩(wěn)定后,數(shù)據(jù)流分析才可以繼續(xù)向前傳播。設(shè)前一次迭代分析時(shí)加寬結(jié)點(diǎn)處的抽象值為P1,當(dāng)前迭代分析時(shí)的抽象值為P2,即當(dāng)且僅當(dāng)P2 £ P1時(shí),對(duì)循環(huán)語(yǔ)句的迭代才可以終止,否則在加寬點(diǎn)進(jìn)行替代、接合或加寬操作。
[0043]針對(duì)循環(huán)節(jié)點(diǎn)的迭代計(jì)算,本發(fā)明采用循環(huán)展開(kāi)和拓寬延遲相結(jié)合的方法,方法如下:
[0044]循環(huán)節(jié)點(diǎn)的迭代計(jì)算采用循環(huán)展開(kāi)和延遲拓寬相結(jié)合的方法實(shí)現(xiàn):將計(jì)算出的變量的新值替換前一次計(jì)算出的舊值,在迭代計(jì)算到達(dá)設(shè)定的展開(kāi)次數(shù)之后再設(shè)置一定延遲次數(shù),在給定的延遲次數(shù)內(nèi)將每次計(jì)算后的變量的新值與前一次計(jì)算的舊值求并運(yùn)算,最終循環(huán)迭代次數(shù)達(dá)到設(shè)置的延遲次數(shù)之后進(jìn)行拓寬運(yùn)算。
[0045]采用循環(huán)展開(kāi)策略可以提高分析的精度,但是需要耗費(fèi)大量計(jì)算,因此需要確定合適的展開(kāi)次數(shù),同時(shí)為了加速和保證循環(huán)語(yǔ)句迭代計(jì)算的收斂,采用拓寬操作,但是采用拓寬操作會(huì)帶來(lái)計(jì)算精度的巨大損失,為了提高迭代分析的精度,需要在進(jìn)行拓寬操作前采用求并(即將前一次迭代計(jì)算的抽象值和本次迭代計(jì)算的抽象值求并)操作來(lái)延遲拓寬操作。
[0046](4)根據(jù)待分析的運(yùn)行時(shí)錯(cuò)誤類(lèi)型,在程序中需要檢測(cè)的節(jié)點(diǎn)處將變量值范圍信息轉(zhuǎn)化為斷言或假設(shè)插入程序中;所述的運(yùn)行時(shí)錯(cuò)誤類(lèi)型包括除零操作、數(shù)組越界、負(fù)數(shù)開(kāi)偶次方和數(shù)值溢出;
[0047]所述步驟(4)中運(yùn)行時(shí)錯(cuò)誤類(lèi)型分析方法如下;
[0048]I)除零運(yùn)算:在進(jìn)行除法運(yùn)算的程序節(jié)點(diǎn)處,判斷除數(shù)變量取值范圍是否包含0,如果包含則插入該變量不為O的斷言assert (變量! =0),否則不插入斷言,同時(shí)在該程序節(jié)點(diǎn)處以assume ()的形式插入除數(shù)變量的值范圍信息;
[0049]2)數(shù)組越界:判斷數(shù)組下標(biāo)變量值范圍是否落于數(shù)組最大界和最小界之內(nèi),如果大于最大界,則插入該變量小于最大界的斷言assert (變量〈最大界);如果小于最小界,則插入該變量大于最小界的斷言assert (變量 > 最小界);否則不插入斷言,同時(shí)在該程序節(jié)點(diǎn)處以assume ()形式插入數(shù)組下標(biāo)變量的值范圍信息;
[0050]3)負(fù)數(shù)開(kāi)偶次方:在進(jìn)行開(kāi)偶次方運(yùn)算的程序節(jié)點(diǎn)處,判斷被開(kāi)方數(shù)的值范圍是否包含負(fù)值,如果包含則插入被開(kāi)方數(shù)為正的斷言assert (被開(kāi)放數(shù)>=0),否則不插入斷言,同時(shí)在該程序點(diǎn)處以assume ()形式插入被開(kāi)方數(shù)的值范圍信息;
[0051]4)數(shù)值溢出:判斷變量取值范圍是否超過(guò)機(jī)器最大數(shù),如果超過(guò)則插入該變量小于機(jī)器最大數(shù)的斷言assert (變量〈機(jī)器最大數(shù)),否則不插入斷言,同時(shí)在該程序點(diǎn)處以assume ()形式插入該變量的值范圍信息。
[0052](5)將步驟(4)中帶有斷言和假設(shè)的程序轉(zhuǎn)化為布爾公式,所述的布爾公式包括限制條件和屬性,其中限制條件為程序的各賦值語(yǔ)句和假設(shè),屬性為斷言;
[0053]布爾公式轉(zhuǎn)換方法如下:
[0054]I)將程序中的break, continue語(yǔ)句轉(zhuǎn)換成goto語(yǔ)句;將程序中的for, dowhile語(yǔ)句轉(zhuǎn)換成while語(yǔ)句;
[0055]2)設(shè)定循環(huán)次數(shù),將轉(zhuǎn)換后的while語(yǔ)句展開(kāi)成if語(yǔ)句,同時(shí)在最后一次循環(huán)結(jié)束時(shí)插入while循環(huán)判斷條件為假的斷言;對(duì)后向goto語(yǔ)句采用類(lèi)似while循環(huán)體的方式展開(kāi);對(duì)調(diào)用函數(shù)進(jìn)行展開(kāi)分析,若是遞歸函數(shù)調(diào)用,設(shè)定遞歸次數(shù);經(jīng)過(guò)處理的程序僅包含if、前向goto語(yǔ)句、賦值語(yǔ)句、斷言、假設(shè)和標(biāo)簽,稱之為靜態(tài)獨(dú)立程序塊(SSA);
[0056]3)將SSA轉(zhuǎn)換成布爾公式,包括限制條件(Constraints,簡(jiǎn)記C)和屬性(Property,簡(jiǎn)記P),其中限制條件為程序的各賦值語(yǔ)句,屬性為需要驗(yàn)證的斷言。
[0057](6)利用SAT驗(yàn)證器判斷步驟(5)中布爾公式中屬性的正確性,若驗(yàn)證正確,則進(jìn)入步驟(7),否則說(shuō)明存在該類(lèi)運(yùn)行時(shí)錯(cuò)誤并提供相關(guān)的反例路徑;
[0058]布爾公式中屬性的正確性判定方法:為了驗(yàn)證屬性P是否正確,首先將屬性P取反;然后將邏輯公式CA^P進(jìn)行平坦化操作,轉(zhuǎn)換為合取范式結(jié)構(gòu)(CNF);最后將CNF輸入SAT驗(yàn)證器判斷公式的可滿足性。若滿足,說(shuō)明屬性P被違反,也就是說(shuō)存在某條路徑違背了屬性P,該斷言是不正確的,同時(shí)將該條反例路徑輸出。若不滿足,說(shuō)明不存在任何一條路徑違背屬性P,該斷言是正確的。
[0059](7)說(shuō)明不存在該類(lèi)運(yùn)行時(shí)錯(cuò)誤,結(jié)束分析過(guò)程。
[0060]下面以一個(gè)具體實(shí)施例說(shuō)明本發(fā)明的工作過(guò)程和具體原理:
[0061]以某衛(wèi)星的中央處理單元軟件為例,說(shuō)明本發(fā)明的實(shí)施步驟:
[0062](I)驗(yàn)證某衛(wèi)星的中央處理單元軟件的某程序代碼片段是否存在數(shù)組越界這類(lèi)運(yùn)行時(shí)錯(cuò)誤。首先構(gòu)造待檢測(cè)源代碼片段(如下段代碼所述)的程序控制流圖(CFG),如圖2所
/Jn ο
[0063]
【權(quán)利要求】
1.一種基于抽象解釋和模型驗(yàn)證的運(yùn)行時(shí)錯(cuò)誤分析方法,其特征在于包括以下步驟: (1)構(gòu)造待分析程序的控制流圖; (2)從該控制流圖的入口點(diǎn)開(kāi)始,根據(jù)控制流圖的遷移方向利用區(qū)間域基本操作計(jì)算程序中各節(jié)點(diǎn)處的變量值范圍; (3)當(dāng)程序中各節(jié)點(diǎn)的變量值范圍穩(wěn)定時(shí),變量值范圍計(jì)算終止,所述變量值范圍計(jì)算過(guò)程采用迭代計(jì)算的方法計(jì)算程序中出現(xiàn)的循環(huán)節(jié)點(diǎn); (4)根據(jù)待分析的運(yùn)行時(shí)錯(cuò)誤類(lèi)型,在待分析程序中需要檢測(cè)的節(jié)點(diǎn)處將變量值范圍信息轉(zhuǎn)化為斷言或假設(shè)并插入程序中;所述的運(yùn)行時(shí)錯(cuò)誤類(lèi)型包括除零操作、數(shù)組越界、負(fù)數(shù)開(kāi)偶次方和數(shù)值溢出; (5)將步驟(4)中帶有斷言和假設(shè)的程序轉(zhuǎn)化為布爾公式,所述的布爾公式包括限制條件和屬性,其中限制條件為程序的各賦值語(yǔ)句和假設(shè),屬性為斷言; (6)利用SAT驗(yàn)證器判斷步驟(5)中布爾公式中屬性的正確性,若驗(yàn)證正確,則進(jìn)入步驟(7),否則說(shuō)明存在該類(lèi)運(yùn)行時(shí)錯(cuò)誤并提供相關(guān)的反例路徑; (7)說(shuō)明不存在該類(lèi)運(yùn)行時(shí)錯(cuò)誤,結(jié)束分析過(guò)程。
2.根據(jù)權(quán)利要求1所述的一種基于抽象解釋和模型驗(yàn)證的運(yùn)行時(shí)錯(cuò)誤分析方法,其特征在于:所述步驟(2)中區(qū)間域的基本操作包括區(qū)間域加、減、乘、除、交、并和拓寬。
3.根據(jù)權(quán)利要求1所述的一種基于抽象解釋和模型驗(yàn)證的運(yùn)行時(shí)錯(cuò)誤分析方法,其特征在于:所述步驟(3)中循環(huán)節(jié)點(diǎn)的迭代計(jì)算采用循環(huán)展開(kāi)和延遲拓寬相結(jié)合的方法實(shí)現(xiàn):首先通過(guò)預(yù)先設(shè)置 環(huán)展開(kāi)次數(shù),將計(jì)算出的變量的新值替換前一次計(jì)算出的舊值,在迭代計(jì)算到達(dá)設(shè)定的展開(kāi)次數(shù)之后再設(shè)置一定延遲次數(shù),在給定的延遲次數(shù)內(nèi)將每次計(jì)算后的變量的新值與前一次計(jì)算的舊值求并運(yùn)算,最終循環(huán)迭代次數(shù)達(dá)到設(shè)置的延遲次數(shù)之后進(jìn)行拓寬運(yùn)算。
4.根據(jù)權(quán)利要求1所述的一種基于抽象解釋和模型驗(yàn)證的運(yùn)行時(shí)錯(cuò)誤分析方法,其特征在于:所述步驟(4)中運(yùn)行時(shí)錯(cuò)誤類(lèi)型分析方法如下; (1)除零運(yùn)算:在進(jìn)行除法運(yùn)算的程序節(jié)點(diǎn)處,判斷除數(shù)變量取值范圍是否包含O,如果包含則插入該變量不為O的斷言assert (變量! =0),否則不插入斷言,同時(shí)在該程序節(jié)點(diǎn)處以assume ()的形式插入除數(shù)變量的值范圍信息; (2)數(shù)組越界:判斷數(shù)組下標(biāo)變量值范圍是否落于數(shù)組最大界和最小界之內(nèi),如果大于最大界,則插入該變量小于最大界的斷言assert (變量〈最大界);如果小于最小界,則插入該變量大于最小界的斷言assert (變量 > 最小界);否則不插入斷言,同時(shí)在該程序節(jié)點(diǎn)處以assume ()形式插入數(shù)組下標(biāo)變量的值范圍信息; (3)負(fù)數(shù)開(kāi)偶次方:在進(jìn)行開(kāi)偶次方運(yùn)算的程序節(jié)點(diǎn)處,判斷被開(kāi)方數(shù)的值范圍是否包含負(fù)值,如果包含則插入被開(kāi)方數(shù)為正的斷言assert (被開(kāi)放數(shù)>=0),否則不插入斷言,同時(shí)在該程序點(diǎn)處以assume ()形式插入被開(kāi)方數(shù)的值范圍信息; (4)數(shù)值溢出:判斷變量取值范圍是否超過(guò)機(jī)器最大數(shù),如果超過(guò)則插入該變量小于機(jī)器最大數(shù)的斷言assert (變量〈機(jī)器最大數(shù)),否則不插入斷言,同時(shí)在該程序點(diǎn)處以assume ()形式插入該變量的值范圍信息。
5.根據(jù)權(quán)利要求1所述的一種基于抽象解釋和模型驗(yàn)證的運(yùn)行時(shí)錯(cuò)誤分析方法,其特征在于:所述步驟(5)中布爾公式轉(zhuǎn)換方法如下:(1)將程序中的break,continue語(yǔ)句轉(zhuǎn)換成goto語(yǔ)句;將程序中的for, dowhile語(yǔ)句轉(zhuǎn)換成while語(yǔ)句; (2)設(shè)定循環(huán)次數(shù),將轉(zhuǎn)換后的while語(yǔ)句展開(kāi)成if語(yǔ)句,同時(shí)在最后一次循環(huán)結(jié)束時(shí)插入while循環(huán)判斷條件為假的斷言;對(duì)后向goto語(yǔ)句采用類(lèi)似while循環(huán)體的方式展開(kāi);經(jīng)過(guò)處理的程序僅包含if、前向goto語(yǔ)句、賦值語(yǔ)句、斷言、假設(shè)和標(biāo)簽,稱之為靜態(tài)獨(dú)立程序塊; (3)將靜態(tài)獨(dú)立程序塊轉(zhuǎn)換成布爾公式,包括限制條件和屬性,其中限制條件為程序的各賦值語(yǔ)句和假設(shè),屬性為需要驗(yàn)證的斷言。
【文檔編號(hào)】G06F11/36GK103617115SQ201310529070
【公開(kāi)日】2014年3月5日 申請(qǐng)日期:2013年10月30日 優(yōu)先權(quán)日:2013年10月30日
【發(fā)明者】詹海潭, 李寧, 張偉, 吳世堂, 高金梁, 鄭平 申請(qǐng)人:北京信息控制研究所
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
盖州市| 穆棱市| 河北省| 游戏| 龙江县| 固安县| 龙陵县| 章丘市| 鄂伦春自治旗| 香河县| 兰西县| 古丈县| 子洲县| 云和县| 鹤岗市| 五大连池市| 旌德县| 罗定市| 灵川县| 南陵县| 安顺市| 汪清县| 灵石县| 山东省| 西和县| 惠东县| 灵石县| 郎溪县| 上饶市| 安龙县| 从江县| 米林县| 扎兰屯市| 隆回县| 赣州市| 怀宁县| 安国市| 普格县| 惠安县| 达日县| 瑞安市|