0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于符號(hào)執(zhí)行的測(cè)試生成

上??匕?/a> ? 來(lái)源:上??匕?/span> ? 作者:上海控安 ? 2023-04-07 11:36 ? 次閱讀

作者 | 王祺昌 華東師范大學(xué)軟件工程學(xué)院碩士研究生

蘇亭 華東師范大學(xué)軟件工程學(xué)院教授

版塊 | 鑒源論壇 · 觀模

引言:測(cè)試用例自動(dòng)生成,簡(jiǎn)稱測(cè)試生成(Test Generation),是指針對(duì)給定的被測(cè)對(duì)象,例如代碼單元、接口、系統(tǒng)等,使用相關(guān)算法生成測(cè)試用例集合的方法。其本質(zhì)是測(cè)試用例設(shè)計(jì)自動(dòng)化,無(wú)需開(kāi)發(fā)者手動(dòng)設(shè)計(jì)測(cè)試用例。測(cè)試生成可分為黑盒和白盒,前者在不考慮程序本身的情況下為程序生成測(cè)試用例,而后者分析程序的源代碼或二進(jìn)制代碼以生成測(cè)試用例,基于符號(hào)執(zhí)行的測(cè)試生成是一種典型的白盒測(cè)試生成方法。

01 什么是符號(hào)執(zhí)行(symbolic execution)

符號(hào)執(zhí)行(symbolic execution)是一種經(jīng)典的程序分析技術(shù),使用抽象的符號(hào)值(symbolic value)而不是精確的具體值(concrete value)作為程序輸入,以此將程序變量的值表示為這些輸入的符號(hào)表達(dá)式。在符號(hào)執(zhí)行期間的任何一點(diǎn),符號(hào)執(zhí)行引擎可以獲取到達(dá)該點(diǎn)的路徑約束,并通過(guò)約束求解器(constraint solver)求解約束以得到可以到達(dá)該點(diǎn)的具體值。

下面的簡(jiǎn)單代碼片段將給出一個(gè)例子,假設(shè)ERROR語(yǔ)句對(duì)應(yīng)程序中的一個(gè)漏洞,我們使用符號(hào)執(zhí)行判斷是否有達(dá)到該語(yǔ)句的可能。符號(hào)執(zhí)行會(huì)在給定的時(shí)間內(nèi),生成一組輸入來(lái)盡可能多的探索所有的執(zhí)行路徑,程序的輸入包括兩個(gè)變量 x 和 y,因此符號(hào)執(zhí)行會(huì)將它們都綁定到對(duì)應(yīng)的符號(hào)值α和β,最終程序中的每個(gè)點(diǎn)都對(duì)應(yīng)一組α和β組成的約束。

pYYBAGQvj8GAN9e_AAAasoWdcZg21.webp

圖 1 符號(hào)執(zhí)行代碼示例

符號(hào)執(zhí)行結(jié)束后生成的計(jì)算樹(shù)如圖 2 所示,樹(shù)中的每個(gè)節(jié)點(diǎn)代表程序中的一個(gè)條件語(yǔ)句,每個(gè)邊代表一組非條件語(yǔ)句的執(zhí)行,每條路徑代表從程序開(kāi)始到路徑終點(diǎn)的一條執(zhí)行路徑,通過(guò)為每條路徑求解對(duì)應(yīng)的路徑約束,就可以判斷該路徑是否可行,并為可行路徑生成對(duì)應(yīng)的程序輸入。

ERROR 語(yǔ)句對(duì)應(yīng)的路徑約束為(2*β==α ^ α<=β+10),求解該約束可得到一個(gè)可行解(α=4 ^ β=2),則(x =4, y=2)就是到達(dá) ERROR 語(yǔ)句對(duì)應(yīng)的程序輸入。

pYYBAGQvj8KAdtrWAAARgPhkrOY49.webp

圖 2 程序?qū)?yīng)的計(jì)算樹(shù)(computation tree)

02 符號(hào)執(zhí)行的發(fā)展

符號(hào)執(zhí)行的思想最早由 James C. King 在 1976 年發(fā)表的一篇論文[1]中提出,文中提出的“解析程序的路徑后,用符號(hào)模擬通過(guò)路徑并獲得輸出”的方法如今被稱為“經(jīng)典符號(hào)執(zhí)行”。

