一種可動態(tài)部署規(guī)則的Java程序運行時驗證系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及運行時程序驗證領(lǐng)域,具體是一種可以將規(guī)則動態(tài)部署的針對Java程序的運行時驗證系統(tǒng)。
【背景技術(shù)】
[0002]程序驗證技術(shù)對于保證程序的正確性起著關(guān)鍵性作用。程序驗證技術(shù)主要包括傳統(tǒng)的靜態(tài)程序驗證技術(shù)和運行時程序驗證技術(shù),兩者的不同在于開展驗證過程的時機。傳統(tǒng)的靜態(tài)程序驗證技術(shù)包括模型檢測和定理證明,旨在對于整個系統(tǒng)進(jìn)行形式化建模驗證,其主要缺點在于靜態(tài)方法導(dǎo)致的狀態(tài)空間爆炸,使得其不具備可擴展性,無法對大型系統(tǒng)進(jìn)行驗證。運行時程序驗證技術(shù)則只關(guān)注程序的具體執(zhí)行路徑是否滿足具體的特性,大大減少了驗證空間,使得程序驗證變得真正可行。
[0003]運行時程序驗證分為三步,首先通過用戶定義或者程序挖掘得到規(guī)則描述,然后驗證系統(tǒng)根據(jù)規(guī)則通過自動或手動注入代碼獲取到相關(guān)事件,最后驗證系統(tǒng)根據(jù)規(guī)則對產(chǎn)生的事件系列進(jìn)行驗證,以檢測目標(biāo)系統(tǒng)是否違背規(guī)則。
[0004]近年來運行時程序驗證受到了越來越多的關(guān)注,有大量技術(shù)被開發(fā)出來,主要集中在解決第一步規(guī)則描述和第三步驗證過程中的問題。
[0005]對于第一步,現(xiàn)有技術(shù)解決的問題主要是如何增強規(guī)則描述語法的表達(dá)能力,從而使得規(guī)則描述更加簡單?,F(xiàn)有的描述語法包括:有限狀態(tài)機模型(FSM)、上下文無關(guān)文法(CFG)、擴展正則表達(dá)式(ERE)和線性時序邏輯(LTL)等等,已經(jīng)能夠很好地表達(dá)各種基本事件序列規(guī)則和含參事件序列規(guī)則。
[0006]對于第三步,現(xiàn)有技術(shù)解決的問題主要是如何在產(chǎn)生較小性能開銷的前提下完成驗證工作。具體的技術(shù)有結(jié)合靜態(tài)分析優(yōu)化注入代碼、對監(jiān)控對象進(jìn)行采用更好的垃圾回收機制等等,現(xiàn)有的技術(shù)已經(jīng)能夠做到在較低的資源耗費下對單個規(guī)則進(jìn)行驗證,但多個規(guī)則同時驗證仍需耗費大量資源。
[0007]然而,現(xiàn)有技術(shù)對如第二步的探索很少,大部分技術(shù)依賴于傳統(tǒng)的注入工具,例如AspectJ來注入代碼,使得現(xiàn)有驗證系統(tǒng)有如下缺點:(I)無法在運行時動態(tài)部署驗證規(guī)則
(2)無法針對驗證結(jié)果進(jìn)行動態(tài)注入優(yōu)化。
[0008]通過檢索發(fā)現(xiàn),瑞士盧加諾大學(xué)開發(fā)的Java字節(jié)碼注入工具DiSL,能夠動態(tài)部署和反部署注入代碼,具有很高的靈活性,同時提供自定義代碼編織接口,使得編織時數(shù)據(jù)能夠被收集到,從而用于運行時優(yōu)化。在本發(fā)明的系統(tǒng)中,DiSL被選為Java程序運行時驗證的字節(jié)碼注入框架。
【發(fā)明內(nèi)容】
[0009]針對現(xiàn)有動態(tài)程序驗證技術(shù)的不足,本發(fā)明提出了可動態(tài)部署規(guī)則的Java程序運行時驗證系統(tǒng),能夠在不影響目標(biāo)程序運行的前提下動態(tài)部署、反部署和重部署用戶定義規(guī)則,具有很高的靈活性,同時能夠根據(jù)運行時驗證結(jié)果對代碼注入進(jìn)行動態(tài)優(yōu)化,有效降低了驗證系統(tǒng)的性能開銷。
[0010]本發(fā)明的技術(shù)解決方案如下:
[0011]一種可動態(tài)部署規(guī)則的Java程序運行時驗證系統(tǒng),該系統(tǒng)運行于DiSL字節(jié)碼注入框架之上,包括驗證規(guī)則翻譯器、部署管理器以及運行時引擎三個模塊。
[0012]所述驗證規(guī)則翻譯器用于將驗證規(guī)則定義文件翻譯成由事件注入代碼和規(guī)則驗證代碼組合成驗證代碼;
[0013]所述部署管理器用于提供部署驗證代碼的相關(guān)用戶接口 ;
[0014]所述運行時引擎用于根據(jù)接收的驗證代碼中事件注入代碼產(chǎn)生的事件序列,為每個監(jiān)控對象維護一個事件序列,驗證事件注入代碼產(chǎn)生的事件序列是否與規(guī)則驗證代碼的事件序列相同,并根據(jù)驗證情況通過部署管理器對事件注入代碼進(jìn)行實時部署優(yōu)化。
[0015]優(yōu)選地,所述驗證規(guī)則定義文件為AspectJ語言切片語法描述的事件定義和狀態(tài)機語言定義的事件序列規(guī)則。
[0016]優(yōu)選地,所述部署管理器提供的相關(guān)用戶接口包括:將驗證代碼注入到目標(biāo)Java程序的動態(tài)部署接口、根據(jù)運行時引擎的驗證從目標(biāo)Java程序中移除違反了驗證規(guī)則和已通過驗證的驗證代碼的動態(tài)反部署接口、動態(tài)更新目標(biāo)Java程序中已部署規(guī)則的動態(tài)重部署接口
[0017]優(yōu)選地,所述運行時引擎包括規(guī)則監(jiān)控器模塊和部署優(yōu)化器模塊:
[0018]所述規(guī)則監(jiān)控器模塊根據(jù)接收的驗證代碼中事件注入代碼產(chǎn)生的事件序列,為每個監(jiān)控對象維護一個事件序列,驗證產(chǎn)生的事件序列是否與規(guī)則驗證代碼定義的事件序列相同;
[0019]所述部署優(yōu)化器模塊根據(jù)規(guī)則監(jiān)控器的驗證結(jié)果,將已違背規(guī)則驗證代碼的事件注入代碼和路徑已完全覆蓋的事件注入代碼動態(tài)移除。
[0020]優(yōu)選地,所述驗證規(guī)則翻譯器將將驗證規(guī)則定義文件翻譯成由事件注入代碼和規(guī)則驗證代碼組合成驗證代碼的過程為:
[0021]a)驗證規(guī)則翻譯器對驗證規(guī)則進(jìn)行詞法分析,生成token流;
[0022]b)驗證規(guī)則翻譯器對token流進(jìn)行語法分析,生成事件對象集合和規(guī)則對象集合;
[0023]c)驗證規(guī)則翻譯器分別將事件對象集合和規(guī)則對象集合生成為事件注入代碼和規(guī)則驗證代碼。
【附圖說明】
[0024]圖1為本發(fā)明的系統(tǒng)結(jié)構(gòu)示意圖;
[0025]圖2為本發(fā)明中驗證規(guī)則定義樣本;
[0026]圖3為本發(fā)明中驗證規(guī)則翻譯器架構(gòu);
[0027]圖4為本發(fā)明中部署管理器的接口類型示意圖。
【具體實施方式】
[0028]本實施例在以本發(fā)明技術(shù)方案為前提的情況下進(jìn)行實施,下面對具體的實施方式和操作過程作詳細(xì)說明。本發(fā)明的驗證范圍包括但不限于這些實施例。
[0029]圖1所示為可動態(tài)部署規(guī)則的Java程序運行時驗證系統(tǒng)架構(gòu)。結(jié)合圖1,本實施例的具體流程為:
[0030]步驟I)用戶提供圖2所示驗證規(guī)則定義文件。
[0031]其中:a)驗證規(guī)則名稱為HasNext,驗證對象類型為Iterator ;
[0032]b)事件 callHasNext 和 callNext,由 AspectJ 語言切片定義;
[0033]c)狀態(tài)機狀態(tài)集合safe,unsafe
[0034]d)事件發(fā)生時狀態(tài)轉(zhuǎn)移規(guī)則
[0035]e)狀態(tài)機到達(dá)unsafe狀態(tài)時的動作,包括調(diào)用驗證失敗函數(shù)和輸出錯誤信息。
[0036]步驟2)驗證規(guī)則翻譯器將驗證規(guī)則定義文件翻譯成驗證代碼,驗證代碼包括事件注入代碼和規(guī)則驗證代碼。
[0037]圖3給出了驗證規(guī)則翻譯器的架構(gòu)和翻譯流程,具體為:
[0038]a)驗證規(guī)則翻譯器對驗證規(guī)則進(jìn)行詞法分析,生成token流;
[0039]b)驗證規(guī)則翻譯器對token流進(jìn)行語法分析,生成事件對象集合和規(guī)則對象集合;
[0040]c)驗證規(guī)則翻譯器分別將事件對象集合和規(guī)則對象集合生成為事件注入代碼和規(guī)則驗