曾嘉彥
(四川大學計算機學院,成都 610225)
符號執行技術在測試用例生成中的應用
曾嘉彥
(四川大學計算機學院,成都 610225)
符號執行技術提出近四十年,隨著計算機科學與技術的發展,在軟件工程領域得到廣泛的應用,成為一種流行的自動測試技術。對符號執行技術在測試用例生成中的應用展開綜述,全方位地敘述符號執行技術的基本原理、面臨的問題和挑戰以及相應的改進策略、相關的典型案例,并介紹和比較現有的工具,對學術界和工業界提供相應的參考。
符號執行;Concolic測試;自動化測試;測試用例生成
符號執行技術(Symbolic Execution)[1]由JC.King在1976年提出,將軟件的測試問題轉化為了符號表達式求解的數學問題。
很多家長擔心孩子亂花錢,會“剝奪”孩子們掌控錢的機會。比如要買什么東西,統統向父母伸手要,孩子們得到了壓歲錢,家長們也會說:“壓歲錢由父母來幫你保管”,全數地將壓歲錢收回去。這樣做的弊端是,孩子們會因此養成要花錢就伸手,一有錢就趕快花光的習慣,而缺乏對消費的規劃意識。
符號執行的核心思想是:采用抽象化符號代替程序中具體的輸入,依次解析程序的語句和指令,在程序控制流圖的基礎上生成符號執行樹,并為每一條路徑建立一系列的以輸入符號為變量的路徑表達式,即路徑條件。對路徑表達式進行求解,得到符號變量的解的集合,即獲得了對應程序路徑的具體輸入值。
使用具體的數值簡化路徑中的符號約束的方法被稱為動態符號執行(Dynamic Symbolic Execution,DSE),也被稱為Concolic測試(Concolic Testing)。
也許與王羲之喜鵝有關,華堂村的白鵝養殖歷史悠久,遠近聞名.華堂村的白鵝養殖一直是一家一戶主要利用天然雜草、采用傳統的放牧方式養殖,在本地集市上出售,收益很低.隨著放牧地減少,現在幾乎沒有農戶飼養了.
《琵琶記》①是中國傳統戲劇的經典之作,被譽為“南戲之祖”,歷來受到各代研究者的關注。《琵琶記》產生于宋元之交,頗具時代的烙印,因而受到褒貶不一的評價。
CREST:CREST[14]是一個針對執行路徑過多的程序構建和實驗的啟發式動態符號執行測試工具,它能實現更快的測試速度。
2.1 路徑爆炸問題
路徑爆炸(Path Explosion)是動態符號執行的廣泛應用最主要的障礙。路徑爆炸是指程序的可執行路徑的數量隨著執行路徑的長度增長而指數式增加。
(1)路徑引導技術
對DSE搜索策略進行改善,可以有效地引導DSE實現高結構覆蓋率,緩解路徑爆炸。大部分現有的符號執行測試工具(EXE/CUTE/DART)基于深度優先搜索(DFS)和廣度優先搜索(BFS),DFS和BFS以固定的搜索順序遍歷目標程序,通常會卡在程序的特定區域,導致測試覆蓋率降低。
分代搜索(Generational search)[2]提出于2008年,從四個方面緩解路徑爆炸:能夠處理大型程序龐大的狀態空間;產生最大數量的測試用例同時避免冗余;最大化代碼覆蓋率;使用彈性的策略處理分歧。Fuzzgrind和SAGE工具就使用了分代搜索。
①不同年齡醫護工作者職業認同水平具有差異性。其中年齡>50歲的醫護工作者職業認同程度高于其他年齡醫護工作者,≤30歲的醫護工作者職業認同程度最低,隨著年齡增加醫護工作者職業認同程度提高。
(2)路徑修剪技術
SAGE:SAGE[15]是由微軟公司開發的商業測試軟件,Win7系統在開發過程中的大約三分之一的缺陷是由SAGE通過文件模糊測試發現的。
幾十年過去了,030與719早已成為孫寶國研究之路上的往事,因為在那之后,他又研制出了多種香料,毫不夸張地講,我們現在吃到的許多食品,其香味都來自于孫寶國的研究成果。這么香的味道,是如何實現的呢?其奧秘就來自于孫寶國的“味料同源”——中國特色肉味香精制造新理念。
回歸測試中,由于程序的修改,部分測試用例將會失效,需要生成新的測試用例以擴充測試集。2010年,Thummalapenta Suresh等人針對回歸測試用例的自動生成提出了DyGen[11],即通過挖掘程序執行時的動態蹤跡記錄生成測試用例。Zhihong Xu等人將Concolic測試方法和遺傳算法用于測試套件增強中,并取得一定成效。
符號執行技術固有的并行性質和多核計算機的發展,促使并行化方法成為提高符號執行效率的重要手段。Staats Matt等人提出一種靜態分區技術,它是基于初始實際執行路徑前置條件集合對符號執行樹進行劃分的并行符號執行方法。CLOUD9[6]是運行在云計算平臺上的并行符號執行自動測試系統,它在符號執行過程中動態劃分并調度符號執行樹,遇到新的分支就將它分配到空閑節點,從而維持負載均衡。由于符號執行樹形態的未知性,靜態劃分和動態劃分都易造成負載不均衡,降低并行效率。不過,動態劃分能調整結點負載,但節點間頻繁的負載切換會導致大量冗余通信開銷。
(1)GUI測試
符號執行技術遇到的另一個問題是,無法直接對一些通用類庫或本機代碼進行分析,如字符串。Web程序和數據庫應用程序中往往要頻繁地進行字符串操作。Wassermann Gary等人在Web測試中通過有限狀態機和約束解析算法對字符串建模解決字符串約束問題;Emmi等人則提出了一種新的約束求解器,它能夠同時求解線性運算約束和字符串約束。
2.3 指針操作問題
一個符號化的指針變量表示引用一個取決于符號表達式值的地址,即符號化的指針變量依賴于一些不被信任的變量值,符號執行因而難以直接處理程序中的指針變量。最簡單的解決方案就是將符號化的指針具體化,然而,將具體化容易因為實際執行路徑不匹配約束求解器指定的路徑從而產生分歧。對此,B.Elkarablieh和P.Godefroid提出了一種精確的解決方案[7],即通過建立內存模型表示程序執行時任意符號化指針解引用的內存區域,主動注入新的約束并綁定符號地址用于處理符號化指針操作。
2.4 浮點數計算問題
現有約束求解器不處理浮點數運算的舍入誤差問題,如Z3/STP/Yices/CVC3,因此符號執行技術遇到了處理浮點數運算的問題。開發支持浮點數運算的約束求解器易導致復雜的約束條件,加重路徑爆炸。Godefroid Patrice等人在2010年提出了一種方法緩解浮點數運算難題,即通過一個小的前期靜態分析和邊際執行開銷,從而避免了浮點約束收集和求解。Bagnara R等人提出一個新版本的FPSE工具,它通過使用精確的投影函數解決含浮點數計算的路徑約束。
2.2 字符串處理問題
為了檢測和反映患者的氧合動態情況,并且可以提前發現缺血性心臟病圍術期存在的初期低氧血癥狀,利用血氧飽和度檢測儀可以實現持續性的觀測,并為以后的護理和治療提供相關依據。血氧飽和度檢測主要指在患者的指端甲床固定探頭指套,以手指作為血紅蛋白響應容器,檢測組織床光傳導的強度,來統計有關血氧飽和度的量。血氧飽和度的計數可以實時反應患者的呼吸情況以及動脈血氧的動態狀況,為患有低氧血癥的患者初期提供相關數據。本次研究選擇本院在收容診治的50名患有缺血性心臟病在圍術期間血氧飽和度減少的患者作為本次研究的實驗對象,對醫學臨床上的相關護理干預措施進行分析,現報告如下。
Ganov Svetoslav R.等人將符號執行的概念引入GUI測試,提出了一個新的名為Barad的基于符號執行的GUI測試框架,解決了傳統GUI測試框架不能有效驗證GUI程序測試類的共同弱點。
(2)Web測試
為了減少搜索空間同時保持覆蓋率,啟發式搜索(Heuristic search strategy)和隨機策略(Random strategy)被引入用于分支的選擇,KLEE工具就采用了隨機策略。隨機策略的優點是:具有很大的自由度;能有效避免饑餓。因而,交錯隨機策略與其他的搜索策略探索符號執行樹能夠提高整體的效率和覆蓋率。通常,啟發式搜索能獲得比隨機策略更好的效果,現已被廣泛用于符號執行的改進中。Yu Dong等人提出了一個名為DYNASTY[3]的基于分支殘留的啟發式搜索策略生成方法,并支持重復路徑的迅速檢測。Li You等人通過探索長度為N的子路徑頻率分布,優先遍歷程序中很少被遍歷的部分。
2008年,Wassermann Gary等人將Concolic測試框架引入Web應用測試中,并針對PHP腳本語言的特性,提出了一個基于Concolic測試框架的自動化的測試生成算法并設法解決了三大挑戰:一是通過有限狀態機和約束解析算法對字符串建模以解決字符串約束問題;二是開發新的算法來檢測字符串值以防止SQL注入攻擊;三是通過在運行時收集數值的方法,在查詢執行的地方構建一個可返回的時間片并且記錄該時間片的約束。
(3)數據庫應用程序測試
2007年,Emmi Michael等人提出了一個基于Concolic執行的算法[8]用于數據庫程序的測試數據自動生成。該算法生成兩種輸入數據,一種是訪問數據庫的應用程序的輸入數據,一種是相應的數據庫記錄,并系統地探索程序中包括依賴返回數據的所有執行路徑。該算法不能基于現有數據庫狀態生成有效的輸入。Kai Pan等人在2011年提出了一種不同于Emmi等人的方法[9],能夠在不生成新的數據庫狀態的前提下實現應用程序的高代碼覆蓋率。他們對現有數據庫狀態構造輔助查詢,并執行這些查詢,從而生成有效的程序輸入值。
(4)嵌入式應用程序測試
Kim Yunho等人將動態符號執行技術用于嵌入式應用測試,并對此展開了一系列的研究。2011年,Kim Yunho等人為嵌入式C程序開發了一個可擴展的Concolic測試工具SCORE[10]。SCORE利用大量的分布式計算節點,實現線性加速,能夠顯著減少Concolic測試的時間開銷,并實現了可擴展性。2012年,Kim Yunho等人使用CREST工具測試三星的Linux平臺(SLP)的文件管理器,安防庫和busybox LS。通過案例研究發現,手工的測試驗證不夠可靠,Concolic測試方法可以有效提高工業嵌入式應用程序的質量。
(5)回歸測試中的用例生成
在學校的教學過程中,教師在教學前利用數字媒體技術引入一個話題來導出所需要教學的知識,能夠有效地激發學生的好奇心,提升其學習興趣,提升學生的情感,提高學生的專業核心能力,就能夠高效地進行教學安排。
(3)并行符號執行
在本節中介紹了若干有代表性的符號執行工具,并對其影響進行初步的評估。
如表1所列測點偏移量對應關系,解析程序即按此進行數據包解析,同時生成一項測點信息的配置表存儲在數據庫中,便于之后作為某臺盾構的特征信息查看。在生成測點信息配置表過程中,以各測點所屬盾構機子系統分組,如此在后續對盾構機子系統部件進行分析時提供便利,如圖3。
DART(Directed Automated Random Testing): DART[12]結合了動態符號執行、隨機測試、模型檢測等技術,許多擴展和工具都由它衍生而來。
CUTE和jCUTE:jCUTE[13]是CUTE的Java版本,CUTE是DART的擴展,能夠處理含指針操作的動態數據結構的多線程程序。
本節對符號執行技術在實踐中面臨的若干個問題和挑戰進行分類探討。
路徑修剪(Path pruning)技術專注于避免冗余路徑的探索。RWset分析技術[4]通過跟蹤程序內存位置讀取和寫入,判斷路徑是否能夠探索到新的程序行為,修剪那些與已經探索過的路徑產生同樣效果的執行狀態。eXpress工具[5]將動態符號執行引入回歸測試中并修剪那些在程序行為上沒有差異的程序版本的路徑,從而指導符號執行有效地生成回歸測試用例。
BIM技術文檔信息管理中,項目文檔準備、項目模型準備、檢索排序和數據關聯是其管理結果實現的四個基本階段。一般情況下下,當項目數據準備完成后,BIM系統會對數據進行必要的分析,并在確保文字信息頻率矩陣形成的基礎上,實現了錯誤信息的有效剔除,進而促進了文檔信息預處理的完成。模型準備和分類是基于IFC的標準進行的,其在保證項目文檔信息精度的同時,確保了關聯系統下的模型建立和施工指導。
為了促進水產養殖行業的健康發展,生產出更多綠色無污染的產品,在實際工作中,養殖戶要在自動化養殖的基礎上,融入環保理念,減少藥物的應用。此外,還可以研發和使用綠色環保型藥物,減少水產養殖中水體污染問題的發生,保證水體質量。目前,我國已經在綠色環保型藥物的研究上取得了一定的成績,這將會進一步推動水產養殖行業健康發展[2]。
PEX.:PEX[16]是基于動態符號執行的.NET自動測試工具。PEX采用近似的方法處理字符串和浮點運算,支持原始類型的測試輸入以及復雜數據類型。
EXE:EXE[17]是一個重點針對測試復雜的系統代碼開發的符號執行工具。它的模型內存達到位級精度,并通過優化達到足夠快的約束求解速度。
KLEE:KLEE[18]是重新設計的EXE,支持動態符號執行,具有位級精度的模型內存,采用了多種約束求解的優化和啟發式搜索,以獲取更高的覆蓋率。
Fuzzgrind:Fuzzgrind是一個基于符號執行的自動模糊測試工具,2009年由Sogeti/ESEC實驗室開發。
Splat:Splat是一個基于符號執行的定向隨機測試工具,它能夠快速地檢測緩沖區溢出。
根據收集的文獻資料,本文將上述10個符號執行工具的基本情況進行如下比較和分析,如表1所示。
本文根據系統文獻綜述方法,對符號執行技術在測試用例生成中的應用和研究相關文獻進行了分析和綜述。符號執行技術在國內外研究學者的共同努力下,逐漸成為一種成熟的自動用例生成技術。
他的眼睛望著對面閃耀的酒店霓虹,心里回味著剛才這句話。他想到了什么似的,笑了一聲。很短暫的一瞬。那手在他手里驚詫了一下,好像在問你笑什么?果然,他側目看見了一雙疑惑的眼神。很美的一雙眼睛。就這么打動他的一雙眼睛。