雖然符號(hào)執(zhí)行技術(shù)最早在 70 年代就被提出,但未受到研究者的廣泛關(guān)注,直到 21 世紀(jì)才重新回到人們的視野中,這主要受兩個(gè)原因的限制。首先,符號(hào)執(zhí)行在大型現(xiàn)實(shí)世界程序中的應(yīng)用需要求解復(fù)雜而龐大的約束,而當(dāng)時(shí)的約束求解器的求解能力限制了符號(hào)執(zhí)行技術(shù)推廣,在過(guò)去十年中,涌現(xiàn)了了許多強(qiáng)大的約束求解器如 Z3 (de Moura and Bj?rner, 2008)[2], Yices (Dutertre and de Moura, 2006)[3], STP (Ganesh and Dill, 2007)[4]。其次,老一代計(jì)算機(jī)的計(jì)算能力有限,無(wú)法符號(hào)地執(zhí)行大型程序,而今天的計(jì)算機(jī)比八十年代強(qiáng)大得多,這減少了符號(hào)執(zhí)行應(yīng)用于大型真實(shí)世界程序的障礙。

2006年,Cristian Cadar 設(shè)計(jì)了一種“先進(jìn)行符號(hào)執(zhí)行,后根據(jù)符號(hào)執(zhí)行結(jié)果生成測(cè)試用例”的“執(zhí)行生成測(cè)試”技術(shù)[5],并隨后將其發(fā)展為應(yīng)用在GNU/Linux 內(nèi)核錯(cuò)誤檢查中的 KLEE[6]。

2007年,Koushik Sen 提出將符號(hào)執(zhí)行和實(shí)際執(zhí)行結(jié)合的混合執(zhí)行(Concolic Execution)[7]。

2009 年,Vitaly Chipounov 提出“選擇性符號(hào)執(zhí)行”,通過(guò)選擇 “對(duì)程序設(shè)計(jì)者有意義”的執(zhí)行分支進(jìn)行符號(hào)執(zhí)行測(cè)試來(lái)提高對(duì)大型程序應(yīng)用符號(hào)執(zhí)行測(cè)試的可行性。

如今符號(hào)執(zhí)行已經(jīng)被廣泛用于測(cè)試領(lǐng)域,其中最著名的用途是進(jìn)行測(cè)試生成以提高代碼覆蓋率并發(fā)現(xiàn)程序錯(cuò)誤,此外還被用于安全漏洞自動(dòng)生成、負(fù)載測(cè)試、故障定位和回歸測(cè)試等。

03 符號(hào)執(zhí)行進(jìn)階

3.1 混合執(zhí)行(Concolic Execution)

混合執(zhí)行(Concolic Execution)已成為一種流行的符號(hào)執(zhí)行方法,又稱為動(dòng)態(tài)符號(hào)執(zhí)行(Dynamic Symbolic Execution)或動(dòng)態(tài)測(cè)試生成(Dynamic Test Generation) [8]。與經(jīng)典符號(hào)執(zhí)行不同,混合執(zhí)行使用一個(gè)具體值作為輸入驅(qū)動(dòng)程序運(yùn)行,沿途收集路徑約束,當(dāng)程序執(zhí)行結(jié)束后通過(guò)對(duì)路徑約束上的不同分支取反來(lái)生成新路徑上的約束,交由約束求解器求解得到新的輸入,重復(fù)上述策略以覆蓋更多的路徑。

通過(guò)這種輸入迭代產(chǎn)生變種輸入的方法,理論上所有可行的路徑都可以被計(jì)算并分析?;旌蠄?zhí)行相較于經(jīng)典符號(hào)執(zhí)行的優(yōu)勢(shì)在于每次執(zhí)行都是基于具體值的而非模擬符號(hào)值的執(zhí)行,從而顯著降低了符號(hào)執(zhí)行的開(kāi)銷,使得符號(hào)執(zhí)行技術(shù)有能力處理更大規(guī)模的現(xiàn)實(shí)世界程序。

3.2 符號(hào)反向執(zhí)行(Symbolic Backward Execution)

符號(hào)反向執(zhí)行(SBE)是符號(hào)執(zhí)行的一種變體[9],它探索從程序中的特定目標(biāo)點(diǎn)到程序的入口的路徑,因此其分析方向和傳統(tǒng)的正向符號(hào)執(zhí)行相反。符號(hào)反向執(zhí)行的主要目標(biāo)是快速尋找可以到達(dá)程序中特定目標(biāo)點(diǎn)(例如 assert 和 throw 語(yǔ)句)的測(cè)試用例,這對(duì)開(kāi)發(fā)人員在對(duì)程序進(jìn)行調(diào)試或回歸測(cè)試時(shí)非常有用。

