本發(fā)明涉及符號(hào)執(zhí)行可視化技術(shù)領(lǐng)域,具體涉及用于漏洞發(fā)掘的動(dòng)態(tài)符號(hào)執(zhí)行可視化方法。
背景技術(shù):
如今軟件測(cè)試領(lǐng)域的發(fā)展越來越傾向于使用測(cè)試自動(dòng)生成技術(shù)來提升軟件測(cè)試效率,這項(xiàng)技術(shù)現(xiàn)已工業(yè)化應(yīng)用在大量的軟件開發(fā)項(xiàng)目上了。有一些方法采用從源碼中自動(dòng)生成測(cè)試用例的方式來維持測(cè)試自動(dòng)生成,其中一個(gè)就是符號(hào)執(zhí)行。符號(hào)執(zhí)行是一項(xiàng)執(zhí)行中收集約束并使用約束表達(dá)式來表示代碼執(zhí)行路徑的程序分析技術(shù),通過取反約束并求解可以計(jì)算出能達(dá)到對(duì)應(yīng)新路徑的測(cè)試用例,不斷地重復(fù)這個(gè)過程可以逐漸覆蓋不同的程序執(zhí)行路徑,達(dá)到挖掘漏洞的目的。
不過這項(xiàng)技術(shù)在實(shí)際應(yīng)用中常常遇到一些執(zhí)行局限或者說覆蓋瓶頸的問題,即執(zhí)行到一定程度之后無法繼續(xù)增加代碼覆蓋率。這些瓶頸可能是由被測(cè)程序執(zhí)行前的預(yù)先配置所引起,也有可能是測(cè)試環(huán)境的干預(yù)造成的,這種問題的原因是多樣的,分析過程比較復(fù)雜。在這種情況下,將符號(hào)執(zhí)行和測(cè)試生成過程可視化能極大地幫助快速分析問題并準(zhǔn)確定位問題原因。分析人員(也是存在的困難)需要清楚地了解還有哪些代碼塊沒有被遍歷,需要進(jìn)入哪個(gè)分支才能進(jìn)入這些未被遍歷的代碼塊,需要做哪些可能的修改才能產(chǎn)生對(duì)應(yīng)的測(cè)試用例導(dǎo)向這些未被遍歷的代碼塊。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)上述現(xiàn)有技術(shù),本發(fā)明目的在于提供用于漏洞發(fā)掘的動(dòng)態(tài)符號(hào)執(zhí)行可視化方法,解決現(xiàn)有技術(shù)在漏洞發(fā)掘過程中符號(hào)執(zhí)行不能夠動(dòng)態(tài)呈現(xiàn),難于克服代碼覆蓋瓶頸導(dǎo)致的遍歷效率低等技術(shù)問題。
為達(dá)到上述目的,本發(fā)明采用的技術(shù)方案如下:
用于漏洞發(fā)掘的動(dòng)態(tài)符號(hào)執(zhí)行可視化方法,包括如下步驟,
步驟1、啟動(dòng)漏洞挖掘工具和符號(hào)執(zhí)行可視化工具;
步驟2、將符號(hào)執(zhí)行可視化工具置于等待調(diào)用狀態(tài)并執(zhí)行漏洞挖掘工具至分支點(diǎn);
步驟3、由漏洞挖掘工具調(diào)用符號(hào)執(zhí)行可視化工具的符號(hào)執(zhí)行樹繪制模塊構(gòu)建出分支節(jié)點(diǎn),再由漏洞挖掘工具發(fā)送分支信息至分支節(jié)點(diǎn);
步驟4、利用符號(hào)執(zhí)行可視化工具的數(shù)據(jù)統(tǒng)計(jì)模塊更新當(dāng)前所有分支節(jié)點(diǎn)的總體統(tǒng)計(jì)數(shù)據(jù);
步驟5、符號(hào)執(zhí)行可視化工具繼續(xù)等待至得到新的分支信息時(shí),緊接著上一個(gè)分支點(diǎn)后,符號(hào)執(zhí)行樹繪制模塊在圖形化界面創(chuàng)建下一個(gè)分支節(jié)點(diǎn)并設(shè)置其位置,重復(fù)進(jìn)行此步驟直到此輪符號(hào)執(zhí)行結(jié)束。
上述方法中,所述的步驟3,其中發(fā)送分支信息至分支節(jié)點(diǎn),包括發(fā)送:分支語句在源碼中的位置信息、分支條件表達(dá)式信息和分支條件的真假取值信息。
上述方法中,所述的步驟5,包括如下步驟,
步驟5.1、在繪制分支節(jié)點(diǎn)時(shí),判斷當(dāng)前分支節(jié)點(diǎn)的調(diào)用狀態(tài)是否為第一次調(diào)用;
步驟5.2.1、如果調(diào)用狀態(tài)為第一次調(diào)用,則直接由符號(hào)執(zhí)行樹繪制模塊構(gòu)建出新的分支節(jié)點(diǎn),并將新的分支節(jié)點(diǎn)續(xù)接在根節(jié)點(diǎn)下方;
步驟5.2.2、如果調(diào)用狀態(tài)不是第一次調(diào)用,則由符號(hào)執(zhí)行樹繪制模塊構(gòu)建出新的分支節(jié)點(diǎn),并將新的分支節(jié)點(diǎn)續(xù)接到上一次分支節(jié)點(diǎn)真假取值成立的位置。
上述方法中,還包括
步驟6、判斷出此輪符號(hào)執(zhí)行完成,通過符號(hào)執(zhí)行樹繪制模塊構(gòu)建葉子節(jié)點(diǎn)標(biāo)記出當(dāng)前路徑的結(jié)束節(jié)點(diǎn)。
上述方法中,所述的步驟6,包括如下步驟,
步驟6.1.1、如果此輪符號(hào)執(zhí)行還未完成,則跳轉(zhuǎn)至步驟5;
步驟6.1.2、如果此輪符號(hào)執(zhí)行完成,則由符號(hào)執(zhí)行樹繪制模塊為最后構(gòu)建的分支節(jié)點(diǎn)對(duì)應(yīng)真假取值成立的位置續(xù)接一個(gè)葉子節(jié)點(diǎn),表示此輪符號(hào)執(zhí)行的結(jié)束;
步驟6.2、將葉子節(jié)點(diǎn)標(biāo)記為路徑結(jié)束節(jié)點(diǎn),然后再跳轉(zhuǎn)至步驟2進(jìn)行下一輪的符號(hào)執(zhí)行。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果:
本發(fā)明通過可視化地展現(xiàn)符號(hào)執(zhí)行和測(cè)試生成的過程,能讓分析人員直觀地了解執(zhí)行過程的停滯點(diǎn),并快速辨認(rèn)出需要著手的修改位置,經(jīng)過不斷地修改、調(diào)整和觀察可以突破之前遇到的覆蓋瓶頸,然后進(jìn)一步地繼續(xù)增加代碼覆蓋率;
本發(fā)明符號(hào)執(zhí)行可視化還有另外一個(gè)重要的應(yīng)用,它能在教育學(xué)術(shù)領(lǐng)域發(fā)揮它的直觀展示能力,提升教學(xué)體驗(yàn),成為學(xué)術(shù)領(lǐng)域解釋說明符號(hào)執(zhí)行的工具,歷來要介紹符號(hào)執(zhí)行都只能使用靜態(tài)圖片和文字描述來解釋說明,這種非直觀的方式需要使用大量的篇幅來完成介紹,并且學(xué)習(xí)者也需要足夠的時(shí)間和精力來理解這些知識(shí),如果使用可視化方法直觀地動(dòng)態(tài)展現(xiàn)符號(hào)執(zhí)行和測(cè)試生成過程,這將很大程度上幫助符號(hào)執(zhí)行的教學(xué)展現(xiàn),提高這項(xiàng)技術(shù)的可理解程度;
本發(fā)明實(shí)現(xiàn)符號(hào)執(zhí)行的可視化無論對(duì)于提高軟件測(cè)試效率還是提升符號(hào)執(zhí)行教育學(xué)術(shù)質(zhì)量都有著重大的意義。
附圖說明
圖1為本發(fā)明的符號(hào)執(zhí)行樹定義圖;
圖2為本發(fā)明的符號(hào)執(zhí)行樹繪制算法流程圖;
圖3為本發(fā)明的界面設(shè)計(jì)圖。
具體實(shí)施方式
本說明書中公開的所有特征,或公開的所有方法或過程中的步驟,除了互相排斥的特征和/或步驟以外,均可以以任何方式組合。
下面結(jié)合附圖對(duì)本發(fā)明做進(jìn)一步說明:
實(shí)施例1
大多數(shù)符號(hào)執(zhí)行工具都支持編寫第三方插件,并且開放了內(nèi)部的接口給插件使用。此次可視化的調(diào)用算法將在插件代碼里實(shí)現(xiàn)。插件內(nèi)的算法可以獲取到符號(hào)執(zhí)行工具當(dāng)前正在執(zhí)行的代碼類型,檢測(cè)其是否為分支語句,一旦檢測(cè)到即調(diào)用可視化工具進(jìn)行可視化操作。
符號(hào)執(zhí)行可視化的具體執(zhí)行流程如下:
啟動(dòng)漏洞挖掘工具和符號(hào)執(zhí)行可視化工具
符號(hào)執(zhí)行可視化工具等待調(diào)用
漏洞挖掘工具執(zhí)行到分支點(diǎn)
漏洞挖掘工具調(diào)用符號(hào)執(zhí)行可視化工具的符號(hào)執(zhí)行樹繪制模塊構(gòu)建分支節(jié)點(diǎn),并傳入分支信息(分支位置,分支條件,分支條件的真假取值)。
符號(hào)執(zhí)行可視化工具的數(shù)據(jù)統(tǒng)計(jì)模塊更新現(xiàn)在的總體統(tǒng)計(jì)數(shù)據(jù)
如果是第一次調(diào)用則直接構(gòu)建新的分支節(jié)點(diǎn),把它續(xù)接在根節(jié)點(diǎn)下方;如果不是第一次,符號(hào)執(zhí)行樹繪制模塊會(huì)將當(dāng)前新構(gòu)建的節(jié)點(diǎn)在上一次分支節(jié)點(diǎn)真假取值成立的位置上續(xù)接成為其子節(jié)點(diǎn)。
如果本輪符號(hào)執(zhí)行還未完成則跳轉(zhuǎn)至B;如果本輪符號(hào)執(zhí)行已經(jīng)完成則為最后構(gòu)建的分支節(jié)點(diǎn)對(duì)應(yīng)真假取值成立的位置再續(xù)接一個(gè)葉子節(jié)點(diǎn),并標(biāo)記它為路徑結(jié)束節(jié)點(diǎn),然后跳轉(zhuǎn)至B。
在可視化界面,使用符號(hào)執(zhí)行樹來表達(dá)整個(gè)符號(hào)執(zhí)行的路徑擴(kuò)展流程。符號(hào)執(zhí)行樹是一顆二叉樹,表示從程序起始點(diǎn)出發(fā),經(jīng)過可能的分支一直執(zhí)行到程序結(jié)束點(diǎn)的所有路徑的集合。本發(fā)明的可視化界面中符號(hào)執(zhí)行樹的圖形定義如下:
節(jié)點(diǎn)形狀:分支節(jié)點(diǎn)為矩形,其左下角和右下角連接它的左右分支。左分支表示其分支條件取真之后的路徑,右分支表示其分支條件取否之后的路徑。結(jié)束節(jié)點(diǎn)為圓形,表示本輪執(zhí)行的結(jié)束。
連接線:所有節(jié)點(diǎn)的連接線皆為箭頭,表示路徑分支路徑走向。
填充顏色:所有分支節(jié)點(diǎn)皆為黃色。結(jié)束節(jié)點(diǎn)的顏色取決于它這一輪執(zhí)行是否有收集到新的約束以及是否捕獲到了漏洞。在沒有捕獲漏洞的情況下,如果沒有收集到新的約束則標(biāo)記為灰色,如果收集到了則為綠色。一旦捕獲到了漏洞,結(jié)束節(jié)點(diǎn)標(biāo)記為紅色。
示例程序:
依照示例程序的符號(hào)執(zhí)行樹,如圖1。
圖形內(nèi)存儲(chǔ)的數(shù)據(jù)的數(shù)據(jù)字典如下:
1)分支節(jié)點(diǎn)基本信息
序列號(hào):按照構(gòu)建次序標(biāo)記的序列號(hào);
深度:分支語句所在的代碼深度;
分支條件:此分支點(diǎn)內(nèi)所包含的分支判斷條件。
取真分支子節(jié)點(diǎn)鏈接:當(dāng)分支條件取真之后下一次遇到的第一個(gè)分支節(jié)點(diǎn)(若這個(gè)分支沒有被執(zhí)行過則置為空,若執(zhí)行過但其后無分支點(diǎn)則鏈接結(jié)束節(jié)點(diǎn))。取否分支子節(jié)點(diǎn)鏈接:當(dāng)分支條件取否之后下一次遇到的第一個(gè)分支節(jié)點(diǎn)(若這個(gè)分支沒有被執(zhí)行過則置為空,若其后無分支點(diǎn)則鏈接結(jié)束節(jié)點(diǎn))。
2)結(jié)束節(jié)點(diǎn)基本信息
約束收集情況:此輪執(zhí)行是否收集到了新約束;
漏洞檢測(cè)情況:此輪執(zhí)行是否捕獲了漏洞;
3)分支路徑箭頭基本信息
深度:進(jìn)入此分支后其代碼深度值為多少;
約束:到此路徑時(shí)所收集到的所有約束條件。
當(dāng)前分支條件:要進(jìn)入此分支需要上一個(gè)分支點(diǎn)內(nèi)的判斷語句滿足什么條件。
實(shí)施例2
1)符號(hào)執(zhí)行樹繪制模塊:本模塊構(gòu)建并繪制符號(hào)執(zhí)行樹,一旦被調(diào)用即根據(jù)傳入的分支數(shù)據(jù)從符號(hào)執(zhí)行樹的根部開始繪制分支節(jié)點(diǎn)。當(dāng)符號(hào)執(zhí)行工具執(zhí)行到分支時(shí)就會(huì)調(diào)用此模塊,傳入分支位置信息(分支所在內(nèi)存地址值),分支條件,執(zhí)行時(shí)分支條件的真假取值,此輪所用的測(cè)試用例;同時(shí)還會(huì)有一些數(shù)據(jù)會(huì)在模塊內(nèi)自動(dòng)生成,例如分支節(jié)點(diǎn)的深度、發(fā)現(xiàn)分支點(diǎn)的時(shí)間信息等等。然后此模塊會(huì)將這些信息存儲(chǔ)在新構(gòu)建的分支節(jié)點(diǎn)內(nèi),與此同時(shí)實(shí)時(shí)地在用戶界面上繪制分支節(jié)點(diǎn),下一次再被調(diào)用的時(shí)候會(huì)根據(jù)本次分支的真假值再在本次構(gòu)建的分支節(jié)點(diǎn)對(duì)應(yīng)的取真或取假支路上續(xù)接下一個(gè)節(jié)點(diǎn),直到程序執(zhí)行完畢沒有新的分支為止。本輪執(zhí)行完后,會(huì)在路徑末尾續(xù)接一個(gè)結(jié)束節(jié)點(diǎn)用于指示本輪執(zhí)行的總體情況。每一輪完整的執(zhí)行都會(huì)完整地走出一條程序路徑,在符號(hào)執(zhí)行樹上反映為一條從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的通路。
2)總體數(shù)據(jù)統(tǒng)計(jì)模塊:每一次符號(hào)執(zhí)行樹繪制模塊被調(diào)用的時(shí)候,它也會(huì)調(diào)用本模塊更新數(shù)據(jù)。本模塊用于統(tǒng)計(jì)整個(gè)符號(hào)執(zhí)行最后的總體數(shù)據(jù),例如已遍歷分支點(diǎn)的總數(shù)量,分支點(diǎn)的最大深度,路徑分歧個(gè)數(shù),發(fā)現(xiàn)漏洞的路徑數(shù)據(jù)。在符號(hào)執(zhí)行完全結(jié)束的時(shí)候,這些信息將會(huì)被展現(xiàn)在用戶界面上幫助分析。
3)用戶界面模塊:本模塊維持用戶操作所需要的交互界面,展現(xiàn)符號(hào)執(zhí)行樹的構(gòu)建過程,顯示當(dāng)前總體統(tǒng)計(jì)數(shù)據(jù)以及本次所使用的測(cè)試用例,同時(shí)還會(huì)不斷打印顯示控制臺(tái)內(nèi)的執(zhí)行信息,指示新產(chǎn)生約束的情況。
以上所述,僅為本發(fā)明的具體實(shí)施方式,但本發(fā)明的保護(hù)范圍并不局限于此,任何屬于本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。