表1 符號執行工具比較
啟發式搜索算法能有效地引導符號執行的路徑探索,引入并行計算能顯著提高執行效率,開發新的更有效的啟發式搜索和實現并行化將會成為符號執行技術的發展趨勢。而符號執行技術固有的一些弱點,如路徑爆炸,也需要更完善的解決方案來改進。此外,符號執行技術與其他的優秀測試用例生成技術,如模型檢測技術、基于搜索的測試生成技術的結合也是未來的一個發展趨勢。
唐代開放的社會風氣中,一方面,承接前代的傳統,上層婦女因文才受到帝王表彰從而具有獲得官職的機會。上官婉兒因才華卓著受到武則天任用,官員的章表書奏多委任于她,中宗時期,又大被重用,不久即拜為昭儀。
[1]J.C.King.Symbolic Execution and Program Testing.Communications of the ACM,vol.19,pp.385-394,1976.
[2]G.Campana.Fuzzgrind:an Automatic Fuzzing Tool.Hack.lu,2009.
[3]D.Yu,L.Mengxiang,Y.Kai,Z.Yi,C.Yinli.Achieving High Branch Coverage with Fewer Paths.in Computer Software and Applications Conference Workshops(COMPSACW),2011 IEEE 35th Annual,2011,pp.155-160.
[4]P.Boonstoppel,C.Cadar,D.Engler.RWset:Attacking Path Explosion in Constraint-Based Test Generation.in 14th International Conference onTools and Algorithms for the Construction and Analysis of Systems,TACAS2008.March 29,2008-April 6,2008, Budapest,Hungary,2008,pp.351-366.
[5]K.Taneja,T.Xie,N.Tillmann,J.De Halleux.eXpress:Guided Path Exploration for Efficient Regression Test Generation.in 20th International Symposium on Software Testing and Analysis,ISSTA 2011,July 17,2011-July 21,2011,Toronto,ON,Canada,2011,pp. 1-11.
[6]S.Bucur,V.Ureche,C.Zamfir,G.Candea.Parallel Symbolic Execution for Automated Real-World Software Testing.Presented at the Proceedings of the Sixth Conference on Computer Systems,Salzburg,Austria,2011.
[7]B.Elkarablieh,P.Godefroid,M.Y.Levin.Precise Pointer Reasoning for Dynamic Test Generation.in Proceedings of the Eighteenth International Symposium on Software Testing and Analysis,2009,pp.129-140.
[8]M.Emmi,R.Majumdar,K.Sen.Dynamic Test Input Generation for Database Applications.2007 ACM International Symposium on Software Testing and Analysis,ISSTA'07,pp.151-162,2007.
[9]P.Kai,W.Xintao,X.Tao.Generating Program Inputs for Database Application Testing.2011 26th IEEE/ACM International Conference on Automated Software Engineering,pp.73-82,2011 2011.
[10]Y.Kim,M.Kim.SCORE:A Scalable Concolic Testing Tool for Reliable Embedded Software.in 19th ACM SIGSOFT Symposium on Foundations of Software Engineering,SIGSOFT/FSE'11,September 5,2011-September 9,2011,Szeged,Hungary,2011,pp.420-423.
[11]S.Thummalapenta,J.De Halleux,N.Tillmann,S.Wadsworth.DyGen:Automatic Generation of High-Coverage Tests Via Mining Gigabytes of Dynamic Traces.in 4th International Conference on Tests and Proofs,TAP 2010,July 1,2010-July 2,2010,Malaga,Spain, 2010,pp.77-93.
[12]P.Godefroid,N.Klarlund,K.Sen.DART:Directed Automated Random Testing.Acm Sigplan Notices,vol.40,pp.213-223,Jun 2005.
[13]S.Koushik,G.Agha.CUTE and jCUTE:Concolic Unit Testing and Explicit Path Model-Checking Tools(Tool Paper).Computer Aided Verification.18th International Conference.CAV 2006.Proceedings(Lecture Notes in Computer Science Vol.4144),pp.419-23,2006.
[14]S.Godboley,G.S.Prashanth,D.P.Mohapatro,B.Majhi.Increase in Modified Condition/Decision Coverage Using Program Code Transformer.2013 3rd IEEE International Advance Computing Conference(IACC 2013),pp.1400-7,2012 2012.
[15]J.P.Escobedo,C.Gaston,P.Le Gall,A.Cavalli.Testing Web Service Orchestrators in Context:A Symbolic Approach.Proceedings of the 2010 8th IEEE International Conference on Software Engineering and Formal Methods(SEFM 2010),pp.257-67,2010.
[16]D.Vanoverberghe,N.Tillmann,F.Piessens.Test Input Generation for Programs with Pointers.in 15th International Conference onTools and Algorithms for the Construction and Analysis of Systems,TACAS 2009.
[17]C.Cadar,V.Ganesh,P.M.Pawlowski,D.L.Dill,D.R.Engler.EXE:Automatically Generating Inputs of Death.ACM Transactions on Information and System Security,vol.12,2008.
[18]K.YoungJoo,K.Moonzoo,K.Yunho,J.Uijune.Comparison of Search Strategies of KLEE Concolic Testing Tool.Journal of KIISE: Computing Practices and Letters,vol.18,pp.321-5,April 2012.
Symbolic Execution for Automated Test Generation
ZENG Jia-yan
(College of Computer Science,Sichuan University,Chengdu 610225)
Symbolic execution has been proposed nearly four decades,it has been widely used in software engineering and became a popular automated testing technique,due in part to the progress in computer science and techniques.Summarizes the symbolic execution for automatic test case generation,intends to provide the appropriate reference for academia or industry.Describes the basic principles of symbolic execution techniques,describes the corresponding improvement strategies to problems facing symbolic execution,introduces the typical case of symbolic execution in automatic test case generation,introduces and made comparison of existing symbolic execution tools,and discusses the future trends of symbolic execution.
Symbolic Execution;Concolic Testing;Automated Testing;Test Generation
1007-1423(2017)04-0012-05
10.3969/j.issn.1007-1423.2017.04.003
曾嘉彥(1992-),女,廣東韶關人,碩士,研究方向為自動化測試、數據挖掘
2016-12-15
2017-01-15