04 符號(hào)執(zhí)行的限制

符號(hào)執(zhí)行理論上可以對(duì)程序可能的執(zhí)行路徑進(jìn)行詳盡的探索,也因此在處理現(xiàn)實(shí)世界的程序時(shí)遇到了一些挑戰(zhàn):

(1) 路徑爆炸

大多數(shù)符號(hào)執(zhí)行方法不適用于處理大型程序:隨著程序規(guī)模的擴(kuò)大,程序中有意義的路徑數(shù)量成指數(shù)級(jí)增長(zhǎng)。許多程序中還存在無(wú)限循環(huán)(infinite-loop)或遞歸調(diào)用,這大大增加了路徑條數(shù),提高了符號(hào)執(zhí)行的難度。

(2) 復(fù)雜約束

符號(hào)執(zhí)行中的重要部分是對(duì)路徑約束的求解,但現(xiàn)實(shí)中存在一些復(fù)雜約束使得約束求解器難以求解(例如非線性算術(shù)運(yùn)算、第三方庫(kù)函數(shù)等),這會(huì)顯示符號(hào)執(zhí)行系統(tǒng)可以探索的路徑數(shù)量。

(3) 內(nèi)存

符號(hào)執(zhí)行引擎難以處理指針、數(shù)組等復(fù)雜對(duì)象,另外,由于符號(hào)執(zhí)行根據(jù)內(nèi)存地址分析變量及其變化,對(duì)于有內(nèi)存地址別名的程序,符號(hào)執(zhí)行引擎將難以區(qū)分不同別名,因此執(zhí)行結(jié)果可能有偏差。

05 總結(jié)

