專利名稱:軟件程序中變量的不安全使用的檢測方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種軟件程序缺陷的檢測方法,尤其涉及軟件中與異常處理相關(guān)的程 序變量的不安全使用的檢測方法,屬于程序分析技術(shù)領(lǐng)域。
背景技術(shù):
軟件程序的運(yùn)行依賴于一定的運(yùn)行環(huán)境,運(yùn)行環(huán)境直接影響軟件運(yùn)行結(jié)果的正確 性。例如運(yùn)行時計算機(jī)內(nèi)存耗盡,可能導(dǎo)致程序被迫停止,而沒有產(chǎn)生正確的執(zhí)行結(jié)果。 這種違背預(yù)期正常執(zhí)行的程序行為,稱為程序發(fā)生異常。為了提高軟件程序的可靠性,使軟 件程序更好的適應(yīng)動態(tài)變化的運(yùn)行環(huán)境,需要在軟件設(shè)計時在程序中加入異常處理模塊, 預(yù)先指定程序發(fā)生異常后應(yīng)當(dāng)執(zhí)行的操作,以減少程序運(yùn)行過程中的意外終止。高級程序設(shè)計語言如JAVA、C++等,提供了異常處理機(jī)制,將異常處理技術(shù)固化在 程序設(shè)計語言結(jié)構(gòu)中。異常處理機(jī)制包括預(yù)先設(shè)定了程序運(yùn)行時可能捕獲到的所有異常 類型,在程序運(yùn)行過程中監(jiān)測異常的發(fā)生,當(dāng)發(fā)生異常時,生成異常對象,并通過異常傳播 機(jī)制,將異常傳遞給相應(yīng)的異常處理模塊。異常處理模塊是程序員預(yù)先設(shè)定的異常發(fā)生后 的處理動作。設(shè)計程序時,程序員將程序中的一段代碼指定為警戒區(qū)域,當(dāng)警戒區(qū)域內(nèi)部出 現(xiàn)異常時,程序跳轉(zhuǎn)到異常處理模塊,執(zhí)行程序員事先指定的異常處理操作,使程序繼續(xù)運(yùn) 行下去,避免程序的崩潰。然而異常處理模塊的引入,增加了程序的控制流程,從而增加了編程的難度。最近 的一些調(diào)研報告指出,在實(shí)際開發(fā)中,異常處理代碼的質(zhì)量往往不高,程序的異常處理模塊 中普遍存在設(shè)計缺陷,且這類缺陷難以被現(xiàn)有的方法和工具發(fā)現(xiàn)。因此,需要一種發(fā)現(xiàn)軟件 異常處理模塊缺陷的方法,以提高軟件質(zhì)量。目前改進(jìn)軟件質(zhì)量的技術(shù)主要有軟件測試、代碼評審以及形式驗(yàn)證。軟件測試, 是使用人工或者自動方式來生成程序的輸入,運(yùn)行程序獲得輸出結(jié)果,通過比較輸出結(jié)果 是否與預(yù)期相符來判斷程序中是否存在缺陷。它要求被測試的是一個可運(yùn)行的系統(tǒng),并接 受一定的輸入。但是通過程序的輸入難以控制程序運(yùn)行時產(chǎn)生異常,也就難以得到異常發(fā) 生后程序的輸出結(jié)果,因此難以判斷程序異常執(zhí)行路徑上是否存在缺陷。代碼評審也稱代 碼復(fù)查,是指通過閱讀代碼來檢查源代碼與編碼標(biāo)準(zhǔn)的符合性以及代碼質(zhì)量,通常由人手 工完成,因此效率不高。軟件形式驗(yàn)證的主要思想是通過使用形式證明的方式來驗(yàn)證一個 程序設(shè)計得是否正確,它不適用于大規(guī)模的軟件系統(tǒng)。在軟件開發(fā)過程中,發(fā)現(xiàn)并修正程序缺陷是一個花費(fèi)巨大的工作。軟件產(chǎn)品的開 發(fā)依次歷經(jīng)需求、設(shè)計、編碼、測試、部署幾個階段。軟件開發(fā)的普遍經(jīng)驗(yàn)表明盡早的發(fā)現(xiàn) 程序中的缺陷,盡早的改正,有助于降低軟件開發(fā)的成本。因此,與軟件測試、代碼評審以及 形式驗(yàn)證的方法相比,利用程序的靜態(tài)分析技術(shù)能夠在程序開發(fā)的早期自動化的發(fā)現(xiàn)程序 中的缺陷,有助于降低軟件開發(fā)的成本。目前,已經(jīng)有一些研究成果,能夠利用程序分析技術(shù)自動的發(fā)現(xiàn)程序中的缺陷。包 括
開源軟件工具 FindBugs (http //f indbugs. sourceforge. net/)是一個利用靜 態(tài)程序分析技術(shù)檢測Java程序缺陷模式的工具。所謂缺陷模式,是指某些編碼習(xí)慣,它們 通常都是程序的缺陷?!?JLint (http://artho. com/jlint/)與 FindBugs 類似,分析 Java 程序,執(zhí)行語 法檢查和數(shù)據(jù)流分析?!?PMD (http //pmd. sourceforge. net/)只對 Java 源代碼進(jìn)行語法檢查,主要用 于檢查程序代碼風(fēng)格。這些工具能夠檢測出來的程序缺陷有空引用、并發(fā)程序中的死鎖、數(shù)組長度小于 零、以零作為除數(shù)、不可達(dá)的程序代碼(dead code)、在執(zhí)行路徑中輸入輸出流沒有關(guān)閉等。已有的方法、技術(shù)及工具表明利用靜態(tài)程序分析的方法,能夠有效的發(fā)現(xiàn)程序設(shè) 計的缺陷,有助于改善程序質(zhì)量。但同時,已有的方法、技術(shù)及工具還有不完善的地方,它們 并不能找出所有的程序缺陷,特別是程序異常處理模塊的設(shè)計缺陷。軟件程序應(yīng)該具有這樣的特性當(dāng)一個操作在執(zhí)行過程中發(fā)生異常而失效時,依 賴于這個操作成功執(zhí)行的后續(xù)操作應(yīng)該停止執(zhí)行。否則會將不正確的程序狀態(tài)繼續(xù)傳播下 去,引起不正確的程序結(jié)果。軟件程序的這個特性稱為依賴安全(cbpendency safety)。依 賴安全的特性保證了當(dāng)程序由于異常或其它原因?qū)е虏僮魇r,程序能夠停止在一個一 致的狀態(tài)。違背了這個特性,往往意味著程序設(shè)計的缺陷。現(xiàn)有的方法、技術(shù)及工具并不能 發(fā)現(xiàn)軟件程序設(shè)計中的這種缺陷,因此本發(fā)明提供了一種靜態(tài)檢測方法,利用程序中變量 之間的依賴關(guān)系,檢測軟件程序中的這種缺陷。
發(fā)明內(nèi)容
本發(fā)明針對軟件程序中變量的不安全使用這種缺陷模式,提供了一種檢測程序異 常處理模塊缺陷的自動化方法,降低了軟件開發(fā)的成本,提高了程序質(zhì)量,減少了軟件運(yùn)行 中可能出現(xiàn)的問題。本發(fā)明提供的軟件程序中變量的不安全使用的檢測方法,包括以下步驟1)建立軟件程序的控制流圖。2)根據(jù)控制流圖,對程序進(jìn)行層次化的數(shù)據(jù)流分析,獲得程序中每一個變量的操 作序列。3)檢測每個操作序列中是否出現(xiàn)變量的不安全使用。所述變量的不安全使用是指操作序列中依次出現(xiàn)eDef和Use,且eDef和Use之間 不存在其它eDef和sDef操作時,Use為變量的不安全使用。所述軟件程序中包括正常程序語句和警戒區(qū)域還包括異常處理模塊或/和 finally 模塊。所述控制流圖的建立方法如下A、建立正常執(zhí)行路徑。其方法為將每條正常程序語句設(shè)定為一個節(jié)點(diǎn),按語句執(zhí) 行順序,兩相鄰語句之間設(shè)置有向邊。有向邊為程序的正常執(zhí)行路徑,有向邊的方向表示語 句執(zhí)行的先后順序。B、建立警戒區(qū)域內(nèi)部執(zhí)行路徑。其方法為將警戒區(qū)域內(nèi)的每條語句設(shè)定為一個 節(jié)點(diǎn),按照語句執(zhí)行順序,兩相鄰語句之間設(shè)置有向邊。有向邊為警戒區(qū)域內(nèi)部執(zhí)行路徑,有向邊的方向表示語句執(zhí)行的先后順序。C、建立正常程序語句與后續(xù)警戒區(qū)域之間的有向邊,有向邊的方向表示語句執(zhí)行 的先后順序。D、建立異常執(zhí)行路徑。其方法為若警戒區(qū)域拋出異常對象,查找與異常對象相對 應(yīng)的異常處理模塊,若查找到,建立異常處理模塊內(nèi)部執(zhí)行路徑,并在異常對象節(jié)點(diǎn)與異常 處理模塊的第一個節(jié)點(diǎn)之間建立有向邊;若查找不到,設(shè)置異常退出節(jié)點(diǎn),建立異常對象節(jié) 點(diǎn)指向異常退出節(jié)點(diǎn)的有向邊。E、查找finally模塊,若查找到,建立finally模塊內(nèi)部執(zhí)行路徑;建立警戒區(qū)域 最后節(jié)點(diǎn)和異常處理模塊最后節(jié)點(diǎn)指向finally模塊之間的有向邊;建立finally模塊與 后續(xù)正常語句節(jié)點(diǎn)之間的有向邊;將finally模塊插入異常對象節(jié)點(diǎn)與異常退出節(jié)點(diǎn)之 間,按語句執(zhí)行順序建立有向邊,即按異常對象節(jié)點(diǎn)、finally模塊和異常退出節(jié)點(diǎn)的順序 建立有向邊;若查找不到,建立警戒區(qū)域最后節(jié)點(diǎn)指向后續(xù)正常程序語句的有向邊;并建立異 常處理模塊最后節(jié)點(diǎn)指向后續(xù)正常程序語句的有向邊。建立異常處理模塊內(nèi)部執(zhí)行路徑的方法為將異常處理模塊內(nèi)的每條語句設(shè)定為 一個節(jié)點(diǎn),按照語句執(zhí)行順序,兩相鄰語句之間設(shè)置有向邊。有向邊為異常處理模塊內(nèi)部執(zhí) 行路徑,有向邊的方向表示語句執(zhí)行的先后順序。建立finally模塊內(nèi)部執(zhí)行路徑的方法為將finally模塊內(nèi)的每條語句設(shè)定為 一個節(jié)點(diǎn),按照語句執(zhí)行順序,兩相鄰語句之間設(shè)置有向邊。有向邊為finally模塊內(nèi)部執(zhí) 行路徑,有向邊的方向表示語句執(zhí)行的先后順序。所述與異常對象相對應(yīng)的異常處理模塊是指該異常處理模塊參數(shù)的異常類型與 異常對象的類型相同,或異常處理模塊參數(shù)的異常類型是異常對象的父類型。所述警戒區(qū)域?yàn)閠ry語句塊;所述異常處理模塊為catch語句塊。所述第2)步的執(zhí)行方法如下A、確定控制流圖中對變量進(jìn)行操作的節(jié)點(diǎn)的變量操作類型;B、遍歷控制流圖,為控制流圖中每一條執(zhí)行路徑上的每一個變量生成操作序列。所述變量操作類型為sDef,eDef, Use,以如何改變變量的狀態(tài)為三種操作類型的 定義依據(jù)。在程序中,變量的類型有兩種基本數(shù)據(jù)類型和抽象數(shù)據(jù)類型。對于基本數(shù)據(jù)類 型,如整型、浮點(diǎn)型、布爾型的變量,變量狀態(tài)是指這個變量的值。而對于抽象數(shù)據(jù)類型的 變量,變量狀態(tài)由其屬性決定,例如對象的狀態(tài)由其成員變量的狀態(tài)決定。操作作用于變 量,按照是否改變變量狀態(tài),操作可分為兩類定義(Define),如果操作改變了變量的狀態(tài),那么這個操作是一個定義操作,它發(fā) 生在改變了變量狀態(tài)的語句中。例如對變量的賦值,是對這個變量的定義操作。對于抽象 數(shù)據(jù)類型的變量,如果操作改變了其任意一個屬性的值,則這個操作是對該變量的定義操 作。使用(Use),如果操作沒有改變變量的狀態(tài),只是引用它,那么這個操作是對該變 量的使用操作。對于抽象數(shù)據(jù)類型的變量,如果變量所有屬性的狀態(tài)都沒有被改變,那么這 個操作是對該變量的使用操作。由于軟件運(yùn)行時可能發(fā)生異常,定義操作執(zhí)行時可能失效,使變量的狀態(tài)無法被成功的改變。因此,定義操作會出現(xiàn)兩類成功地改變了變量狀態(tài)的操作是成功定義操作 (sDef),而由于定義操作執(zhí)行過程中出現(xiàn)異常導(dǎo)致變量定義不成功的操作為異常定義操作 (eDef)。所述變量的操作序列是指在控制流圖的一條執(zhí)行路徑上,順次出現(xiàn)的對該變量進(jìn) 行操作的操作類型的序列。所述第3)步的執(zhí)行方法如下檢測每一個變量的操作序列,確定序列中是否出現(xiàn)相鄰的eDef和Use,若序列中 依次出現(xiàn)相鄰的eDef、Use操作,則該Use操作為對該變量的不安全使用。所述的程序?yàn)镴ava程序。所述“變量的不安全使用”是指在一個變量的操作序列中,變量的使用操作(Use) 之前存在一個異常定義操作(eDef),且它和這個異常定義操作(eDef)之間不存在任何其 它的定義(Define)操作。在程序的執(zhí)行路徑上,同一變量的操作序列中,不同的定義操作 (Define)類型,會出現(xiàn)不同的變量使用。當(dāng)變量的使用操作之前存在的定義操作是成功定 義操作(sDef)時,則是對變量安全的使用;而當(dāng)變量的使用操作之前存在一個異常定義操 作(eDef),且它和這個異常定義操作之間不存在任何其它的定義操作,就出現(xiàn)了變量的不 安全使用??梢孕问交拿枋鋈缦铝?= {sDef, eDef, Use}是對變量的操作集合。S (ν)= <al,a2,... , ak >是程序中一條執(zhí)行路徑上對變量ν的操作序列,其中% e 0 (1彡i彡k)。 如果 ap = eDef, aq = Use, 1 彡 ρ < q 彡 k,且Vay,ρ < j < q,a」乒 sDef, a」乒 eDef,那么
是由ap異常引起的對變量ν的不安全的使用,它破環(huán)了程序應(yīng)當(dāng)具有的依賴安全的屬性。由于變量不安全的使用難以用現(xiàn)有的軟件分析和測試技術(shù)發(fā)現(xiàn),程序往往繼續(xù)錯 誤運(yùn)行,導(dǎo)致產(chǎn)生新的異常,引起非預(yù)期的程序終止,或生成錯誤的輸出結(jié)果。因此,需要盡 早檢測出這種不安全的變量使用,尤其是必須在軟件開發(fā)的早期就發(fā)現(xiàn)這樣的缺陷,以減 少開發(fā)成本,保證程序的正常運(yùn)行。本發(fā)明的有益效果本發(fā)明所提出的軟件程序中不安全的變量使用的檢測方法,能快速檢測到不安全 的變量使用,運(yùn)用在程序軟件的開發(fā)早期,能及早發(fā)現(xiàn)程序中的缺陷,改善代碼質(zhì)量,提高 軟件的可靠性,降低軟件開發(fā)成本。
圖1是本發(fā)明檢測方法的流程框圖;圖2是建立控制流圖的方法的流程框圖;圖3是對控制流圖進(jìn)行層次化的數(shù)據(jù)流分析的流程框圖;圖4是由實(shí)施例1的示例程序片段生成的控制流圖;圖5是在圖4的基礎(chǔ)上標(biāo)明了變量操作類型的控制流圖;圖6是由實(shí)施例2的示例程序片段生成的控制流圖;圖7是在圖6的基礎(chǔ)上標(biāo)明了變量操作類型的控制流圖;圖8是由實(shí)施例3的示例程序片段生成的控制流圖;圖9是在圖8的基礎(chǔ)上標(biāo)明了變量操作類型的控制流圖。
具體實(shí)施例方式下面根據(jù)實(shí)施例和附圖詳細(xì)說明本發(fā)明的方法。實(shí)施例1表1是一段Java程序,該程序中除正常程序語句外,還包括try語句塊、catch 語句塊和finally模塊,try語句塊為警戒區(qū)域,catch語句塊為異常處理模塊。在程序 運(yùn)行時,程序第4行和第5行語句可能出現(xiàn)異常,若第5行語句執(zhí)行過程中拋出類型為 IOException的異常對象,此時控制流將轉(zhuǎn)移到第8行的語句,而使第5行對變量str的賦 值失效。程序繼續(xù)執(zhí)行下去,在第14行通過調(diào)用str. IengthO方法使用了變量str,此處 是對變量str的不安全使用。由于第5行中對str的賦值不成功,str的值仍為null,因此 第14行語句中使用str時程序會拋出類型為NullPointerExc印tion的異常,導(dǎo)致非預(yù)期 的程序退出。表1實(shí)施例1的示例程序片段表
權(quán)利要求
一種軟件程序中變量的不安全使用的檢測方法,包括如下步驟1)建立軟件程序的控制流圖;2)根據(jù)控制流圖,對程序進(jìn)行層次化的數(shù)據(jù)流分析,獲得程序中每一個變量的操作序列;3)檢測每個操作序列中是否出現(xiàn)變量的不安全使用。
2.根據(jù)權(quán)利要求1所述的軟件程序中變量的不安全使用的檢測方法,其特征在于所述 軟件程序中包括正常程序語句、警戒區(qū)域和異常處理模塊或/和finally模塊。
3.根據(jù)權(quán)利要求1所述的軟件程序中變量的不安全使用的檢測方法,其特征在于所述 變量的不安全使用是指操作序列中依次出現(xiàn)eDef和Use,且eDef和Use之間不存在其它 eDef和sDef時,Use為變量的不安全使用。
4.根據(jù)權(quán)利要求2所述的軟件程序中變量的不安全使用的檢測方法,其特征在于所述 建立控制流圖的方法如下A、建立正常執(zhí)行路徑,將每條正常程序語句設(shè)定為一個節(jié)點(diǎn),按語句執(zhí)行順序,兩相鄰 語句之間設(shè)置有向邊;B、建立警戒區(qū)域的內(nèi)部執(zhí)行路徑,將警戒區(qū)內(nèi)的每條語句設(shè)定為一個節(jié)點(diǎn),按照語句 執(zhí)行順序,兩相鄰語句之間設(shè)置有向邊;C、建立正常程序語句與后續(xù)警戒區(qū)域之間的有向邊;D、建立異常執(zhí)行路徑,在警戒區(qū)域拋出異常對象后,查找與異常對象相對應(yīng)的異常處 理模塊,若查找到,建立異常處理模塊內(nèi)部執(zhí)行路徑,并在異常對象節(jié)點(diǎn)與異常處理模塊的 第一個節(jié)點(diǎn)之間建立有向邊;若查找不到,設(shè)置異常退出節(jié)點(diǎn),建立異常對象節(jié)點(diǎn)指向異常 退出節(jié)點(diǎn)的有向邊;E、查找finally模塊,若查找到,建立finally模塊內(nèi)部執(zhí)行路徑;建立警戒區(qū)域最后 節(jié)點(diǎn)和異常處理模塊最后節(jié)點(diǎn)指向finally模塊之間的有向邊;建立finally模塊與后續(xù) 正常語句節(jié)點(diǎn)之間的有向邊;將finally模塊插入異常對象節(jié)點(diǎn)與異常退出節(jié)點(diǎn)之間,按 語句執(zhí)行順序建立有向邊。若查找不到,建立警戒區(qū)域最后節(jié)點(diǎn)指向后續(xù)正常程序語句的 有向邊,并建立異常處理模塊最后節(jié)點(diǎn)指向后續(xù)正常程序語句的有向邊。
5.根據(jù)權(quán)利要求4所述的軟件程序中變量的不安全使用的檢測方法,其特征在于所述 與異常對象相對應(yīng)的異常處理模塊是指該異常處理模塊參數(shù)的異常類型與異常對象的類 型相同,或是異常對象的父類型。
6.根據(jù)權(quán)利要求4所述的軟件程序中變量的不安全使用的檢測方法,其特征在于建立 異常處理模塊內(nèi)部執(zhí)行路徑的方法為將異常處理模塊內(nèi)的每條語句設(shè)定為一個節(jié)點(diǎn),按 照語句執(zhí)行順序,兩相鄰語句之間設(shè)置有向邊。
7.根據(jù)權(quán)利要求4所述的軟件程序中變量的不安全使用的檢測方法,其特征在于建立 finally模塊內(nèi)部執(zhí)行路徑的方法為將finally模塊內(nèi)的每條語句設(shè)定為一個節(jié)點(diǎn),按照 語句執(zhí)行順序,兩相鄰語句之間設(shè)置有向邊。
8.根據(jù)權(quán)利要求1所述的軟件程序變量的不安全使用的檢測方法,其特征在于所述第 2)步的執(zhí)行方法如下A、確定控制流圖中對變量進(jìn)行操作的節(jié)點(diǎn)的變量操作類型;B、遍歷控制流圖,為控制流圖中每一條執(zhí)行路徑上的每一個變量生成操作序列。
9.根據(jù)權(quán)利要求8所述的軟件程序中變量的不安全使用的檢測方法,其特征在于所述 變量的操作類型為sDef、eDef或Use。
10.根據(jù)權(quán)利要求2-9任一項(xiàng)所述的軟件程序中變量的不安全使用的檢測方法,其特 征在于警戒區(qū)域?yàn)閠ry語句塊,異常處理模塊為catch語句塊。
全文摘要
本發(fā)明公開了一種軟件程序變量的不安全使用的檢測方法,屬于程序分析技術(shù)領(lǐng)域,包括如下步驟1)建立軟件程序的控制流圖;2)根據(jù)控制流圖,對程序進(jìn)行層次化的數(shù)據(jù)流分析,獲得程序中每一個變量的操作序列;3)檢測每個操作序列中是否出現(xiàn)變量的不安全使用。本發(fā)明所提出的軟件程序變量的不安全使用的檢測方法,能快速檢測到變量的不安全使用,運(yùn)用在程序軟件的開發(fā)早期,能及早發(fā)現(xiàn)程序中,特別是程序的異常處理代碼中的缺陷,改善代碼質(zhì)量,提高軟件的可靠性,降低軟件開發(fā)成本。
文檔編號G06F11/36GK101937396SQ20101050054
公開日2011年1月5日 申請日期2010年9月30日 優(yōu)先權(quán)日2010年9月30日
發(fā)明者伍曉泉, 高楚舒, 魏峻 申請人:中國科學(xué)院軟件研究所