專利名稱:一種符號執(zhí)行方法、裝置及系統(tǒng)的制作方法
技術(shù)領域:
本發(fā)明涉及計算機軟件安全領域,尤其涉及一種符號執(zhí)行方法、裝置及系統(tǒng)。
背景技術(shù):
符號執(zhí)行是通過使用符號變量取代輸入中的具體值來模擬程序執(zhí)行的程序分析方法(即用靜態(tài)分析的形式完成動態(tài)分析的工作)。該方法既具有動態(tài)分析方法的可靠性(路徑敏感,無誤報),又具有靜態(tài)分析方法的完備性(可保證覆蓋率,理論上有可能做到無漏報),在軟件漏洞檢測中正得到越來越多的關(guān)注。
符號執(zhí)行也是一種形式化和自動化的軟件分析技術(shù),其核心思想是用符號表示程序的輸入數(shù)據(jù),并將程序的運算過程逐指令或逐語句地轉(zhuǎn)換為數(shù)學表達式,再在程序控制流圖的基礎上生成符號執(zhí)行樹,并為每一條路徑建立一系列的以輸入數(shù)據(jù)為變量的表達式。通常,可以使用一個三元組〈指令指針,路徑函數(shù),路徑條件〉來表示符號執(zhí)行過程。其中,指令指針用于標識當前被分析的指令,路徑函數(shù)表示程序路徑中不同點處變量的值是變量初始值的函數(shù),路徑條件是程序路徑在各分支點滿足的分支條件的合取。路徑條件是約束在符號執(zhí)行中的一種具體表現(xiàn)形式。約束通常是一組等式或不等式的合取,而約束求解的目的是得到等式或不等式組的可滿足解。根據(jù)獲取約束(路徑條件和分支條件)的不同方法,可將當前的符號執(zhí)行方法劃分為基于變異和基于生成兩類。其中,基于生成的符號執(zhí)行依次解釋程序中的每一條指令。具體地說,對于非分支指令,其通常需要更新路徑函數(shù)(通過函數(shù)的復合實現(xiàn));而對于分支指令,其可能需要創(chuàng)建新的符號進程(執(zhí)行一條新的路徑)以探測每個分支目標,并將原路徑條件與每個分支目標滿足的分支條件取合取作為每個新路徑的路徑條件。當有多個符號進程時,按照一定的路徑選擇策略(例如先創(chuàng)建的符號進程先分析)依次選擇每一個符號進程進行分析。當某個符號進程結(jié)束時,調(diào)用約束求解器求解路徑條件以獲取一個具體輸入向量,該向量可驅(qū)使程序執(zhí)行該路徑。當所有符號進程結(jié)束時,整個符號執(zhí)行過程結(jié)束。以示例I所示的程序片段為例,下面對現(xiàn)有技術(shù)中基于生成的符號執(zhí)行處理進行說明
01if(a < 100)%判斷a是否小于100;
02printf("a<100");%在&小于 100時,打??;
03else if(b < 100)%在3不小于100時,判斷b是否小于100;
04priritf("a>-100&&b<100"); %在&不小于丨00且b<IOO時,打??;
05else
06printf(0 && "a>=i00&&b>=100"); %否則,a不小干 100且b不小于 100: -j 叩
07end:示例 I第一步在行01,查詢(a〈100)在當前路徑條件(true)下的恒真與恒假性恒真則前進到行02,恒假則前進到行03,此處即非恒真又非恒假,因此創(chuàng)建一個新的符號進程(#1)以同時分析每條路徑,原符號進程(#0)前進到行02,并更新路徑條件為(a〈100),新符號進程(#1)前進到行03,并更新路徑條件為i(a〈100),所述原符號進程以及新符號進程是邏輯上的虛擬進程,并不是實際的一個進程。第二步按照先創(chuàng)建的符號進程先分析策略,分析#0符號進程,即解釋行02,然后轉(zhuǎn)向行07,求解路徑條件(a〈100)得測試用例(0,0);第三步按照先創(chuàng)建的符號進程先分析策略,分析#1符號進程,即解釋行03 ;第四步在行03,查詢(KlOO)在當前路徑條件(](a〈100))下的恒真與恒假性恒真則前進到行04,恒假則前進到 行05,此處即非恒真又非恒假,因此創(chuàng)建一個新的符號進程以同時分析每條路徑,原符號進程(#1)前進到行04,并更新路徑條件為i(a〈100)八(b〈 100),新符號進程(#2)前進到行05,并更新路徑條件為I(a〈 100) A^(b<100);第五步按照先創(chuàng)建的符號進程先分析策略,分析#1符號進程,即解釋行04,然后轉(zhuǎn)向行07,求解路徑條件q(a〈100) A(KlOO)得測試用例(100,0);第六步按照先創(chuàng)建的符號進程先分析策略,分析#2符號進程,即解釋行05,然后轉(zhuǎn)向行06-07,求解路徑條件q(a〈100) Ai(KlOO)得測試用例(100,100)。目前,基于符號執(zhí)行的程序分析方法在理論上已經(jīng)基本成熟,而阻止其實用化的最主要問題是路徑爆炸。理論上,符號執(zhí)行技術(shù)能夠遍歷程序中的每一條執(zhí)行路徑并生成測試用例。實際上,程序中的路徑數(shù)目隨著程序中分支的數(shù)目近似指數(shù)增長,在出現(xiàn)循環(huán)的情況下,路徑數(shù)目的增長更加迅速。由于需要探測的路徑是如此之多,這就會產(chǎn)生的路徑爆炸問題。在基于生成的符號執(zhí)行中,與路徑爆炸息息相關(guān)的另一個問題是資源耗盡,這是因為上述基于生成的符號執(zhí)行過程的所有符號進程(邏輯上的進程,也可稱為虛擬進程)均在單個符號執(zhí)行器進程中進行,各符號進程執(zhí)行過程通常需要在內(nèi)存中存儲與對應路經(jīng)相關(guān)的數(shù)據(jù)信息,隨著需要分析的路徑數(shù)量增多,需要的內(nèi)存空間也越來越大,最終不可避免出現(xiàn)資源耗盡。
發(fā)明內(nèi)容
本發(fā)明實施例提供了一種符號執(zhí)行方法、裝置及系統(tǒng),用以解決現(xiàn)有的符號執(zhí)行技術(shù)存在的路徑爆炸問題,以及使用單個符號執(zhí)行器進程而引起的資源耗盡問題。本發(fā)明實施例提供的具體技術(shù)方案如下一種符號執(zhí)行方法,應用于包含負載均衡器和至少兩個控制器的系統(tǒng)中,所述方法包括負載均衡器向選擇的一控制器發(fā)送第一指示指令;接收到第一指示指令的控制器,按照設定的執(zhí)行策略確定待測試程序中的第一條路徑,且在確定第一條路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子;將生成的路徑種子發(fā)送至負載均衡器,并收集該第一條路徑上的路徑條件,獲得滿足所述第一條路徑上的路徑條件的測試用例,向負載均衡器發(fā)送進入空閑狀態(tài)的通知,其中,所述路徑種子是由設定個數(shù)的元素組成的順序字節(jié)流,所述元素是表示程序路徑中依次遇到的每個分支指令的取向;負載均衡器接收路徑種子后,向至少一個空閑的控制器分別發(fā)送含有路徑種子的第二指示指令,且每個空閑的控制器對應的第二指示指令中的路徑種子不同;
收到第二指示指令的控制器,確定所述第二指示指令中的路徑種子所表示的第一段路徑,在該第一段路徑的基礎上按照設定的執(zhí)行策略確定能與第一段路徑結(jié)合構(gòu)成第N條路徑的第二段路徑,并在確定第二段路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,將生成的路徑種子發(fā)送至負載均衡器,收集該第N條路徑上的路徑條件,獲得滿足所述第N條路徑上的路徑條件的測試用例,向負載均衡器發(fā)送進入空閑狀態(tài)的通知,所述N為大于I的正整數(shù)。一種符號執(zhí)行系統(tǒng),所述符號執(zhí)行系統(tǒng)包括負載均衡器和至少兩個控制器;所述負載均衡器,用于向選擇的一控制器發(fā)送第一指示指令,接收來自控制器的路徑種子和進入空閑狀態(tài)通知,向至少一個空閑的控制器分別發(fā)送含有路徑種子的第二指示指令,且每個空閑的控制器對應的第二指示指令中的路徑種子不同;所述控制器,用于在接收到第一指示指令時,按照設定的執(zhí)行策略確定待測試程序中的第一條路徑,且在確定第一條路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,收集該第一條路徑上的路徑條件,獲得滿足所述第一條路徑上的路徑條件的測試用例,其中,所述路徑種子是由設定個數(shù)的元素組成的順序字節(jié)流,所述元素是表示程序路徑中依次遇到的每個分支指令的取向;在接收到第二指示指令時,確定所述第二指示指令中的路徑種子所表示的第一段路徑,在該第一段路徑的基礎上按照設定的執(zhí)行策略確定能與第一段路徑結(jié)合構(gòu)成第N條路徑的第二段路徑,并在確定第二段路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,收集該第N條路徑上的路徑條件,獲得滿足所述第N條路徑上的路徑條件的測試用例,所述N為大于I的正整數(shù)。一種符號執(zhí)行裝置,所述符號執(zhí)行裝置包括第一發(fā)送模塊、接收模塊和第二發(fā)送模塊;第一發(fā)送模塊,用于向選擇的一控制器發(fā)送第一指示指令,該第一指示指令用于指示控制器按照設定的執(zhí)行策略確定待測試程序中的第一條路徑,且在確定第一條路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,并收集該第一條路徑上的路徑條件,獲得滿足所述第一條路徑上的路徑條件的測試用例,其中,所述路徑種子是由設定個數(shù)的元素組成的順序字節(jié)流,所述元素是表示程序路徑中依次遇到的每個分支指令的取向;接收模塊,用于接收來自控制器的路徑種子和進入空閑狀態(tài)通知;第二發(fā)送模塊,用于向至少一個空閑的控制器分別發(fā)送含有路徑種子的第二指示指令,且,每個空閑的控制器對應的第二指示指令中的路徑種子不同,該第二指示指令用于指示控制器確定所述第二指示指令中的路徑種子所表示的第一段路徑,在該第一段路徑的基礎上按照設定的執(zhí)行策略確定能與第一段路徑結(jié)合構(gòu)成第N條路徑的第二段路徑,并在確定第二段路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,收集該第N條路徑上的路徑條件,獲得滿足所述第N條路徑上的路徑條件的測試用例,所述N為大于I的正整數(shù)。一種符號執(zhí)行裝置,所述符號執(zhí)行裝置包括接收模塊、第一執(zhí)行模塊、第二執(zhí)行模塊和發(fā)送模塊;接收模塊,用于接收負載均衡器發(fā)送的第一指示指令和含有路徑種子的第二指示指令;
第一執(zhí)行模塊,用于在接收模塊接收到第一指示指令時,按照設定的執(zhí)行策略確定待測試程序中的第一條路徑,且在確定第一條路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,并收集該第一條路徑上的路徑條件,獲得滿足所述第一條路徑上的路徑條件的測試用例,其中,所述路徑種子是由設定個數(shù)的元素組成的順序字節(jié)流,所述元素是表示程序路徑中依次遇到的每個分支指令的取向;第二執(zhí)行模塊,用于在接收模塊接收到第一指示指令時,確定所述第二指示指令中的路徑種子所表示的第一段路徑,在該第一段路徑的基礎上按照設定的執(zhí)行策略確定能與第一段路徑結(jié)合構(gòu)成第N條路徑的第二段路徑,并在確定第二段路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,收集該第N條路徑上的路徑條件,獲得滿足所述第N條路徑上的路徑條件的測試用例,所述N為大于I的正整數(shù);發(fā)送模塊,用于將第一執(zhí)行模塊和第二執(zhí)行模塊生成的路徑種子發(fā)送給負載均衡器,并在第一執(zhí)行模塊或第二執(zhí)行模塊獲得測試用例后向負載均衡器發(fā)送進入空閑狀態(tài)通知。在本發(fā)明實施例的方案中,利用控制器執(zhí)行待測試程序中的某條路徑的同時將待測試程序中與該路徑相關(guān)的路徑進行分解,生成路徑種子,并將生成的路徑種子發(fā)送至負載均衡器,由負載均衡器將路徑種子分發(fā)給多個空閑的控制器,該多個空閑的控制器根據(jù)分發(fā)的路徑種子執(zhí)行程序中的路徑并同時生成路徑種子,將生成的路徑種子發(fā)送至負載均衡器,直至路徑種子被執(zhí)行完畢。一方面由于采用了分布式并行方式對待測試程序進行符號執(zhí)行分析,使得每一控制器執(zhí)行的路徑的數(shù)量均在自己可負荷的范圍內(nèi),有效解決了基于生成的符號執(zhí)行中遇到的路徑爆炸問題;另一方面,負載均衡器僅需保存路徑種子,占用的內(nèi)存資源較少,且每個分布式控制器在執(zhí)行完本次的符號執(zhí)行任務后就釋放了占用的內(nèi)存資源,因此也有效地解決了資源耗盡問題。
圖1為本發(fā)明實施例一的符號執(zhí)行方法流程示意圖;圖2為本發(fā)明實施例一中的符號執(zhí)行樹;圖3為本發(fā)明實施例二中的待測試程序的符號執(zhí)行樹示意圖;圖4為本發(fā)明實施例三中的符號執(zhí)行系統(tǒng)結(jié)構(gòu)示意圖;圖5為本發(fā)明實施例四中的符號執(zhí)行方法流程示意圖;圖6為本發(fā)明實施例五中的符號執(zhí)行方法流程示意圖;圖7為本發(fā)明實施例六中的符號執(zhí)行裝置結(jié)構(gòu)示意圖;圖8為本發(fā)明實施例七中的符號執(zhí)行裝置結(jié)構(gòu)示意圖。
具體實施例方式下面結(jié)合說明書附圖,對本發(fā)明實施例提供的符號執(zhí)行方法、裝置及系統(tǒng)的具體實施方式
進行說明。實施例一如圖1所示,為本發(fā)明實施例一的符號執(zhí)行方法流程圖,所述方法應用于包含負載均衡器和至少兩個控制器的系統(tǒng)中,包括以下步驟
步驟101 :負載均衡器向選擇的一控制器發(fā)送第一指示指令。具體的,在起始階段,其中的一個已啟動控制器接收到負載均衡器的第一指示指令。需要說明的是,每個控制器啟動時主動建立與負載均衡器的通信信道,負載均衡器標記其狀態(tài)為空閑,且本步驟101中不需要所有的控制器一開始全部啟動。步驟102 :接收到第一指示指令的控制器按照設定的執(zhí)行策略確定待測試程序中的第一條路徑。具體的,接收到第一指示指令的控制器可以在接收到第一指示指令時,創(chuàng)建與自身一一對應的符號執(zhí)行器進程,利用符號執(zhí)行器進程按照設定的執(zhí)行策略確定待測試程序中的第一條路徑,并對該符號執(zhí)行器進程的運行狀態(tài)進行監(jiān)控,在該符號執(zhí)行器進程執(zhí)行完自身的任務且結(jié)束后,控制器向負載均衡器匯報工作完成情況,并被負載均衡器標記為 空閑狀態(tài)。這里控制器和符號執(zhí)行器進程的實現(xiàn)模式可以為父子進程模式,即控制器為父進程,符號執(zhí)行器進程為子進程。步驟103 :控制器在確定第一條路徑的過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子。具體的,控制器創(chuàng)建了符號執(zhí)行器進程,由符號執(zhí)行器在確定第一條路徑的過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子。在符號執(zhí)行過程中,有兩種類型的指令可能引起符號執(zhí)行器創(chuàng)建新的路徑,即二路分支和多路分支指令。二路分支指令最多僅能夠創(chuàng)建一條新路徑,而多路分支指令通??赡芤鸱枅?zhí)行器創(chuàng)建多于一條新路徑。較優(yōu)地,為了簡化本發(fā)明實施例一的符號執(zhí)行方法的實現(xiàn),并使得對符號執(zhí)行過程的分析和追蹤更加清晰,提高符號執(zhí)行執(zhí)行的速度,在步驟102中對存在多路分支指令的待測試程序進行符號執(zhí)行分析時,按照設定的執(zhí)行策略確定待測試程序中的第一條路徑之前,所述方法還包括符號執(zhí)行器進程將該多路分支指令轉(zhuǎn)換為多條二路分支指令。根據(jù)程序變換和分析領域技術(shù)可知,所有多路分支指令均可等價轉(zhuǎn)換為多條二路分支指令。下述示例2和示例3演示了多路分支指令和多條二路分支令的等價轉(zhuǎn)換。
switch (a) {%對a的取值判斷;
case cl:%在8等于cI時,執(zhí)行block I;
{block I}
case c2:%在8等于c2時,執(zhí)行block2;{block 2}
case c3:%在&等于 c3 時,執(zhí)行block 3;
{block 3}default:
{block final}} %在a均不等于c1、c2、c3 時,執(zhí)行block final;示例 2
if (a == cl) %判斷a是否等于c I
{block I} %在8等于cl時,執(zhí)行block Ielse if (a == c2) %在8不等于cl時,判斷a是否等于c2{block2} %在3等于c2時,執(zhí)行block2else if (a == c3) %在8不等于c2時,判斷a是否等于c3{block 3} %在&等于c3時,執(zhí)行block 3else
jblock final \ %3不等于c3 時,執(zhí)行block final示例3 其中示例2為多路分支指令,示例3為將示例2的多路分支指令等價轉(zhuǎn)換的一列鏈接的二路分支指令,也即轉(zhuǎn)化為了多條二路分支指令。一般的,分支指令有可能引起路徑分叉,也有可能不引起路徑分叉,本步驟103中,由于在不引起路徑分叉的分支指令處無需生成路徑種子,故僅在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子。所述路徑種子是由設定個數(shù)的元素組成的順序字節(jié)流;所述元素是表示程序路徑中依次遇到的每個分支指令的取向。若符號執(zhí)行器進程將多分路指令轉(zhuǎn)換為了二分路指令,則在本步驟103中,可以通過以下方法在該第一條路徑的每一條最終引起路徑分叉的分支指令處生成相應的路徑種子第一步確定該第一路徑中起始分支指令到該分支指令前的子路徑對應的路徑種子;第二步在該確定的子路徑對應的路徑種子后添加一個表示與第一條路徑在該分支指令處的取向相反的元素得到一個新的路徑種子,將該新的路徑種子作為生成的一個路徑種子。步驟104 :控制器將生成的路徑種子發(fā)送至負載均衡器,并收集該第一條路徑上的路徑條件,獲得滿足所述第一條路徑上的路徑條件的測試用例。具體的,控制器創(chuàng)建符號執(zhí)行器進程時,可由符號執(zhí)行器進程將生成的路徑種子發(fā)送至負載均衡器進程,并且該符號執(zhí)行器進程也可以創(chuàng)建約束求解器進程時,由符號執(zhí)行器進程收集該第一條路徑上的路徑條件,該符號執(zhí)行器進程調(diào)用約束求解器進程對收集的該第一條路徑上的路徑條件進行求解,獲得滿足所述第一條路徑上的路徑條件的測試用例。步驟105 :控制器向負載均衡器發(fā)送進入空閑狀態(tài)的通知。本步驟105中,控制器可以監(jiān)測其創(chuàng)建的符號執(zhí)行器進程的運行狀態(tài),在監(jiān)測到符號執(zhí)行器進程完成本次的符號執(zhí)行任務(也即獲得測試用例)且結(jié)束后,向負載均衡器發(fā)送其進入空閑狀態(tài)的通知(負載均衡器收到通知后標記該控制器狀態(tài)為空閑)。步驟106 :負載均衡器的路徑種子列表不空時,向至少一個空閑的控制器發(fā)送含有一個路徑種子的第二指示指令,并將該控制器的狀態(tài)改為忙碌。本步驟106中,每個空閑的控制器對應的第二指示指令中的路徑種子不同。負載均衡器分發(fā)路徑種子的次序可以根據(jù)設定的策略來進行,例如采用先進先出的策略,即先接收的路徑種子先被分發(fā)。具體實現(xiàn)時,所述負載均衡器可以采用多線程的模式來實現(xiàn),所述負載均衡器可以包括一個主線程、一個消費者線程、一個生產(chǎn)者線程和一個任務列表,所述主線程作為消費者線程和生產(chǎn)者線程的守護線程,對消費者線程和生產(chǎn)者線程進行管理,生產(chǎn)者線程接收來自控制器的路徑種子,并將接收到的路徑種子存放至任務列表,消費者線程從任務列表中取出路徑種子,并向至少一個空閑的控制器分別發(fā)送含有該路徑種子的第二指示指令。步驟107 :接收到第二指示指令的控制器確定所述第二指示指令中的路徑種子所表不的第一段路徑。本步驟107中,可由控制器創(chuàng)建的符號執(zhí)行器來確定所述第二指示指令中的路徑種子所表示的第一段路徑。由于構(gòu)成每一路徑種子中的各元素表示了程序路徑中依次遇到的每個分支指令的取向,因此,每一路徑種子均惟一表示一段路徑。步驟108 :控制器在該第一段路徑的基礎上按照設定的執(zhí)行策略確定能與第一段路徑結(jié)合構(gòu)成第N條路徑的第二段路徑。具體的,控制器可利用其創(chuàng)建的符號執(zhí)行器進程確定能與第一段路徑結(jié)合構(gòu)成第N條路徑的第二段路徑,具體過程為符號執(zhí)行器進程調(diào)用約束求解器進程確定在執(zhí)行完第一段路徑之后遇到的分支指令的取向,并結(jié)合設定的執(zhí)行策略,逐步來確定第二段路徑。步驟109 :控制器在確定第二段路徑的過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,將生成的路徑種子發(fā)送至負載均衡器。步驟110 :控制器收集該第N條路徑上的路徑條件,獲得滿足所述第N條路徑上的路徑條件的測試用例,向負載均衡器發(fā)送進入空閑狀態(tài)的通知。具體地,在將待測試程序中的多路分支指令均轉(zhuǎn)換為多條二路分支指令后,可以通過以下方法在確定第二段路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子第一步確定所述第N條路徑中起始分支指令到該第二段路徑中的每一條最終引起路徑分叉的分支指令前的路徑對應的路徑種子;第二步在確定的該路徑種子后添加一個表示與第N條路徑在該最終引起路徑分叉的分支指令的取向相反的元素,得到一個新的路徑種子,將該新的路徑種子作為生成的路徑種子。下面通過圖2所示的符號執(zhí)行樹對本步驟110進行說明。在圖2中,A-M表示具有指令的節(jié)點,其中A、B、C、D、E、J、M代表具有分支指令的節(jié)點,從父節(jié)點到左邊的子節(jié)點上的路徑上標1,表明該父節(jié)點包含的分支指令為真,執(zhí)行左邊的子節(jié)點;從父節(jié)點到右邊的子節(jié)點上的路徑上標0,表明該父節(jié)點包含的分支指令為假,執(zhí)行右邊的子節(jié)點。假設符號執(zhí)行器進程在步驟107中獲得的路徑種子為1-0,則執(zhí)行路徑A-B-E,同時對第二段路徑E-J-L中遇到的包含可能引起路徑分叉的分支指令的節(jié)點E和J生成路徑種子1-O-O和1-O-1-O,此時該路徑種子所表不的路徑即為A-B-E-K和A-B-E-J-M。上述路徑種子的生成過程與路徑的確定過程是同步進行的,也即在根據(jù)設定的策略一邊確定路徑,一邊生成路徑種子。仍以上述假設,假設符號執(zhí)行器進程在步驟107中獲得的路徑種子為1-0為例,保證符號執(zhí)行器進程執(zhí)行路徑A-B-E。隨后,符號執(zhí)行器進程調(diào)用約束求解器進程確定分支指令E最終會引起路徑分叉,利用設定的執(zhí)行策略,確定下一步執(zhí)行的路徑為E-J,并在最終引起路徑分叉的分支指令E處生成路徑種子1-0-0。再隨后,符號執(zhí)行器進程調(diào)用約束求解器進程確定分支指令J最終會引起路徑分叉,利用設定的執(zhí)行策略,確定下一步執(zhí)行的路徑為E-J-L,并在最終引起路徑分叉的分支指令J處生成路徑種子1-0-1-0。由于本步驟110中,控制器創(chuàng)建的符號執(zhí)行器在執(zhí)行完本次符號執(zhí)行任務后會自動消亡,因此該符號執(zhí)行器進程占用的資源會全部釋放。由于每一符號執(zhí)行器進程在執(zhí)行完自身的符號執(zhí)行任務時均消亡(也即退出),而在符號執(zhí)行器進程退出時,占用的資源會全部釋放,因此,使用多個符號執(zhí)行器進程有效解決了單個符號執(zhí)行器進程完成整個任務時資源耗盡的問題。步驟111 :負載均衡器判斷路徑種子列表是否為空,若是,則執(zhí)行步驟112 ;若否,則執(zhí)行步驟113 ;步驟112 :負載均衡器判斷是否還有控制器忙碌,若是,則執(zhí)行步驟114 ;若否,則結(jié)束。步驟113 :負載均衡器判斷是否還有控制器空閑,若是,則執(zhí)行步驟114 ;若否,則執(zhí)行步驟115 ;步驟114 :負載均衡器判斷是否路徑種子列表是否為空,若是,則執(zhí)行步驟115,若否,則執(zhí)行步驟116。步驟115 :負載均衡器等待設定時長跳轉(zhuǎn)至步驟111。步驟116 :負載均衡器向空閑的控制器分發(fā)包含路徑種子第二指示指令,并跳轉(zhuǎn)至步驟107。在本發(fā)明實施例的方案中,為了提高對待測試程序進行符號執(zhí)行分析的效率,較佳的,所述控制器和負載均衡器運行在不同的主機內(nèi),同時,本發(fā)明實施例的方案中,使用分離的控制器和符號執(zhí)行器進程,而非將它們集成在一起的目的是盡可能減少符號執(zhí)行器進程與其他進程的交互操作,提高本發(fā)明的方案的健壯性。本發(fā)明實施例一的方案中,一方面由于采用了分布式并行方式對待測試程序進行符號執(zhí)行分析(也即多個控制器同時對待測是程序進行符號執(zhí)行分析),使得每一控制器執(zhí)行的路徑的數(shù)量均在自己可負荷的范圍內(nèi),有效解決了基于生成的符號執(zhí)行中遇到的路徑爆炸問題;另一方面,負載均衡器僅需保存路徑種子,占用的內(nèi)存資源較少,且每個分布式控制器在執(zhí)行完本次的符號執(zhí)行任務后就釋放了占用的內(nèi)存資源,因此也有效地解決了資源耗盡問題。為了更具體地第說明本發(fā)明實施例一的方案,下面通過本發(fā)明實施例二的具體例子對本發(fā)明實施例一的方案進行說明。實施例二下述示例4和圖3所示,分別為 本發(fā)明實施例二中用于說明實施例一方案的待測試程序和該待測試程序的符號執(zhí)行樹的示意圖;下面結(jié)合示例4和圖3對本發(fā)明實施例一的方案的具體實現(xiàn)過程進行說明。
00char ch[8] = {0}; %構(gòu)建包含8個char型元素的數(shù)組ch;
01if(a < 100) { %判斷a是否小于100;
02if(b < 100) %在a小于100時,判斷b是否小于100;
03printf("a<100&&b<100");%在 a 小于 100 且b 小于 100 時,輸出;
04else
05strcpy(ch., "a< 100&&b>= 100"); %在 a 小于 100 且 b 不小于!00 時,拷貝;
06} else {
07if(b < 100) %在a不小于100時,判斷b是否小于100;
08primfifa〉= 100&&b<100”) %在 b 小于 100 時,輸出;
09else
10strcpy(ch. "ablOOUA在 b 不小于 100 時,輯貝;
115
12end:示例4這里以一個負載均衡器和兩個控制器(控制器I和控制器2)為例進行說明。第一步負載均衡器向選擇的控制器I發(fā)送第一指示指令;第二步控制器I個創(chuàng)建符號執(zhí)行器進程1,該符號執(zhí)行器進程I按照設置的先分析符號執(zhí)行樹中左邊的節(jié)點的執(zhí)行策略,確定待測試程序的第一條路徑“00-01-02-03-12”。第三步符號執(zhí)行器進程I在第一條路徑“00-01-02-03-12”的分支指令01和02處分別生成路徑種子“0”和“ 1-0”,第四步符號執(zhí)行器進程將生成的路徑種子發(fā)送至給負載均衡器,收集該第一條路徑上的路徑條件得到“a〈100 ;b〈100”,并調(diào)用約束求解器進程獲得滿足所述第一條路徑上的路徑條件的測試用a=0,b=0。第五步控制器I向負載均衡器發(fā)送進入空閑狀態(tài)的通知。
第六步負載均衡器接收路徑種子“0”和“1-0”,并將包含路徑種子“0”的第二指示指令發(fā)送給控制器2 ;第七步控制器2創(chuàng)建一個符號執(zhí)行器進程2,并將路徑種子“0”交給符號執(zhí)行器進程2。在上述第七步中,也可以稱符號執(zhí)行器進程2是以帶路徑種子的方式創(chuàng)建的符號執(zhí)行器進程,此時,稱上述第二步中控制器I創(chuàng)建符號執(zhí)行器進程I的方式為不帶路徑種子的方式創(chuàng)建。第八步符號執(zhí)行器進程2在遇到分支指令01時,根據(jù)路徑種子“0”的指示,直接轉(zhuǎn)向07 (此時,路徑種子已經(jīng)用完,下面的分支指令需要自己調(diào)用約束求解器判定走向,即轉(zhuǎn)向正常的符號執(zhí)行過程),符號執(zhí)行器進程2按照設置的先分析符號執(zhí)行樹中左邊的節(jié)點的執(zhí)行策略,確定出待測試程序中的第二條路徑“00-01-07-08-12”,收集該第二條路徑上的路徑條件a>=100; b〈100,調(diào)用約束求解器進程生成滿足該第二條路徑上的路徑條件的測試用例 a= 100, b=0。第九步符號執(zhí)行器進程2在第二段路徑07-08-12中的分支指令07生成路徑種子“0-0”,并上傳給負載均衡器。第十步控制器I檢測到符號執(zhí)行器進程I完成符號執(zhí)行任務并結(jié)束后,向負載均衡器匯報工作完成情況并進入空閑狀態(tài);第十一步負載均衡器向控制器I分發(fā)路徑種子“1-0”,使得控制器I以帶種子方式創(chuàng)建符號執(zhí)行器進程3。該符號執(zhí)行器進程3確定待測試的程序的第三條路徑“00-01-02-05-12”,沒有生成任何路徑種子,但在05行成功地檢測到一處緩沖區(qū)溢出漏洞(ch的空間是8個字節(jié),最多可容納8個char字符,而字符串“a〈100&&b>=100”包含13個char字符),調(diào)用約束求解器進程獲得測試用例a=0,b=100。第十二步空閑的控制器2收到負載均衡器分發(fā)的路徑種子“0-0”,以帶種子方式創(chuàng)建符號執(zhí)行器進程4。符號執(zhí)行器進程4確定第四條路徑“00-01-07-10-12”,沒有生成任何路徑種子,調(diào)用約束求解器進程生成測試用例a=100,b=100。第十三步負載均衡器判斷出其內(nèi)無路徑種子剩余,且所有的控制器空閑,負載均衡器向每個控制器發(fā)送停止工作命令。第十四步收到停止工作命令的控制器退出。實施例三如圖4所示,為本發(fā)明是實施例三的符號執(zhí)行系統(tǒng)的結(jié)構(gòu)示意圖,包括負載均衡器11和至少兩個控制器12 ;負載均衡器11,用于向選擇的一控制器發(fā)送第一指示指令,接收來自控制器的路徑種子和進入空閑狀態(tài)通知,向至少一個空閑的控制器分別發(fā)送含有路徑種子的第二指示指令,且每個空閑的控制器對應的第二指示指令中的路徑種子不同;所述控制器12,用于在接收到第一指示指令時,按照設定的執(zhí)行策略確定待測試程序中的第一條路徑,且在確定第一條路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,收集該第一條路徑上的路徑條件,獲得滿足所述第一條路徑上的路徑條件的測試用例,其中,所述路徑種子是由設定個數(shù)的元素組成的順序字節(jié)流,所述元素是表示程序路徑中依次遇到的每個分支指令的取向;在接收到第二指示指令時,確定所述第二指示指令中的路徑種子所表示的第一段路徑,在該第一段路徑的基礎上按照設定的執(zhí)行策略確定能與第一段路徑結(jié)合構(gòu)成第N條路徑的第二段路徑,并在確定第二段路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,收集該第N條路徑上的路徑條件,獲得滿足所述第N條路徑上的路徑條件的測試用例,所述N為大于I的正整數(shù)。較佳的,所述控制器12在接收到第一指示指令和含有路徑種子的第二指示指令時,創(chuàng)建符號執(zhí)行器進程,該創(chuàng)建的符號執(zhí)行器進程來執(zhí)行第一指示指令和第二指示指令。較佳地,所述控制器12,具體用于在待測試程序中存在多路分支指令時,在所述按照設定的執(zhí)行策略確定待測試程序中的第一條路徑之前,將多路分支指令轉(zhuǎn)換為多條二路分支指令。較佳地,所述控制器12具體用于在接收到第一指示指令時,確定該第一條路徑中起始分支指令到該第一條路徑中的每一條最終引起路徑分叉的分支指令前的路徑對應的路徑種子,在確定的該路徑種子后添加一個表示與第一條路徑在該最終引起路徑分叉的分支指令的取向相反的元素,得到一個新的路徑種子,將該新的路徑種子作為生成的路徑種子;在接收到第二指示指令時,確定所述第N條路徑中起始分支指令到該第二段路徑中的每一條最終引起路徑分叉的分支指令前的路徑對應的路徑種子,在確定的該路徑種子后添加一個表示與第N條路徑在該最終引起路徑分叉的分支指令的取向相反的元素,得到一個新的路徑種子,將該新的路徑種子作為生成的路徑種子。較佳地,所述負載均衡器11,包括一個主線程、一個消費者線程、一個生產(chǎn)者線程和一個任務列表,所述主線程作為消費者線程和生產(chǎn)者線程的守護線程,對消費者線程和生產(chǎn)者線程進行管理;所述消費者線程,用于向選擇的一控制器發(fā)送第一指示指令,從任務列表中取出路徑種子,并向至少一個空閑的控制器分別發(fā)送含有路徑種子的第二指示指令,且每個空閑的控制器對應的第二指示指令中的路徑種子不同;所述生產(chǎn)者線程,用于接收來自控制器的路徑種子和進入空閑狀態(tài)通知,并將接收到的路徑種子存放至任務列表。實施例四如圖5所示,為本發(fā)明實施例四中的符號執(zhí)行方法流程圖,包括以下步驟步驟201 :符號執(zhí)行裝置向選擇的一控制器發(fā)送第一指示指令。所述第一指示指令用于指示控制器按照設定的執(zhí)行策略確定待測試程序中的第一條路徑,且在確定第一條路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,并收集該第一條路徑上的路徑條件,獲得滿足所述第一條路徑上的路徑條件的測試用例,其中,所述路徑種子是由設定個數(shù)的元素組成的順序字節(jié)流,所述元素是表示程序路徑中依次遇到的每個分支指令的取向;步驟202 :符號執(zhí)行裝置接收來自控制器的路徑種子和進入空閑狀態(tài)通知。步驟203 :符號執(zhí)行裝置向至少一個空閑的控制器分別發(fā)送含有路徑種子的第二指示指令,直至路徑種子分發(fā)完畢。在本步驟203中,每個空閑的控制器對應的第二指示指令中的路徑種子不同,該第二指示指令用于指示控制器確定所述第二指示指令中的路徑種子所表示的第一段路徑,在該第一段路徑的基礎上按照設定的執(zhí)行策略確定能與第一段路徑結(jié)合構(gòu)成第N條路徑的第二段路徑,并在確定第二段路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,收集該第N條路徑上的路徑條件,獲得滿足所述第N條路徑上的路徑條件的測試用例,所述N為大于I的正整數(shù)。實施例五如圖6所示,為本發(fā)明實施例五中的符號執(zhí)行方法流程圖,包括以下步驟步驟301 :符號執(zhí)行裝置接收負載均衡器發(fā)送的第一指示指令;步驟302 :符號執(zhí)行裝置按照設定的執(zhí)行策略確定待測試程序中的第一條路徑,且在確定第一條路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,并收集該第一條路徑上的路徑條件,獲得滿足所述第一條路徑上的路徑條件的測試用例,其中,所述路徑種子是由設定個數(shù)的元素組成的順序字節(jié)流,所述元素是表示程序路徑中依次遇到的每個分支指令的取向;較佳的,在本步驟302之前,在待測試程序中存在多路分支指令時,在所述按照設定的執(zhí)行策略確定待測試程序中的第一條路徑之前,將多路分支指令轉(zhuǎn)換為多條二路分支指令。較佳的,在本步驟302中,符號執(zhí)行裝置具體通過以下方法在確定第一條路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子第一步確定該第一條路徑中起始分支指令到該第一條路徑中的每一條最終引起路徑分叉的分支指令前的路徑對應的路徑種子;第二步并在確定的該路徑種子后添加一個表示與第一條路徑在該最終引起路徑分叉的分支指令的取向相反的元素,得到一個新的路徑種子,將該新的路徑種子作為生成的路徑種子。步驟303 :符號執(zhí)行裝置將生成的路徑種子發(fā)送給負載均衡器。步驟304 :符號執(zhí)行裝置接收負載均衡器發(fā)送的含有路徑種子的第二指示指令;步驟305 :符號執(zhí)行裝置確定所述第二指示指令中的路徑種子所表示的第一段路徑,在該第一段路徑的基礎上按照設定的執(zhí)行策略確定能與第一段路徑結(jié)合構(gòu)成第N條路徑的第二段路徑,并在確定第二段路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,收集該第N條路徑上的路徑條件,獲得滿足所述第N條路徑上的路徑條件的測試用例,所述N為大于I的正整數(shù);較佳的,在本步驟305中,符號執(zhí)行裝置具體通過以下方法在確定第一條路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子第一步確定所述第N條路徑中起始分支指令到該第二段路徑中的每一條最終引起路徑分叉的分支指令前的路徑對應的路徑種子;第二步在確定的該路徑種子后添加一個表示與第N條路徑在該最終引起路徑分叉的分支指令的取向相反的元素,得到一個新的路徑種子,將該新的路徑種子作為生成的路徑種子。步驟306 :符號執(zhí)行裝置將生成的路徑種子發(fā)送給負載均衡器。在本發(fā)明實施例五中,只要符號執(zhí)行裝置接收到負載均衡器發(fā)送的含有路徑種子的第二指示指令,則均執(zhí)行步驟306。
實施例六基于與實施例四的同一構(gòu)思,為本發(fā)明實施例六中提供一種符號執(zhí)行裝置20,其結(jié)構(gòu)示意圖如圖7所示,包括所述符號執(zhí)行裝置包括第一發(fā)送模塊21、接收模塊22和第二發(fā)送模塊23 ;第一發(fā)送模塊21,用于向選擇的一控制器發(fā)送第一指示指令,該第一指示指令用于指示控制器按照設定的執(zhí)行策略確定待測試程序中的第一條路徑,且在確定第一條路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,并收集該第一條路徑上的路徑條件,獲得滿足所述第一條路徑上的路徑條件的測試用例,其中,所述路徑種子是由設定個數(shù)的元素組成的順序字節(jié)流,所述元素是表示程序路徑中依次遇到的每個分支指令的取向;接收模塊22,用于接收來自控制器的路徑種子和進入空閑狀態(tài)通知;第二發(fā)送模塊23,用于向至少一個空閑的控制器分別發(fā)送含有路徑種子的第二指示指令,且每個空閑的控制器對應的第二指示指令中的路徑種子不同,該第二指示指令用于指示控制器確定所述第二指示指令中的路徑種子所表示的第一段路徑,在該第一段路徑的基礎上按照設定的執(zhí)行策略確定能與第一段路徑結(jié)合構(gòu)成第N條路徑的第二段路徑,并在確定第二段路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,收集該第N條路徑上的路徑條件,獲得滿足所述第N條路徑上的路徑條件的測試用例,所述N為大于I的正整數(shù)。實施例七基于與實施例五的同一構(gòu)思,為本發(fā)明實施例七中提供一種符號執(zhí)行裝置,其結(jié)構(gòu)示意圖如圖8所示,包括接收模塊31、第一執(zhí)行模塊32、第二執(zhí)行模塊33和發(fā)送模塊34;接收模塊31,用于接收負載均衡器發(fā)送的第一指示指令和含有路徑種子的第二指示指令;第一執(zhí)行模塊32,用于在接收模塊接收到第一指示指令時,按照設定的執(zhí)行策略確定待測試程序中的第一條路徑,且在確定第一條路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,并收集該第一條路徑上的路徑條件,獲得滿足所述第一條路徑上的路徑條件的測試用例,其中,所述路徑種子是由設定個數(shù)的元素組成的順序字節(jié)流,所述元素是表示程序路徑中依次遇到的每個分支指令的取向;第二執(zhí)行模塊33,用于在接收模塊接收到第一指示指令時,確定所述第二指示指令中的路徑種子所表示的第一段路徑,在該第一段路徑的基礎上按照設定的執(zhí)行策略確定能與第一段路徑結(jié)合構(gòu)成第N條路徑的第二段路徑,并在確定第二段路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,收集該第N條路徑上的路徑條件,獲得滿足所述第N條路徑上的路徑條件的測試用例,所述N為大于I的正整數(shù);發(fā)送模塊34,用于將第一執(zhí)行模塊和第二執(zhí)行模塊生成的路徑種子發(fā)送給負載均衡器,并在第一執(zhí)行模塊或第二執(zhí)行模塊獲得測試用例后向負載均衡器發(fā)送進入空閑狀態(tài)通知。顯然,本領域的技術(shù)人員可以對本發(fā)明進行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。
權(quán)利要求
1.一種符號執(zhí)行方法,其特征在于,應用于包含負載均衡器和至少兩個控制器的系統(tǒng)中,所述方法包括 負載均衡器向選擇的一控制器發(fā)送第一指示指令; 接收到第一指示指令的控制器,按照設定的執(zhí)行策略確定待測試程序中的第一條路徑,且在確定第一條路徑的過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子;將生成的路徑種子發(fā)送至負載均衡器,并收集該第一條路徑上的路徑條件,獲得滿足所述第一條路徑上的路徑條件的測試用例,向負載均衡器發(fā)送進入空閑狀態(tài)的通知,其中,所述路徑種子是由設定個數(shù)的元素組成的順序字節(jié)流,所述元素是表示程序路徑中依次遇到的每個分支指令的取向; 負載均衡器接收路徑種子后,向至少一個空閑的控制器分別發(fā)送含有路徑種子的第二指示指令,且每個空閑的控制器對應的第二指示指令中的路徑種子不同; 收到第二指示指令的控制器,確定所述第二指示指令中的路徑種子所表示的第一段路徑,在該第一段路徑的基礎上按照設定的執(zhí)行策略確定能與第一段路徑結(jié)合構(gòu)成第N條路徑的第二段路徑,并在確定第二段路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,將生成的路徑種子發(fā)送至負載均衡器,收集該第N條路徑上的路徑條件,獲得滿足所述第N條路徑上的路徑條件的測試用例,向負載均衡器發(fā)送進入空閑狀態(tài)的通知,所述N為大于I的正整數(shù)。
2.如權(quán)利要求1所述的方法,其特征在于,在待測試程序中存在多路分支指令時,在所述按照設定的執(zhí)行策略確定待測試程序中的第一條路徑之前,所述方法還包括 將多路分支指令轉(zhuǎn)換為多條二路分支指令。
3.如權(quán)利要求2所述的方法,其特征在于,所述在確定第一條路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子具體包括 確定該第一條路徑中起始分支指令到該第一條路徑中的每一條最終引起路徑分叉的分支指令前的路徑對應的路徑種子; 在確定的該路徑種子后添加一個表示與第一條路徑在該最終引起路徑分叉的分支指令的取向相反的元素,得到一個新的路徑種子,將該新的路徑種子作為生成的路徑種子; 所述在確定第二段路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,具體包括 確定所述第N條路徑中起始分支指令到該第二段路徑中的每一條最終引起路徑分叉的分支指令前的路徑對應的路徑種子; 在確定的該路徑種子后添加一個表示與第N條路徑在該最終引起路徑分叉的分支指令的取向相反的元素,得到一個新的路徑種子,將該新的路徑種子作為生成的路徑種子。
4.如權(quán)利要求1所述的方法,其特征在于,所述負載均衡器包括一個主線程、一個消費者線程、一個生產(chǎn)者線程和一個任務列表,所述主線程作為消費者線程和生產(chǎn)者線程的守護線程,對消費者線程和生產(chǎn)者線程進行管理; 所述將生成的路徑種子發(fā)送至負載均衡器具體為 將生成的路徑種子發(fā)送至生產(chǎn)者線程,該路徑種子被生產(chǎn)者線程存放至任務列表; 所述負載均衡器接收路徑種子后,向至少一個空閑的控制器分別發(fā)送含有路徑種子的第二指示指令具體為消費者線程從任務列表中取出路徑種子,并向至少一個空閑的控制器分別發(fā)送含有該路徑種子的第二指示指令。
5.如權(quán)利要求1所述的方法,其特征在于,所述負載均衡器和至少兩個控制器運行在不同的主機內(nèi)。
6.—種符號執(zhí)行系統(tǒng),其特征在于,所述符號執(zhí)行系統(tǒng)包括負載均衡器和至少兩個控制器; 所述負載均衡器,用于向選擇的一控制器發(fā)送第一指示指令,接收來自控制器的路徑種子和進入空閑狀態(tài)通知,向至少一個空閑的控制器分別發(fā)送含有路徑種子的第二指示指令,且每個空閑的控制器對應的第二指示指令中的路徑種子不同; 所述控制器,用于在接收到第一指示指令時,按照設定的執(zhí)行策略確定待測試程序中的第一條路徑,且在確定第一條路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,收集該第一條路徑上的路徑條件,獲得滿足所述第一條路徑上的路徑條件的測試用例,其中,所述路徑種子是由設定個數(shù)的元素組成的順序字節(jié)流,所述元素是表示程序路徑中依次遇到的每個分支指令的取向;在接收到第二指示指令時,確定所述第二指示指令中的路徑種子所表示的第一段路徑,在該第一段路徑的基礎上按照設定的執(zhí)行策略確定能與第一段路徑結(jié)合構(gòu)成第N條路徑的第二段路徑,并在確定第二段路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,收集該第N條路徑上的路徑條件,獲得滿足所述第N條路徑上的路徑條件的測試用例,所述N為大于I的正整數(shù)。
7.如權(quán)利要求6所述的符號執(zhí)行系統(tǒng),其特征在于, 所述控制器,具體用于在待測試程序中存在多路分支指令時,在所述按照設定的執(zhí)行策略確定待測試程序中的第一條路徑之前,將多路分支指令轉(zhuǎn)換為多條二路分支指令。
8.如權(quán)利要求7所述的符號執(zhí)行系統(tǒng),其特征在于, 所述控制器,具體用于在接收到第一指示指令時,確定該第一條路徑中起始分支指令到該第一條路徑中的每一條最終引起路徑分叉的分支指令前的路徑對應的路徑種子,在確定的該路徑種子后添加一個表示與第一條路徑在該最終引起路徑分叉的分支指令的取向相反的元素,得到一個新的路徑種子,將該新的路徑種子作為生成的路徑種子;在接收到第二指示指令時,確定所述第N條路徑中起始分支指令到該第二段路徑中的每一條最終引起路徑分叉的分支指令前的路徑對應的路徑種子,在確定的該路徑種子后添加一個表示與第N條路徑在該最終引起路徑分叉的分支指令的取向相反的元素,得到一個新的路徑種子,將該新的路徑種子作為生成的路徑種子。
9.如權(quán)利要求6所述的符號執(zhí)行系統(tǒng),其特征在于, 所述負載均衡器包括一個主線程、一個消費者線程、一個生產(chǎn)者線程和一個任務列表,所述主線程作為消費者線程和生產(chǎn)者線程的守護線程,對消費者線程和生產(chǎn)者線程進行管理; 所述消費者線程,用于向選擇的一控制器發(fā)送第一指示指令,從任務列表中取出路徑種子,并向至少一個空閑的控制器分別發(fā)送含有路徑種子的第二指示指令,且,每個空閑的控制器對應的第二指示指令中的路徑種子不同; 所述生產(chǎn)者線程,用于接收來自控制器的路徑種子和進入空閑狀態(tài)通知,并將接收到的路徑種子存放至任務列表。
10.一種符號執(zhí)行裝置,其特征在于,所述符號執(zhí)行裝置包括第一發(fā)送模塊、接收模塊和第二發(fā)送模塊; 第一發(fā)送模塊,用于向選擇的一控制器發(fā)送第一指示指令,該第一指示指令用于指示控制器按照設定的執(zhí)行策略確定待測試程序中的第一條路徑,且在確定第一條路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,并收集該第一條路徑上的路徑條件,獲得滿足所述第一條路徑上的路徑條件的測試用例,其中,所述路徑種子是由設定個數(shù)的元素組成的順序字節(jié)流,所述元素是表示程序路徑中依次遇到的每個分支指令的取向; 接收模塊,用于接收來自控制器的路徑種子和進入空閑狀態(tài)通知; 第二發(fā)送模塊,用于向至少一個空閑的控制器分別發(fā)送含有路徑種子的第二指示指令,且每個空閑的控制器對應的第二指示指令中的路徑種子不同,該第二指示指令用于指示控制器確定所述第二指示指令中的路徑種子所表示的第一段路徑,在該第一段路徑的基礎上按照設定的執(zhí)行策略確定能與第一段路徑結(jié)合構(gòu)成第N條路徑的第二段路徑,并在確定第二段路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,收集該第N條路徑上的路徑條件,獲得滿足所述第N條路徑上的路徑條件的測試用例,所述N為大于I的正整數(shù)。
11.一種符號執(zhí)行裝置,其特征在于,所述符號執(zhí)行裝置包括接收模塊,用于接收負載均衡器發(fā)送的第一指示指令和含有路徑種子的第二指示指令; 第一執(zhí)行模塊,用于在接收模塊接收到第一指示指令時,按照設定的執(zhí)行策略確定待測試程序中的第一條路徑,且在確定第一條路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,并收集該第一條路徑上的路徑條件,獲得滿足所述第一條路徑上的路徑條件的測試用例,其中,所述路徑種子是由設定個數(shù)的元素組成的順序字節(jié)流,所述元素是表示程序路徑中依次遇到的每個分支指令的取向; 第二執(zhí)行模塊,用于在接收模塊接收到第一指示指令時,確定所述第二指示指令中的路徑種子所表示的第一段路徑,在該第一段路徑的基礎上按照設定的執(zhí)行策略確定能與第一段路徑結(jié)合構(gòu)成第N條路徑的第二段路徑,并在確定第二段路徑過程中在每一條最終引起路徑分叉的分支指令處生成相應的路徑種子,收集該第N條路徑上的路徑條件,獲得滿足所述第N條路徑上的路徑條件的測試用例,所述N為大于I的正整數(shù); 發(fā)送模塊,用于將第一執(zhí)行模塊和第二執(zhí)行模塊生成的路徑種子發(fā)送給負載均衡器,并在第一執(zhí)行模塊或第二執(zhí)行模塊獲得測試用例后向負載均衡器發(fā)送進入空閑狀態(tài)通知。
12.如權(quán)利要求11所述的符號執(zhí)行裝置,其特征在于, 所述第一執(zhí)行模塊,具體用于在待測試程序中存在多路分支指令時,在所述按照設定的執(zhí)行策略確定待測試程序中的第一條路徑之前,將多路分支指令轉(zhuǎn)換為多條二路分支指令。
13.如權(quán)利要求12所述的符號執(zhí)行裝置,其特征在于, 所述第一執(zhí)行模塊,具體用于確定該第一條路徑中起始分支指令到該第一條路徑中的每一條最終引起路徑分叉的分支指令前的路徑對應的路徑種子,并在確定的該路徑種子后添加一個表示與第一條路徑在該最終引起路徑分叉的分支指令的取向相反的元素,得到一個新的路徑種子,將該新的路徑種子作為生成的路徑種子;所述第二執(zhí)行模塊,具體用于確定所述第N條路徑中起始分支指令到該第二段路徑中的每一條最終引起路徑分叉的分支指令前的路徑對應的路徑種子,并在確定的該路徑種子后添加一個 表示與第N條路徑在該最終引起路徑分叉的分支指令的取向相反的元素,得到一個新的路徑種子,將該新的路徑種子作為生成的路徑種子。
全文摘要
本發(fā)明公開了一種符號執(zhí)行方法、裝置及系統(tǒng),主要內(nèi)容包括應用于包含負載均衡器和至少兩個控制器的系統(tǒng)中,控制器執(zhí)行待測試程序中的某條路徑的同時將待測試程序中與該路徑相關(guān)的路徑進行分解,生成路徑種子,并將生成的路徑種子發(fā)送至負載均衡器,由負載均衡器將路徑種子分發(fā)給多個空閑的控制器。通過本發(fā)明實施例的方案,一方面由于采用了分布式并行方式對待測試程序進行符號執(zhí)行分析,有效解決了基于生成的符號執(zhí)行中遇到的路徑爆炸問題;另一方面,負載均衡器僅需保存路徑種子,占用的內(nèi)存資源較少,且每個分布式控制器在執(zhí)行完本次的符號執(zhí)行任務后就釋放了占用的內(nèi)存資源,因此有效地解決了資源耗盡問題。
文檔編號G06F21/56GK103019862SQ20121054002
公開日2013年4月3日 申請日期2012年12月13日 優(yōu)先權(quán)日2012年12月13日
發(fā)明者忽朝儉, 曲富平, 左磊, 趙糧, 薛一波 申請人:北京神州綠盟信息安全科技股份有限公司, 北京神州綠盟科技有限公司