符號(hào)執(zhí)行作為一個(gè)經(jīng)典的程序分析技術(shù),在 21 世紀(jì)受到了研究者的廣泛重視,并為軟件測(cè)試提供了一個(gè)在白盒情況下精準(zhǔn)和詳盡地測(cè)試程序的全新思路,近年來(lái)不斷出現(xiàn)新的符號(hào)執(zhí)行技術(shù)和相關(guān)工具,被廣泛應(yīng)用于測(cè)試生成、負(fù)載測(cè)試、故障定位以及回歸測(cè)試等場(chǎng)景。盡管取得了巨大進(jìn)展,但符號(hào)執(zhí)行仍然面臨現(xiàn)實(shí)世界大型程序中存在的許多挑戰(zhàn),學(xué)術(shù)界和工業(yè)界也在不斷探索符號(hào)執(zhí)行和其他技術(shù)相結(jié)合以提升執(zhí)行性能的方式,例如將符號(hào)執(zhí)行與模糊測(cè)試相結(jié)合以提升測(cè)試生成的精確性和可擴(kuò)展性。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8372

    瀏覽量

    150568
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4700

    瀏覽量

    68108
  • 軟件測(cè)試
    +關(guān)注

    關(guān)注

    2

    文章

    221

    瀏覽量

    18534
  • 符號(hào)
    +關(guān)注

    關(guān)注

    0

    文章

    55

    瀏覽量

    4298
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    MX項(xiàng)目-名稱中有“&”符號(hào)時(shí)無(wú)法生成代碼的原因?

    我使用了 CubeMX 5.6.1,然后我嘗試為帶有“ & ”符號(hào)的項(xiàng)目生成代碼,并且生成卡在復(fù)制庫(kù)文件中。我多次重新啟動(dòng) CubeMX,但沒(méi)有任何變化,所以我刪除了“ & ”符號(hào)
    發(fā)表于 01-30 08:28

    為什么STM32在使用Device Configuration Tool生成代碼后添加DEBUG預(yù)處理器符號(hào)?

    你好!我已經(jīng)在我所有的項(xiàng)目中測(cè)試過(guò)這個(gè)。我有幾種帶有多種符號(hào)的編譯風(fēng)格,但您只能使用默認(rèn)風(fēng)格測(cè)試此問(wèn)題:Release 和 Debug。刪除 Debug 風(fēng)格的 DEBUG 預(yù)處理器符號(hào)
    發(fā)表于 02-01 06:36

    用MDK生成bin格式的可執(zhí)行文件

    用MDK 生成bin 文件1用MDK 生成bin 文件Embest 徐良平在RV MDK 中,默認(rèn)情況下生成*.hex 的可執(zhí)行文件,但是當(dāng)我們要
    發(fā)表于 08-02 10:52 ?71次下載

    Linux驅(qū)動(dòng)程序缺陷檢測(cè)研究

    驅(qū)動(dòng)程序是操作系統(tǒng)的重要組成部分。驅(qū)動(dòng)程序運(yùn)行于內(nèi)核態(tài),其可靠性對(duì)于操作系統(tǒng)的安全可靠非常關(guān)鍵。針對(duì)Linux驅(qū)動(dòng)程序,研究基于符號(hào)執(zhí)行的驅(qū)動(dòng)程序缺陷自動(dòng)檢測(cè)方法。提出了基于性質(zhì)制導(dǎo)符號(hào)執(zhí)行
    發(fā)表于 11-21 15:26 ?9次下載
    Linux驅(qū)動(dòng)程序缺陷檢測(cè)研究

    結(jié)合靜態(tài)分析與動(dòng)態(tài)符號(hào)執(zhí)行的軟件漏洞檢測(cè)方法

    動(dòng)態(tài)符號(hào)執(zhí)行是近年來(lái)新興的一種軟件漏洞檢測(cè)方法,它可以為目標(biāo)程序的不同執(zhí)行路徑自動(dòng)生成測(cè)試用例,從而獲得較高的測(cè)試代碼覆蓋率。然而,程序的
    發(fā)表于 11-23 15:01 ?6次下載
    結(jié)合靜態(tài)分析與動(dòng)態(tài)<b class='flag-5'>符號(hào)執(zhí)行</b>的軟件漏洞檢測(cè)方法

    基于符號(hào)執(zhí)行技術(shù)實(shí)現(xiàn)的驅(qū)動(dòng)程序的漏洞檢測(cè)

    的思路,提出了一種基于符號(hào)執(zhí)行技術(shù)實(shí)現(xiàn)的驅(qū)動(dòng)程序模擬環(huán)境,可以用于分析和檢測(cè)Linux設(shè)備驅(qū)動(dòng)程序中存在的安全漏洞。該環(huán)境通過(guò)模擬內(nèi)核提供給驅(qū)動(dòng)程序的服務(wù)接口,使驅(qū)動(dòng)程序可以在應(yīng)用層進(jìn)行符號(hào)執(zhí)行進(jìn)而可對(duì)其進(jìn)行漏洞檢測(cè)。同時(shí)
    發(fā)表于 12-05 16:06 ?0次下載
    基于<b class='flag-5'>符號(hào)執(zhí)行</b>技術(shù)實(shí)現(xiàn)的驅(qū)動(dòng)程序的漏洞檢測(cè)

    面向危險(xiǎn)操作的動(dòng)態(tài)符號(hào)執(zhí)行方法

    針對(duì)缺陷檢測(cè)的需求,提出了面向危險(xiǎn)操作的動(dòng)態(tài)符號(hào)執(zhí)行方法.依據(jù)所關(guān)注的缺陷類型,定義危險(xiǎn)操作及危險(xiǎn)操作相關(guān)路徑,通過(guò)計(jì)算覆蓋不同上下文中危險(xiǎn)操作的能力,協(xié)助動(dòng)態(tài)符號(hào)執(zhí)行選擇高效初始輸入,并利用危險(xiǎn)
    發(fā)表于 01-14 14:02 ?0次下載

    FPGA I/O優(yōu)化功能自動(dòng)生成FPGA符號(hào)

    FPGA I/O 優(yōu)化功能提供了自動(dòng)化 FPGA 符號(hào)生成流程,該流程與原理圖設(shè)計(jì)和 PCB 設(shè)計(jì)相集成,可節(jié)省大量創(chuàng)建 PCB 設(shè)計(jì)的時(shí)間,同時(shí)提高原理圖符號(hào)的總體質(zhì)量和準(zhǔn)確性。
    的頭像 發(fā)表于 05-20 06:16 ?3068次閱讀
    FPGA I/O優(yōu)化功能自動(dòng)<b class='flag-5'>生成</b>FPGA<b class='flag-5'>符號(hào)</b>

    FPGA自動(dòng)符號(hào)生成節(jié)省PCB設(shè)計(jì)創(chuàng)建時(shí)間

    FPGA的I / O優(yōu)化提供了一個(gè)自動(dòng)化的FPGA符號(hào)生成過(guò)程集成的原理圖和PCB設(shè)計(jì),節(jié)省天的PCB設(shè)計(jì)創(chuàng)建時(shí)間的整體質(zhì)量和準(zhǔn)確性,同時(shí)增加你的原理圖符號(hào)。
    的頭像 發(fā)表于 10-16 07:06 ?2489次閱讀

    軟件測(cè)試的運(yùn)行劃分:動(dòng)態(tài)靜態(tài)測(cè)試的區(qū)別

    靜態(tài)方法是指不運(yùn)行被測(cè)程序本身,僅通過(guò)分析或檢查源程序的語(yǔ)法、結(jié)構(gòu)、過(guò)程、接口等來(lái)檢查程序的正確性,對(duì)需求規(guī)格說(shuō)明書(shū)、軟件設(shè)計(jì)說(shuō)明書(shū)、源程序做結(jié)構(gòu)分析、流程圖分析、符號(hào)執(zhí)行來(lái)找錯(cuò)。
    的頭像 發(fā)表于 06-29 11:05 ?1.7w次閱讀

    如何使用符號(hào)執(zhí)行的python實(shí)現(xiàn)攻擊腳本分析平臺(tái)

    傳統(tǒng)的靜態(tài)分析方法大多不能準(zhǔn)確處理腳本與網(wǎng)絡(luò)交互的過(guò)程,且會(huì)引入不可達(dá)路徑,動(dòng)態(tài)分析則需要搭建實(shí)驗(yàn)環(huán)境和手工分析。針對(duì)上述問(wèn)題,提出一種基于符號(hào)執(zhí)行的Python攻擊腳本分析平臺(tái)PyExZ3+。通過(guò)
    發(fā)表于 07-16 15:50 ?11次下載
    如何使用<b class='flag-5'>符號(hào)執(zhí)行</b>的python實(shí)現(xiàn)攻擊腳本分析平臺(tái)

    結(jié)合混合符號(hào)執(zhí)行的導(dǎo)向式灰盒模糊測(cè)試方法

    導(dǎo)向式灰盒模糊測(cè)試是一種能夠快速生成測(cè)試用例,達(dá)到給定程序目標(biāo)區(qū)域并且發(fā)現(xiàn)漏洞的模糊測(cè)試技術(shù)。針對(duì)當(dāng)前導(dǎo)向式模糊測(cè)試難以通過(guò)魔術(shù)字節(jié)等檢查語(yǔ)
    發(fā)表于 03-26 14:46 ?14次下載
    結(jié)合混合<b class='flag-5'>符號(hào)執(zhí)行</b>的導(dǎo)向式灰盒模糊<b class='flag-5'>測(cè)試</b>方法

    符號(hào)執(zhí)行技術(shù)可識(shí)別安全關(guān)鍵代碼中的漏洞

      多核處理器在安全關(guān)鍵型應(yīng)用中越來(lái)越受歡迎,因?yàn)樗鼈兲峁┝孙@著的價(jià)格和性能改進(jìn)。但是,為多核硬件編寫(xiě)多線程應(yīng)用程序是出了名的困難,并可能導(dǎo)致災(zāi)難性故障。下面描述了用于識(shí)別問(wèn)題(包括數(shù)據(jù)爭(zhēng)用)的符號(hào)執(zhí)行技術(shù)?最常見(jiàn)的并發(fā)缺陷之一?以及靜態(tài)分析如何幫助開(kāi)發(fā)人員找到并消除它們。
    的頭像 發(fā)表于 11-08 11:33 ?788次閱讀
    <b class='flag-5'>符號(hào)執(zhí)行</b>技術(shù)可識(shí)別安全關(guān)鍵代碼中的漏洞

    LTspice-自動(dòng)生成原理圖符號(hào)

    我們以 “REF192” 為例,介紹如何用未在庫(kù)中注冊(cè)的電壓基準(zhǔn) IC 的 SPICE 模型自動(dòng)生成符號(hào)?!癛EF192” 是一個(gè)具有 2.5V 輸出的精密基準(zhǔn)電壓源 IC,首先在 ADI 官網(wǎng)下
    的頭像 發(fā)表于 07-08 09:49 ?1944次閱讀
    LTspice-自動(dòng)<b class='flag-5'>生成</b>原理圖<b class='flag-5'>符號(hào)</b>

    labview怎么生成執(zhí)行文件

    生成執(zhí)行文件(EXE)是LabVIEW程序開(kāi)發(fā)中的一個(gè)重要步驟,它允許用戶將LabVIEW項(xiàng)目打包成一個(gè)獨(dú)立的應(yīng)用程序,便于在沒(méi)有安裝LabVIEW的計(jì)算機(jī)上運(yùn)行。 1. 準(zhǔn)備工作 在開(kāi)始生成
    的頭像 發(fā)表于 09-04 17:07 ?468次閱讀