謝壽吾
摘要:控制流、數(shù)據(jù)流、控制依賴等是軟件任務(wù)執(zhí)行中比較常用的進(jìn)行程序分析、技術(shù)分析和理解程序的程序模式??商峁┹^完善的異常處理機(jī)制,是現(xiàn)階段市場(chǎng)上流行的程序設(shè)計(jì)語(yǔ)言都基本具備的功能。本文著重分析了Java語(yǔ)言程序中的異常結(jié)構(gòu),并對(duì)該程序結(jié)構(gòu)在分析技術(shù)方面產(chǎn)生的不同影響進(jìn)行了簡(jiǎn)單闡述,希望在后期軟件技術(shù)發(fā)展中有所借鑒。
關(guān)鍵詞:異常結(jié)構(gòu) 控制流分析 數(shù)據(jù)流分析 控制依賴分析 Java語(yǔ)言
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9416(2015)05-0000-00
修改源程序,是軟件維護(hù)的重要組成部分,必須按照分析和理解程序、修改程序、重新驗(yàn)證程序三個(gè)步驟有計(jì)劃、有針對(duì)性的進(jìn)行修改工作。對(duì)整個(gè)源程序的全面、準(zhǔn)確、迅速地分析和理解,是判斷軟件維護(hù)工作質(zhì)量好壞的依據(jù)。而且,整個(gè)軟件程序的理解必須以軟件的可理解和文檔的較高質(zhì)量為基礎(chǔ),繼而加強(qiáng)對(duì)程序功能和目標(biāo)結(jié)果的理解;對(duì)程序中劃分出來(lái)的程序系統(tǒng)結(jié)構(gòu)、控制結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)和輸入輸出結(jié)構(gòu)等各類結(jié)構(gòu)信息的熟悉運(yùn)用;對(duì)程序的相關(guān)數(shù)據(jù)流信息的來(lái)源、如何使用要及時(shí)掌握和廣泛了解;對(duì)每條路徑疏松的控制流信息的執(zhí)行結(jié)果要做到準(zhǔn)確掌握。只有如此,才能更一步提高對(duì)軟件程序進(jìn)行系統(tǒng)行的理解與掌握。
1概述
許多程序設(shè)計(jì)語(yǔ)言的異常處理機(jī)制,多出現(xiàn)在對(duì)錯(cuò)誤問題的解決處理時(shí)卻遇到健壯的程序,這種相對(duì)不匹配的情況。Java語(yǔ)言屬于目前主流型使用軟件,是具備異常處理機(jī)制的典型。它主要包括了對(duì)一個(gè)錯(cuò)誤、異常信號(hào)的拋出和對(duì)獲得的拋出的錯(cuò)誤信號(hào)的正確處理兩方面,即拋出異常和捕獲異常。Java的關(guān)鍵字與它本身的異常處理機(jī)制中三個(gè)組成部分都有較密切的聯(lián)系,下面就這些分別進(jìn)行說(shuō)明。
Throws:即后面跟隨所有隱在的異常類型,是為方便客戶程序員對(duì)該方法的控制,對(duì)客戶程序員進(jìn)行拋出異常這一環(huán)節(jié)。作為方法定義中的一部分,Java程序員必須將可以處理的潛在錯(cuò)誤狀態(tài)進(jìn)行明確的指出,并利用所有可以用得上的該方法中的代碼進(jìn)行處理。這個(gè)新的方法的編寫必須經(jīng)Java編譯器強(qiáng)制性操作整個(gè)過(guò)程。
Throw:即后面跟隨異常對(duì)象。判斷用戶自定義異常對(duì)應(yīng)錯(cuò)誤在何種情況下算是產(chǎn)生的,這是throw語(yǔ)言的作用之一,屬于拋出這個(gè)異常新對(duì)象時(shí)對(duì)該方法的一種調(diào)試功能。在這個(gè)過(guò)程中,編程者必須在程序選擇較為合理的位置創(chuàng)建自定義異常的異常和對(duì)這個(gè)新的異常對(duì)象以throw語(yǔ)句形式進(jìn)行拋出,以此作為系統(tǒng)不能識(shí)別和創(chuàng)建用戶自定義異常的一種處理辦法。
Try-catch-finally:即try塊(警戒區(qū))中對(duì)全部可能拋出異常代碼部分的收集、處理。finally塊是可變化的,try塊中的catch 塊中緊跟著所有的異常及其應(yīng)該處理的部分,finally塊一經(jīng)確定,無(wú)論是否處于有異常產(chǎn)生的情況下都會(huì)執(zhí)行處理功能的。對(duì)關(guān)閉文件和流、釋放系統(tǒng)資源等方面的清理,必須在把控制權(quán)傳輸給其它程序之前通過(guò)這一方法進(jìn)行處理。把系統(tǒng)恢復(fù)到原有狀態(tài),是finally塊的最終目的。
依據(jù)研究發(fā)現(xiàn),總程序數(shù)中try和throw語(yǔ)句程序分別占據(jù)了23.4%和24.6%,是異常處理機(jī)制廣泛使用中的常用比例設(shè)計(jì),這樣不僅可以降低程序代碼量,也是描述具體操作的代碼與專門糾正錯(cuò)誤的代碼相分離的重要工具;但就異常處理機(jī)制的內(nèi)部結(jié)構(gòu)、內(nèi)容而言,過(guò)程內(nèi)部或過(guò)程之間的控制流極易受到continue、goto、exit 語(yǔ)句的類似結(jié)構(gòu)的影響,這會(huì)成為信息結(jié)果不準(zhǔn)確的誘因之一,從而造成在結(jié)構(gòu)測(cè)試、回歸測(cè)試、靜態(tài)程序切片、動(dòng)態(tài)程序切片、程序理解等軟件工程任務(wù)應(yīng)用中的嚴(yán)重錯(cuò)誤。
上面內(nèi)容就是先進(jìn)軟件的主流程序Java 程序中異常結(jié)構(gòu)對(duì)控制流、 數(shù)據(jù)流、 控制依賴在分析技術(shù)應(yīng)用的影響,是程序軟件普遍具備的一種特性,是我們保障軟件順利應(yīng)用必須時(shí)刻注意的問題。下面就此作出分析。
2異常結(jié)構(gòu)對(duì) Java程序靜態(tài)分析的具體影響
所測(cè)試的程序在靜態(tài)分析程序中無(wú)需執(zhí)行就可掃描正文、直接分析程序的數(shù)據(jù)流和控制流、送出測(cè)試報(bào)告。
2.1異常結(jié)構(gòu)影響控制流分析
控制流圖以控制狀態(tài)為描述主體,通過(guò)對(duì)系統(tǒng)控制轉(zhuǎn)移路徑的刻畫和在特定數(shù)據(jù)驅(qū)動(dòng)下具體狀態(tài)的反映,將程序控制流從控制角度進(jìn)行詳細(xì)描述的一種圖示方法。在軟件應(yīng)用中,數(shù)據(jù)流分析、 控制依賴分析等許多程序分析技術(shù)和結(jié)構(gòu)測(cè)試、 回歸測(cè)試等軟件工程任務(wù)都在利用控制流圖的描述信息。程序所有可能的執(zhí)行路徑,用語(yǔ)句層次上的控制流圖表示;程序語(yǔ)句塊用控制流圖中的結(jié)點(diǎn)表示;程序語(yǔ)句塊之間可能的控制轉(zhuǎn)移用邊表示。將異常結(jié)構(gòu)引入語(yǔ)句層次的控制流圖可以促進(jìn)控制流信息更加準(zhǔn)確地把握,換句話說(shuō),就是對(duì)控制流的整個(gè)程序分析必須對(duì)執(zhí)行 try 語(yǔ)句的所有路徑實(shí)行系統(tǒng)性研究。為了保障這一過(guò)程,控制流圖進(jìn)行四種有效路徑的合理增加。一是當(dāng)異常在try 塊順利完成且被finally 塊拋出后沿調(diào)用棧傳播繼續(xù)傳播;二是當(dāng)異常被try塊拋出后該曾未經(jīng)處理或catch 塊拋出其它異常時(shí),將繼續(xù)沿調(diào)用棧傳播;三是當(dāng)異常被try塊拋出后該曾的catch 塊將異常已經(jīng)進(jìn)行了處理;四是當(dāng)異常被try塊拋出后由相應(yīng)的catch塊捕捉了后finally塊又拋出了另一異常。
過(guò)程間的控制流圖,需要將所有過(guò)程按照下列方法連接。一是將每個(gè)調(diào)用結(jié)點(diǎn)和被調(diào)用方法的控制流圖中的入口結(jié)點(diǎn)連接起來(lái);二是將控制流中的退出結(jié)點(diǎn)和調(diào)用方法相對(duì)應(yīng)的結(jié)點(diǎn)連接起來(lái);三是當(dāng)異常被一個(gè)方法拋出后經(jīng)調(diào)用方法捕捉,將退出結(jié)點(diǎn)與調(diào)用方法中相應(yīng)的 catch 結(jié)點(diǎn)連接起來(lái)。異常被調(diào)用方法傳播同時(shí)也已捕捉;異常被調(diào)用方法傳播卻并未處理異常。這兩者均是異常處理機(jī)制在過(guò)程間的控制流圖中逐步加入的兩個(gè)路徑。
2.2影響數(shù)據(jù)流分析的異常結(jié)構(gòu)
數(shù)據(jù)變換是系統(tǒng)模型的主要功能作用。系統(tǒng)模型是一系列加工單元對(duì)軟件系統(tǒng)的抽象表現(xiàn),數(shù)據(jù)流促進(jìn)各單元之間的相互關(guān)聯(lián)、讓加工單元傳輸并向其不斷轉(zhuǎn)化。程序中使用數(shù)據(jù)、 定義數(shù)據(jù)和數(shù)據(jù)依賴等信息的匯聚過(guò)程就是數(shù)據(jù)流分析。
帶有異常結(jié)構(gòu)的數(shù)據(jù)流在現(xiàn)階段有兩種基本方法進(jìn)行分析。一是數(shù)據(jù)流不斷加入異常結(jié)構(gòu);二是單獨(dú)表現(xiàn)異常結(jié)構(gòu)的數(shù)據(jù)流。數(shù)據(jù)流分析中受異常結(jié)構(gòu)的影響中, 程序信息被控制流圖表示出來(lái),異常結(jié)構(gòu)的數(shù)據(jù)流逐漸加入到原數(shù)據(jù)流圖中。下面就用舉例法對(duì)數(shù)據(jù)流分析中異常結(jié)構(gòu)的影響作用進(jìn)行分析。
圖1中,調(diào)用結(jié)點(diǎn)和被調(diào)用方法的控制流圖中的入口結(jié)點(diǎn)用較粗的虛線連接,而異常退出結(jié)點(diǎn)和調(diào)用方法中相應(yīng)的 catch 結(jié)點(diǎn)用較細(xì)的虛線連接??紤]異常路徑影響到達(dá)-定值、活躍變量、定值-引用鏈的具體情況,是帶有異常結(jié)構(gòu)的控制流圖進(jìn)行數(shù)據(jù)流分析的必要條件。變量的定值點(diǎn)到達(dá)的點(diǎn)會(huì)在異常路徑中有所變化,是到達(dá)-定值常出現(xiàn)的情況。新的到達(dá)點(diǎn)(8)(9)(10)在變量 x 的定值點(diǎn)增加后,必然導(dǎo)致到達(dá)點(diǎn)(5)的減少,某些變量的活躍點(diǎn)在異常路徑中明顯有所增加。一方面,異常結(jié)構(gòu)對(duì)定值- 引用鏈的影響,使定值-引用鏈無(wú)法沿異常路徑被發(fā)現(xiàn)。若(9)對(duì)變量x的引用被它在(1)的定值忽略,就會(huì)導(dǎo)致定值-引用鏈< 3,5>的丟掉。另一方面,新的定值-引用鏈在沿異常路徑中被增加。若(9)對(duì)變量x的引用被它在(1)的定值增加了,就會(huì)導(dǎo)致新的定值-引用鏈< 1,9>的增加。在用控制流圖表示數(shù)據(jù)流信息后,也會(huì)因此將數(shù)據(jù)流中異常對(duì)其產(chǎn)生的影響加以表示在該圖上面。
2.3影響程序依賴性分析的異常結(jié)構(gòu)
通常情況下會(huì)利用程序依賴圖表示程序的依賴性??刂埔蕾嚭蛿?shù)據(jù)依賴,是定義中程序依賴圖的結(jié)點(diǎn)之間存在的兩種有向邊。其中,程序中條件語(yǔ)句、循環(huán)語(yǔ)句等對(duì)嵌入其中的語(yǔ)句的控制關(guān)系是由控制依賴描述的,而賦值語(yǔ)句中左值對(duì)右值的數(shù)據(jù)依賴關(guān)系是由數(shù)據(jù)依賴進(jìn)行描述的。由于控制依賴和數(shù)據(jù)依賴在異常的影響下表現(xiàn)類似,本文只對(duì)控制依賴在異常影響下的表現(xiàn)進(jìn)行了論述。entry結(jié)點(diǎn)與程序的關(guān)系為控制依賴,屬于通常定義中程序的入口結(jié)點(diǎn)。如圖2所示,是圖1源程序的控制依賴圖中的控制依賴部分。
一般情況下,程序控制依賴受異常的影響,主要產(chǎn)生了兩個(gè)方面的表現(xiàn)。一是經(jīng)常借助其他方法表示catch塊中的語(yǔ)句。如g( )方法中的(4),是main( ) 中的catch 塊中的語(yǔ)句(9)(10)經(jīng)常產(chǎn)生依賴的,而不是對(duì)方法 main( ) 的入口;二是某個(gè)方法在被調(diào)用的過(guò)程中可能會(huì)將異常拋出,從而導(dǎo)致有關(guān)調(diào)用方法的返回位置不能被確定,被調(diào)用方法中的語(yǔ)句可能被方法中的某些語(yǔ)句產(chǎn)生依賴。 若g()在main()的調(diào)用中將異常拋出,就將進(jìn)行main()中(8)的執(zhí)行命令;若是沒有將異常拋出,就會(huì)在(7)的返回后進(jìn)行執(zhí)行命令的繼續(xù)。事實(shí)上,g()中的(4)就會(huì)被該方法 main()中的(7)產(chǎn)生依賴?,F(xiàn)階段,有人為了實(shí)現(xiàn)傳統(tǒng)的程序依賴圖對(duì)程序語(yǔ)句之間的依賴信息準(zhǔn)確表達(dá)出來(lái),逐漸開始了程序依賴圖新的表示方法的分析研究。
3結(jié)語(yǔ)
Java語(yǔ)言是現(xiàn)今主流軟件的典型代表,本文以此進(jìn)行了傳統(tǒng)程序分析技術(shù)在異常結(jié)構(gòu)下的影響表現(xiàn)分析。許多軟件工具都在將控制流分析、 數(shù)據(jù)流分析、 控制依賴分析得到的信息進(jìn)行了應(yīng)用。從實(shí)際情況分析,為了保障獲取信息的準(zhǔn)確度,必須將異常結(jié)構(gòu)對(duì)控制流分析、 數(shù)據(jù)流分析、 控制依賴分析三者的具體影響充分考慮進(jìn)去。否則,一些不確定信息在軟件工具中的實(shí)際運(yùn)用,只會(huì)造成軟件程序運(yùn)行的一些嚴(yán)重性后果的產(chǎn)生。
參考文獻(xiàn)
[1]宋道遠(yuǎn),賁可榮.Java程序異常信息分析插件的研究與設(shè)計(jì)[J].計(jì)算機(jī)科學(xué),2014(08).
[2]岳珍梅,張偉剛.Java程序分析工具在復(fù)雜網(wǎng)絡(luò)背景下的分析與設(shè)計(jì)[J].電子技術(shù)與軟件工程,2014(13).
[3]時(shí)雷,虎曉紅,席磊,張浩.Java程序設(shè)計(jì)課程教學(xué)分析[J].計(jì)算機(jī)教育,2010(14).
[4]杜延寧,趙銀亮,韓博,李遠(yuǎn)成.一種數(shù)據(jù)結(jié)構(gòu)制導(dǎo)的線程劃分方法與執(zhí)行模型[J].軟件學(xué)報(bào),2013(10).
[5]李龍飛.基于復(fù)雜網(wǎng)絡(luò)的Java程序分析工具設(shè)計(jì)與實(shí)現(xiàn)思路淺談[J].電腦知識(shí)與技術(shù),2014(06).
數(shù)字技術(shù)與應(yīng)用2015年5期