本發(fā)明屬于軟件安全保障領(lǐng)域,具體涉及一種基于程序不變量的合約式軟件故障預(yù)警方法。
背景技術(shù):當(dāng)今隨著電子計(jì)算機(jī)技術(shù)的快速進(jìn)步,計(jì)算機(jī)在工業(yè)、交通、金融、醫(yī)療、通信、航空航天等領(lǐng)域的日益廣泛應(yīng)用,采用故障檢測(cè)來(lái)保證程序的正確性和可靠性已經(jīng)變得非常關(guān)鍵。不幸的是,隨著軟件規(guī)模變大,功能越來(lái)越強(qiáng),故障檢測(cè)也相當(dāng)復(fù)雜。在大型的軟件系統(tǒng)中,盡管經(jīng)過(guò)認(rèn)真的設(shè)計(jì)、開發(fā)和完備的測(cè)試,往往仍然存在許多故障。這些故障在正常運(yùn)行的時(shí)候可能并沒有發(fā)生錯(cuò)誤或表現(xiàn)出錯(cuò)誤的征兆,但在特定的條件下,會(huì)對(duì)系統(tǒng)產(chǎn)生破壞。如果不及時(shí)發(fā)現(xiàn),隨著時(shí)間的推移會(huì)發(fā)生嚴(yán)重的錯(cuò)誤,甚至導(dǎo)致系統(tǒng)崩潰。對(duì)于軟件故障的檢測(cè)分為靜態(tài)預(yù)測(cè)和動(dòng)態(tài)預(yù)警。傳統(tǒng)的檢測(cè)方法一般是前者,該方法不要求軟件實(shí)際運(yùn)行,而針對(duì)其編程風(fēng)格是否規(guī)范,邏輯表達(dá)式是否正確,類型匹配保證一致等檢查來(lái)發(fā)現(xiàn)錯(cuò)誤,但是很多其他錯(cuò)誤,用這種靜態(tài)預(yù)測(cè)的方法很難檢測(cè)到,因?yàn)樗鼈儼绦虻膭?dòng)態(tài)行為,動(dòng)態(tài)測(cè)試通常用來(lái)發(fā)現(xiàn)這類錯(cuò)誤,有些錯(cuò)誤并不能在所在測(cè)試用例環(huán)境下表現(xiàn)出來(lái),因此需要故障預(yù)警來(lái)在線檢測(cè),同時(shí)故障預(yù)警作為保障軟件安全的重要分支,主要用于保障軟件運(yùn)行時(shí)的行為符合人們的預(yù)期,越來(lái)越受到研究者的關(guān)注。現(xiàn)階段,存在的軟件故障預(yù)警技術(shù)有:通過(guò)檢測(cè)讀取未初始化內(nèi)存錯(cuò)誤、內(nèi)存泄露和數(shù)組越界等來(lái)在線檢測(cè)異常。對(duì)C程序增加在線檢測(cè)功能,主要檢測(cè)數(shù)組下標(biāo)和指針越界等;對(duì)于java語(yǔ)言來(lái)說(shuō),由于java語(yǔ)言是類型安全語(yǔ)言以及具有垃圾回收機(jī)制,所以很多上述方法中的錯(cuò)誤java程序可以自動(dòng)避免,所以對(duì)于java語(yǔ)言來(lái)說(shuō)現(xiàn)有的故障預(yù)警技術(shù)相對(duì)較少。目前,代表性的軟件故障預(yù)警技術(shù)有:1.基于合約的程序驗(yàn)證方法基于合約的程序驗(yàn)證是一種有效提高程序質(zhì)量的技術(shù),合約設(shè)計(jì)最早是由meyer針對(duì)程序設(shè)計(jì)語(yǔ)言Eiffel提出的,該技術(shù)是在程序執(zhí)行的過(guò)程中動(dòng)態(tài)檢查是否違反程序合約,其中程序合約是具有特定形式的斷言的格式,而這些斷言是需要程序員去發(fā)現(xiàn)的,程序員在編寫程序過(guò)程中發(fā)現(xiàn)程序遵循什么樣的合約,并將其注釋到j(luò)ava程序中,然后在java程序執(zhí)行的過(guò)程中去驗(yàn)證是否符合這些斷言規(guī)則,來(lái)發(fā)現(xiàn)程序異常。該方法的優(yōu)點(diǎn)在于給出了一種針對(duì)java程序的動(dòng)態(tài)故障預(yù)警方法,把程序要符合的合約提前插入到程序中,在程序運(yùn)行中是否符合這些合約作為判定程序是否存在故障的準(zhǔn)則。缺點(diǎn)在于該方法中的合約需要程序員手動(dòng)添加,不適合對(duì)大型系統(tǒng)進(jìn)行驗(yàn)證,且沒有提供系統(tǒng)化的合約來(lái)源。2.基于程序不變量的驗(yàn)證方法不變式的概念在許多領(lǐng)域中有著重要應(yīng)用。程序理論中的不變式簡(jiǎn)單說(shuō),是指控制流每次到達(dá)程序的某個(gè)或某些特定位置時(shí)總成立的屬性。程序不變式包括循環(huán)不變式、前置不變式、后置不變式和類不變式。程序不變量常用于程序設(shè)計(jì)、程序理解、故障定位以及程序驗(yàn)證等領(lǐng)域。采用程序不變量進(jìn)行驗(yàn)證時(shí),首先基于一定的測(cè)試用例,對(duì)于程序修改前后的兩個(gè)版本分別檢測(cè)不變式;然后比較兩個(gè)版本在相同程序點(diǎn)上的不變式,若所有的不變式均一致則認(rèn)為對(duì)兩個(gè)版本的程序驗(yàn)證成功。該方法的優(yōu)點(diǎn)在于將不變量用于程序驗(yàn)證,在程序版本發(fā)生變化后,驗(yàn)證是相對(duì)有效的;缺點(diǎn)在于該方法不適用于一般的無(wú)版本變更的系統(tǒng)。3.動(dòng)態(tài)不變量發(fā)現(xiàn)方法動(dòng)態(tài)不變量發(fā)現(xiàn)方法是通過(guò)程序?qū)嶋H的重復(fù)運(yùn)行發(fā)現(xiàn)其屬性的不變式性質(zhì),相對(duì)于靜態(tài)不變量發(fā)現(xiàn)方法,動(dòng)態(tài)不變量發(fā)現(xiàn)方法通常需要一個(gè)測(cè)試用例集,程序通過(guò)在測(cè)試用例集上反復(fù)運(yùn)行來(lái)發(fā)現(xiàn)不變 量,所以測(cè)試用例集的選取在一定程度上決定了不變量的準(zhǔn)確性。隨著動(dòng)態(tài)不變量技術(shù)的發(fā)展,出現(xiàn)一些不變量發(fā)現(xiàn)工具,其中Daikon工具具有很好的發(fā)現(xiàn)能力,Daikon是美國(guó)麻省理工學(xué)院計(jì)算機(jī)科學(xué)實(shí)驗(yàn)室的項(xiàng)目,利用程序執(zhí)行來(lái)發(fā)現(xiàn)可能的不變式。它通過(guò)對(duì)源程序輸入一組測(cè)試用例集,在測(cè)試用例集上運(yùn)行程序,從而利用跟蹤得來(lái)的結(jié)果來(lái)推導(dǎo)不變式。Daikon工具已被廣泛應(yīng)用于研究中,如在工具Eclate和Substra中都有使用。該技術(shù)的優(yōu)點(diǎn)在于已存在優(yōu)秀的工具可以利用,該工具能產(chǎn)生比較好的不變式,可以在預(yù)警時(shí)作為程序合約使用,給合約式程序驗(yàn)證方法提供系統(tǒng)化合約來(lái)源;缺點(diǎn)在于生成的不變式并不完全適用于合約式程序驗(yàn)證,所以需要對(duì)通過(guò)工具產(chǎn)生的不變量進(jìn)行篩選,以提高準(zhǔn)確率。
技術(shù)實(shí)現(xiàn)要素:本發(fā)明的目的在于克服上述已有技術(shù)的不足,并結(jié)合已有技術(shù)的優(yōu)點(diǎn),提供一種基于程序不變量的合約式故障預(yù)警方法,把不變量有效應(yīng)用于軟件故障預(yù)警,對(duì)軟件進(jìn)行運(yùn)行時(shí)監(jiān)督,對(duì)故障在線預(yù)警,保障軟件安全,降低軟件失效率。為了實(shí)現(xiàn)上述目的,本發(fā)明對(duì)基于合約的程序驗(yàn)證進(jìn)行了改進(jìn),結(jié)合了動(dòng)態(tài)不變量發(fā)現(xiàn)技術(shù)設(shè)計(jì)了軟件故障預(yù)警流程,將程序不變量應(yīng)用于故障預(yù)警中,最后將故障預(yù)警結(jié)果記錄到預(yù)警日志中,該方法主要針對(duì)java程序進(jìn)行預(yù)警,具體采用的技術(shù)方案如下:一種基于程序不變量的合約式軟件故障預(yù)警方法,其包括如下步驟:(1)使用Daikon工具為需要預(yù)警的程序生成程序不變量,將需要預(yù)警的源程序和對(duì)應(yīng)于源程序的測(cè)試用例集作為Daikon工具輸入,根據(jù)測(cè)試用例集在Daikon工具上運(yùn)行源程序產(chǎn)生不變量,輸出程序不變量;(2)篩選所述不變量,所述篩選方式包括自動(dòng)篩選和用戶手動(dòng)篩選,并將篩選后的不變量作為合約的一種來(lái)源;(3)手動(dòng)生成由布爾斷言組成的數(shù)據(jù)合約,所述數(shù)據(jù)合約是數(shù)據(jù)流的行為約束;(4)將上述步驟2和3中兩種方式得到的合約以規(guī)格化進(jìn)行表示,并將規(guī)格化表示后的所述合約以注釋的方式插樁到源程序的相應(yīng)位置;(5)將步驟4中插樁到相應(yīng)位置的注釋轉(zhuǎn)換為具有故障檢測(cè)性質(zhì)的代碼,并插樁到源程序的相應(yīng)目標(biāo)位置;(6)上述步驟是對(duì)源程序進(jìn)行預(yù)處理,經(jīng)過(guò)預(yù)處理的程序同時(shí)包含程序本身源代碼和添加的故障檢測(cè)代碼,對(duì)該程序進(jìn)行編譯運(yùn)行,如果程序運(yùn)行過(guò)程中違反了程序合約,則故障檢測(cè)代碼會(huì)自動(dòng)把監(jiān)測(cè)到的故障展示給用戶,表示有故障產(chǎn)生,達(dá)到預(yù)警功能,最后將整個(gè)運(yùn)行過(guò)程中預(yù)警到的故障記錄到預(yù)警日志中。在上述技術(shù)方案的基礎(chǔ)上,所述步驟2中不變量的篩選過(guò)程包括手動(dòng)篩選和自動(dòng)篩選:自動(dòng)篩選方式:采用Daikon內(nèi)置的不變式過(guò)濾工具進(jìn)行過(guò)濾;手動(dòng)篩選方式:將程序中所有程序點(diǎn)的不變量顯示給用戶,用戶可以手動(dòng)選擇是否采用該程序點(diǎn)的不變量。在上述技術(shù)方案的基礎(chǔ)上,所述規(guī)格化合約的類型包括方法前置條件和后置條件型合約、類不變量型合約、循環(huán)不變量型合約以及其他類型合約。在上述技術(shù)方案的基礎(chǔ)上,所述方法前置條件和后置條件型合約包括方法前置條件及方法后置條件,所述方法前置條件是在方法入口處具有的性質(zhì),即當(dāng)程序發(fā)生錯(cuò)誤時(shí),違反前置條件,且所述前置條件在方法入口處插入源程序;所述后置條件是在方法出口處具有的性質(zhì),當(dāng)程序發(fā)生錯(cuò)誤時(shí),違反后置條件,且所述后置條件在方法出口處插入源程序。在上述技術(shù)方案的基礎(chǔ)上,所述類不變量型合約為在整個(gè)類中保持不變的性質(zhì),類中每個(gè)方法調(diào)用時(shí)都要對(duì)該性質(zhì)進(jìn)行檢查是否違反該性質(zhì),且所述類不變量型合約在類體結(jié)束處插入源程序。在上述技術(shù)方案的基礎(chǔ)上,所述循環(huán)不變量型合約用于找出在循環(huán)中出現(xiàn)的錯(cuò)誤,且所述循環(huán)不變量型合約插入循環(huán)頭及循環(huán)體之間。在上述技術(shù)方案的基礎(chǔ)上,所述其他類型合約為不屬于上述方法前置條件和后置條件型合約、類不變量型合約、循環(huán)不變量型合約的其他合約,所述其他類型合約通過(guò)用戶手動(dòng)選擇其插入源程序的位置。在上述技術(shù)方案的基礎(chǔ)上,所述步驟5中將合約注釋均轉(zhuǎn)換為具有故障檢測(cè)性質(zhì)的代碼,并插樁到源程序的相應(yīng)目標(biāo)位置,算法步驟如下:1.遍歷程序中每一處注釋類型;2.根據(jù)注釋類型找出該合約類型以及估計(jì)的該注釋類型的插樁位置;3.使用源代碼插樁技術(shù),在不破壞源代碼結(jié)構(gòu)的基礎(chǔ)上,找到確定的插樁位置,在該處插入具有故障檢測(cè)性質(zhì)的代碼。本發(fā)明的優(yōu)點(diǎn)在于:將采用動(dòng)態(tài)不變量生成技術(shù)生成的不變量以合約的方式作為在線預(yù)警方法的檢測(cè)規(guī)則,提供了合約的來(lái)源,是解決合約制定困難的有效方法,設(shè)置合約的注釋形式和插樁位置,提供基于源代碼的插樁算法,同時(shí)還支持手動(dòng)添加合約,自動(dòng)化程度很高,能有效預(yù)警,使得系統(tǒng)在運(yùn)行期間故障檢測(cè)率較高。附圖說(shuō)明圖1是基于程序不變量的合約式故障預(yù)警流程圖;圖2是Daikon動(dòng)態(tài)不變量發(fā)現(xiàn)過(guò)程。具體實(shí)施方式下面將結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步的描述。如圖1所示,本發(fā)明為一種基于程序不變量的合約式故障預(yù)警方法,所述方法包括以下步驟:(1)使用Daikon工具為需要預(yù)警的程序生成程序不變量,將需要預(yù)警的源程序和對(duì)應(yīng)于源程序的測(cè)試用例集作為Daikon工具輸入,根據(jù)測(cè)試用例集在Daikon工具上運(yùn)行源程序產(chǎn)生不變量,輸出程序不變量;其中需要輸入的測(cè)試用例集是由用戶提供的,生成的不變量是數(shù)據(jù)合約,主要包含三種類型:入口不變量、出口不變量和類不變量。如圖2所示為Daikon動(dòng)態(tài)不變量發(fā)現(xiàn)過(guò)程圖,Daikon工具接受需要分析的源程序,Daikon的java語(yǔ)言前件對(duì)待分析程序進(jìn)行處理,生成一個(gè)類型聲明文件和一個(gè)修改以后添加了觀察點(diǎn)的源程序,然后編譯生成一個(gè)添加了觀察點(diǎn)的新類,通過(guò)用戶設(shè)計(jì)的測(cè)試程序,對(duì)新類多次實(shí)例化,并把觀察到的樣本值寫入到一個(gè)數(shù)據(jù)跟蹤文件中。Daikon利用數(shù)據(jù)跟蹤文件和相關(guān)數(shù)據(jù)的類型聲明文件,推導(dǎo)出相應(yīng)程序點(diǎn)域之間滿足的不變式,并把這些不變式語(yǔ)句輸入到一個(gè)單獨(dú)的文件中。(2)對(duì)生成不變量進(jìn)行篩選,分為對(duì)不變量進(jìn)行自動(dòng)篩選和提供可選操作由用戶手動(dòng)進(jìn)行篩選,將篩選的不變量作為合約的一種來(lái)源,由于步驟1產(chǎn)生的不變量并不是完全適用,為了使得到的不變量更加準(zhǔn)確,采用兩種方式進(jìn)行篩選:1.采用Daikon內(nèi)置的不變式過(guò)濾工具進(jìn)行過(guò)濾;2.將程序中所有程序點(diǎn)的不變量顯示給用戶,用戶可以手動(dòng)選擇是否采用該程序點(diǎn)的不變量;(3)手動(dòng)生成由布爾斷言組成的數(shù)據(jù)合約,所述數(shù)據(jù)合約是數(shù)據(jù)流的行為約束;(4)將上述步驟2和3中兩種方式得到的合約以規(guī)格化進(jìn)行表示,并將規(guī)格化表示后的所述合約以注釋的方式插樁到源程序的相應(yīng)位置,所述規(guī)格化合約的類型包括方法前置條件和后置條件型合約、類不變量型合約、循環(huán)不變量型合約以及其他類型合約。1.方法前置條件和后置條件合約方法前置條件是在方法入口處具有的性質(zhì),即當(dāng)程序發(fā)生錯(cuò)誤時(shí),違反前置條件,且所述前置條件在方法入口處插入源程序。用注 釋形式/*@require+合約*/表示;方法后置條件是在方法出口處具有的性質(zhì),當(dāng)程序發(fā)生錯(cuò)誤時(shí),可能會(huì)違反后置條件,所以后置條件在方法return語(yǔ)句或方法的結(jié)束處。用注釋形式/*@ensure+合約*/表示。2.類不變量合約類不變量是在整個(gè)程序或類中保持不變的性質(zhì),類中每個(gè)方法調(diào)用時(shí)都要對(duì)該性質(zhì)進(jìn)行檢查是否違反該性質(zhì),類不變量型合約在類體結(jié)束處插入源程序。在類定義中,用注釋形式/*@class+合約*/表示。3.循環(huán)不變量合約循環(huán)不變量是為了找出在循環(huán)中出現(xiàn)的典型錯(cuò)誤,例如循環(huán)不結(jié)束問題,循環(huán)不變量放置于循環(huán)頭后,循環(huán)體之前。用注釋形式/*loop+合約*/表示。4.其他類型合約其他類型合約為不屬于上述方法前置條件和后置條件型合約、類不變量型合約、循環(huán)不變量型合約的其他合約,用戶手動(dòng)選擇其插入源程序的位置。用注釋形式/*@normal+合約*/表示。(5)將步驟4中插樁到相應(yīng)位置的注釋轉(zhuǎn)換為具有故障檢測(cè)性質(zhì)的代碼,并插樁到源程序的相應(yīng)目標(biāo)位置;算法步驟如下:1.遍歷程序中每一處注釋類型;2.根據(jù)注釋類型找出該合約類型以及該注釋類型的插樁位置;3.使用源代碼插樁技術(shù),在不破壞源代碼結(jié)構(gòu)的基礎(chǔ)上,找到確定的插樁位置,在該處插入具有故障檢測(cè)性質(zhì)的代碼。(6)上述步驟是對(duì)源程序進(jìn)行預(yù)處理,經(jīng)過(guò)預(yù)處理的程序同時(shí)包含程序本身源代碼和添加的故障檢測(cè)代碼,對(duì)該程序進(jìn)行編譯運(yùn)行,如果程序運(yùn)行過(guò)程中違反了程序合約,則故障檢測(cè)代碼會(huì)自動(dòng)把監(jiān)測(cè)到的故障展示給用戶,表示有故障產(chǎn)生,達(dá)到預(yù)警功能,最后將整個(gè)運(yùn)行過(guò)程中預(yù)警到的故障記錄到預(yù)警日志中。對(duì)于本領(lǐng)域的技術(shù)人員來(lái)說(shuō),可根據(jù)以上描述的技術(shù)方案以及構(gòu)思,做出其它各種相應(yīng)的改變以及變形,而所有的這些改變以及變形都應(yīng)該屬于本發(fā)明權(quán)利要求的保護(hù)范圍之內(nèi)。