專利名稱:一種改進(jìn)的基于符號(hào)執(zhí)行的軟件靜態(tài)測(cè)試方法及工具的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種改進(jìn)的基于符號(hào)執(zhí)行的軟件靜態(tài)測(cè)試方法及工具,屬于軟件的靜態(tài)測(cè)試技術(shù)領(lǐng)域。
背景技術(shù):
軟件測(cè)試技術(shù)通常分為靜態(tài)測(cè)試和動(dòng)態(tài)測(cè)試。動(dòng)態(tài)測(cè)試就是執(zhí)行程序,再觀察其行為是否滿足要求。既可由用戶直接觀察,也可以使用一定的輔助工具。靜態(tài)測(cè)試是不執(zhí)行程序代碼而尋找程序代碼中可能存在的缺陷或評(píng)估程序代碼的過程,程序靜態(tài)測(cè)試的目標(biāo)不是證明程序完全正確,而是作為動(dòng)態(tài)測(cè)試的補(bǔ)充,在程序運(yùn)行前盡可能多的發(fā)現(xiàn)其中隱含的錯(cuò)誤,提高程序的可靠性和健壯性,靜態(tài)測(cè)試在更高的抽象層次上對(duì)程序的某些屬性進(jìn)行考察,而不是對(duì)程序的某一個(gè)特定輸入的考察?,F(xiàn)在國內(nèi)對(duì)于靜態(tài)測(cè)試中的符號(hào)執(zhí)行方法方面的研究并不是很充分,國內(nèi)比較著名的是北京航空航天大學(xué)軟件研究所開發(fā)的Mfeftx) C/C++, SafePro C/C++提供多選窗口單驅(qū)動(dòng)的用戶工作環(huán)境,支持若干種測(cè)試信息的快速關(guān)聯(lián)分析,提供了圖文并茂的軟件測(cè)試結(jié)果報(bào)告,同時(shí)支持靜態(tài)和動(dòng)態(tài)測(cè)試。在這些已有的軟件靜態(tài)測(cè)試?yán)碚摵蜏y(cè)試工具中,一般仍然或多或少存在以下不足(1)對(duì)符號(hào)執(zhí)行功能模塊沒有得到充分重視和實(shí)現(xiàn);(2)對(duì)隱含的代碼錯(cuò)誤測(cè)試效果不好,如果再次測(cè)試將花費(fèi)大量的人力物力。
發(fā)明內(nèi)容
本發(fā)明目的是針對(duì)現(xiàn)有技術(shù)存在的缺陷提供一種改進(jìn)的基于符號(hào)執(zhí)行的軟件靜態(tài)測(cè)試方法及工具。本發(fā)明公布了一種改進(jìn)的基于符號(hào)執(zhí)行的軟件靜態(tài)測(cè)試方法,已經(jīng)開發(fā)包含該方法的面向宿主的軟件自動(dòng)化測(cè)試工具。其特征在于包括如下步驟1、第一階段分析。其中包括1. 1)將被測(cè)代碼輸入測(cè)試工具中;1. 2)根據(jù)C語言文法自定義一個(gè)關(guān)鍵詞列表,并對(duì)照關(guān)鍵詞列表對(duì)被測(cè)試代碼進(jìn)行詞法分析;1. 3)根據(jù)C語言文法自定義函數(shù)結(jié)構(gòu)模塊、構(gòu)造抽象語法樹的生成算法,并對(duì)照詞法分析的結(jié)果,利用“自下而上”的方法(即從從語法樹的末端開始,步步向上“歸約”), 對(duì)被測(cè)代碼進(jìn)行語法分析,最終得到程序靜態(tài)分析樹(PAT)作為一個(gè)中間表示形式,并且利用文檔進(jìn)行存儲(chǔ);2、第二階段分析。其中包括2. 1)根據(jù)第一階段分析步驟(1. 2)中的詞法分析結(jié)果,以特定結(jié)構(gòu)體的形式(包含變量名稱及變量的符號(hào)值)建立變量列表、以鏈表的形式存儲(chǔ)當(dāng)前路徑條件(便于回溯);2. 2)根據(jù)第一階段分析步驟(1. 3)中的語法分析結(jié)果,對(duì)程序靜態(tài)分析樹進(jìn)行中序遍歷,同時(shí)對(duì)變量列表中變量的符號(hào)值進(jìn)行替換;將步驟(2. 1)中存儲(chǔ)的路徑條件進(jìn)行約束求解得到可執(zhí)行路徑,并且依照算法得到每個(gè)變量最終的符號(hào)執(zhí)行結(jié)果,最終以文本的格式保存。本發(fā)明出了可以進(jìn)行傳統(tǒng)符號(hào)執(zhí)行得到相應(yīng)的結(jié)果之外,還可以根據(jù)C語言的文法,對(duì)于程序中潛在的錯(cuò)誤進(jìn)行報(bào)錯(cuò),例如whileO語句中若循環(huán)條件為空,則會(huì)自動(dòng)報(bào)錯(cuò),因此通用性比較強(qiáng)的。
圖1:本發(fā)明工作流程圖;圖2 本發(fā)明語法分析過程流程圖;圖3 本發(fā)明符號(hào)執(zhí)行過程流程具體實(shí)施例方式下面結(jié)合附圖1、圖2、圖3對(duì)本發(fā)明的工作流程進(jìn)行詳細(xì)說明?;诜?hào)執(zhí)行的軟件靜態(tài)測(cè)試方法,有如下軟件測(cè)試步驟1、第一階段分析,具體步驟如圖2所示,其中包括1. 1)將被測(cè)代碼輸入測(cè)試工具中;1. 2)根據(jù)C語言文法自定義一個(gè)關(guān)鍵詞列表,并對(duì)照關(guān)鍵詞列表對(duì)被測(cè)試代碼進(jìn)行詞法分析;1. 3)根據(jù)C語言文法自定義函數(shù)結(jié)構(gòu)模塊、構(gòu)造抽象語法樹的生成算法,并對(duì)照詞法分析的結(jié)果,利用“自下而上”的方法(即從從語法樹的末端開始,步步向上“歸約”), 對(duì)被測(cè)代碼進(jìn)行語法分析,最終得到程序靜態(tài)分析樹(PAT)作為一個(gè)中間表示形式,并且最終用樹形控件進(jìn)行顯示;其中,步驟(1.2)進(jìn)一步包括(1.2.1)建立一個(gè)關(guān)鍵詞列表,該關(guān)鍵詞列表包含有C語言文法中的大部分關(guān)鍵詞;(1.2. 2)將被測(cè)代碼保存于臨時(shí)文件中,以讀文件的方式,將被測(cè)代碼讀入詞法分析模塊;(1. 2. 3)根據(jù)所讀出字符的不同類型,進(jìn)入相應(yīng)的掃描狀態(tài)(例如若讀取字符為a-z或A-Z中的一個(gè),則進(jìn)入INID掃描狀態(tài),繼續(xù)讀取下一個(gè)字符,以此類推直至遇到終結(jié)符為止);(1.2. 4)若詞法分析的返回值是關(guān)鍵詞列表中的成員,則調(diào)用替換函數(shù)返回相應(yīng)的替換值;詞法分析直至文件中內(nèi)容被全部讀完方才結(jié)束;其中,步驟(1.3)進(jìn)一步包括(1. 3.1)根據(jù)C語言的文法,定義相應(yīng)的函數(shù)模塊(順序模塊、循環(huán)模塊、分支模塊等),比如在程序中預(yù)先定義if模塊iretatement、 while 模塊 WhileStatement、Switch. . . case 模塊 SwitchStatement 等等;(L 3. 2)根據(jù)詞法分析的返回值,判斷屬于已定義的函數(shù)模塊中的那一項(xiàng),并進(jìn)入相應(yīng)的靜態(tài)語法樹構(gòu)造函數(shù)(以下步驟都是以if模塊iretatement為例);(1. 3. 3)讀取if語句的條件,并且判斷是否有合取范式(CNF)、析取范式(DNF),按照設(shè)計(jì)沿著函數(shù)嵌套調(diào)用,此過程依次為 Boolean () - > T2 () - > F2 (),在函數(shù)F2中我們可以得到具體的條件約束符(大于、小于、等于等等),并且創(chuàng)建相應(yīng)的抽象語法樹Ftree然后將F2 ()的抽象語法樹Ftree作為返回值返回給T2()函數(shù),并且判斷條件中是否存在合取范式(CNF)。若存在合取關(guān)系,則首先創(chuàng)建 “and”類型的抽象語法樹Ttree (這里將之前返回的Ftree作為其左節(jié)點(diǎn)),將同時(shí)再次調(diào)用 F2 0返回下一棵抽象語法樹;若不存在合取關(guān)系,則直接將抽象語法樹Ftree作為T2 0函數(shù)的返回值,返回給BooleanO函數(shù),并且判斷若條件中是否存在析取范式(DNF),若不存在析取關(guān)系,則直接返回Ftree作為最終的描述if模塊中條件部分的語法樹;若存在析取關(guān)系,則首先創(chuàng)建“or”類型的抽象語法樹Booltree,將T2 0函數(shù)返回的語法樹作為其左節(jié)點(diǎn),并且再次調(diào)用T20- > F2 0,返回下一棵抽象語法樹作為其右節(jié)點(diǎn),依次類推,最終可以規(guī)約出一顆總的抽象語法樹B00Itree來完成將if模塊中條件部分進(jìn)行正確描述;采用相類似的函數(shù)嵌套調(diào)用的語句塊,我們可以順利地讀取滿足if條件后的代碼段(即所謂的 then子抽象語法樹),并且建立相應(yīng)的抽象語法子樹,對(duì)其進(jìn)行正確描述;同理可以得到不滿足if條件的代碼塊(即else子抽象語法樹),也可以為空;(1.3. 4)建立If^tatement模塊抽象語法樹,并且將通過(1. 3. 2)建立的抽象語法子樹作為其左節(jié)點(diǎn),將通過(1. 3. 3)建立的抽象語法子樹作為其右節(jié)點(diǎn);(1. 3. 5)將被測(cè)代碼中所有的抽象語法子樹(可能包含順序模塊、循環(huán)模塊、分支模塊等)通過C語言語法進(jìn)行整合,最終利用“自下而上”的語法分析方法(即從從語法樹的末端開始,步步向上“歸約”)生成一顆總的抽象語法樹(PAT);2、第二階段分析。具體步驟如圖3所示,其中包括2. 1)根據(jù)第一階段分析步驟(1. 2)中的詞法分析結(jié)果,建立變量列表(包含變量名稱及變量的符號(hào)值)、以鏈表的形式存儲(chǔ)當(dāng)前路徑條件(便于回溯);2. 2)根據(jù)第一階段分析步驟(1. 3)中的語法分析結(jié)果,對(duì)程序靜態(tài)分析樹進(jìn)行遍歷,同時(shí)對(duì)變量列表中變量的符號(hào)值進(jìn)行替換;依照程序的可執(zhí)行路徑得到每個(gè)變量最終的符號(hào)執(zhí)行結(jié)果,最終可以與預(yù)期的結(jié)果進(jìn)行比較。其中步驟(2. 1)進(jìn)一步包括(2. 1. 1)通過第一階段分析步驟(1. 2)中的詞法分析的返回值建立變量列表Syn^taCk(用棧的方式進(jìn)行存儲(chǔ)),我們知道C語言中變量的類型一般包括char (字符型),double (雙精度),float (單精度),int (整形),long (長(zhǎng)整形)等,這里我們通過詞法分析返回的單詞符號(hào)(根據(jù)C語言中定義變量時(shí),先定義變量的類型這一語法來查找到所有的變量)建立變量列表Syn^tack,變量列表包括變量名和變量的符號(hào)值(初始化變量的符號(hào)值時(shí),默認(rèn)為與變量名相同);(2. 1.2)通過第一階段分析步驟(1.2)中的詞法分析的結(jié)果存儲(chǔ)當(dāng)前的路徑條件(使用了一個(gè)用鏈表表示的棧cur_pC 來存儲(chǔ),鏈表的節(jié)點(diǎn)是一個(gè)轉(zhuǎn)換條件,條件之間是合取關(guān)系);其中步驟(2. 進(jìn)一步包括(2. 2.1)通過第一階段分析步驟(1. 得到建立的抽象語法子樹,利用中根遍歷的方法對(duì)其進(jìn)行遍歷(每當(dāng)遍歷到一個(gè)變量結(jié)點(diǎn)時(shí),在 Syn^tack表中查找相應(yīng)的變量名,并將找到的變量相應(yīng)的符號(hào)值賦給語句中各個(gè)變量,對(duì)其所得到的符號(hào)表達(dá)式進(jìn)行運(yùn)算,得到了執(zhí)行賦值語句后的變量的符號(hào)值);(2. 2. 通過第二階段步驟(2. 1)得到當(dāng)前的路徑條件,并且求解工具lp_S0lVe對(duì)于路徑約束條件進(jìn)行求解,來判斷是否為可執(zhí)行路徑),之后將變量列表Syn^tack中屬于可執(zhí)行路徑的變量賦值記錄進(jìn)行處理(即將該節(jié)點(diǎn)進(jìn)行入棧處理),以此類推,依照程序的可執(zhí)行路徑得到每個(gè)變量最終的符號(hào)執(zhí)行結(jié)果,可以通過與預(yù)期結(jié)果的比較來驗(yàn)證本符號(hào)執(zhí)行工具的可靠性。3、優(yōu)勢(shì)與創(chuàng)新本發(fā)明對(duì)現(xiàn)有技術(shù)有以下的改進(jìn)和創(chuàng)新
(1)根據(jù)本發(fā)明的技術(shù),我們已經(jīng)開發(fā)了基于符號(hào)執(zhí)行的軟件靜態(tài)測(cè)試工具;(2)通用性強(qiáng),對(duì)于以C語言編寫的代碼有具有一定的適用性;(3)根據(jù)C語言的文法,對(duì)于程序中潛在的錯(cuò)誤進(jìn)行報(bào)錯(cuò),可以說具備了小型編譯器的一些特點(diǎn);(4)利用約束求解工具完成了對(duì)于可執(zhí)行路徑的自動(dòng)判別,從而可以最終得到程序按可執(zhí)行路徑運(yùn)行后的符號(hào)執(zhí)行結(jié)果。
權(quán)利要求
1. 一種改進(jìn)的基于符號(hào)執(zhí)行的軟件靜態(tài)測(cè)試方法及工具,已經(jīng)開發(fā)包含該方法的面向宿主的軟件自動(dòng)化測(cè)試工具,其特征在于包括如下步驟1、第一階段分析。其中包括1.1)將被測(cè)代碼輸入測(cè)試工具中;1. 2)根據(jù)C語言文法自定義一個(gè)關(guān)鍵詞列表,并對(duì)照關(guān)鍵詞列表對(duì)被測(cè)試代碼進(jìn)行詞法分析;1.3)根據(jù)C語言文法自定義函數(shù)結(jié)構(gòu)模塊、構(gòu)造抽象語法樹的生成算法,并對(duì)照詞法分析的結(jié)果,利用“自下而上”的方法(即從從語法樹的末端開始,步步向上“歸約”),對(duì)被測(cè)代碼進(jìn)行語法分析,最終得到程序靜態(tài)分析樹(PAT)作為一個(gè)中間表示形式,并且利用文檔進(jìn)行存儲(chǔ),且利用樹型控件進(jìn)行顯示;2、第二階段分析。其中包括2. 1)根據(jù)第一階段分析步驟(1. 2)中的詞法分析結(jié)果,以特定結(jié)構(gòu)體的形式(包含變量名稱及變量的符號(hào)值)建立變量列表、以鏈表的形式存儲(chǔ)當(dāng)前路徑條件(便于回溯);2.2)根據(jù)第一階段分析步驟(1.3)中的語法分析結(jié)果,對(duì)程序靜態(tài)分析樹進(jìn)行中序遍歷,同時(shí)對(duì)變量列表中變量的符號(hào)值進(jìn)行替換;將步驟(2. 1)中存儲(chǔ)的路徑條件進(jìn)行約束求解得到可執(zhí)行路徑,并且依照算法得到每個(gè)變量最終的符號(hào)執(zhí)行結(jié)果,最終以文本的格式保存。
2.根據(jù)權(quán)力要求1所述的改進(jìn)的基于符號(hào)執(zhí)行的軟件靜態(tài)測(cè)新技術(shù),其特征在于增加了判斷可執(zhí)行路徑的模塊(利用了約束求解工具lp_solVe對(duì)于路徑約束條件進(jìn)行求解,來判斷是否為可執(zhí)行路徑)。
全文摘要
本發(fā)明公布了一種改進(jìn)的基于符號(hào)執(zhí)行的軟件靜態(tài)測(cè)試方法及工具,有如下步驟1、第一階段分析。其中包括1.1)將被測(cè)代碼輸入測(cè)試工具中;1.2)根據(jù)C語言文法自定義一個(gè)關(guān)鍵詞列表進(jìn)行詞法分析;1.3)根據(jù)C語言文法自定義函數(shù)結(jié)構(gòu)模塊及算法對(duì)代碼進(jìn)行語法分析得到程序靜態(tài)分析樹;2、第二階段分析。其中包括2.1)根據(jù)步驟(1.2)中詞法分析結(jié)果,以結(jié)構(gòu)體的形式(包含變量名稱及變量的符號(hào)值)建立變量列表、以鏈表的形式存儲(chǔ)當(dāng)前路徑條件;2.2)根據(jù)步驟(1.3)中語法分析結(jié)果,對(duì)程序靜態(tài)分析樹進(jìn)行中序遍歷,將步驟(2.1)中存儲(chǔ)的路徑條件進(jìn)行約束求解得到可執(zhí)行路徑,得到變量最終的符號(hào)執(zhí)行結(jié)果。本發(fā)明能夠克服在其他靜態(tài)測(cè)試中不能確定程序中變量的值的問題。
文檔編號(hào)G06F11/36GK102262580SQ201010180129
公開日2011年11月30日 申請(qǐng)日期2010年5月24日 優(yōu)先權(quán)日2010年5月24日
發(fā)明者劉久富, 婁堅(jiān)波, 李金奎, 王偉, 蘇青琴, 陳魁 申請(qǐng)人:南京航空航天大學(xué)