亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        一種基于異常控制流的錯(cuò)誤程序行為分析方法

        2018-08-07 12:38:10江建慧吳捷程
        關(guān)鍵詞:函數(shù)調(diào)用故障注入調(diào)用

        江建慧, 吳捷程, 孫 亞

        (同濟(jì)大學(xué) 軟件學(xué)院, 上海 201804)

        錯(cuò)誤程序行為(erroneous program behavior, EPB) 分析主要是獲取程序差錯(cuò)及其對(duì)程序行為的影響,包括差錯(cuò)類(lèi)型、差錯(cuò)發(fā)生位置、差錯(cuò)發(fā)生時(shí)機(jī),以及各個(gè)差錯(cuò)在程序中的表象.

        軟件故障注入技術(shù)通過(guò)人為地對(duì)軟件或計(jì)算機(jī)等目標(biāo)系統(tǒng)注入軟件故障來(lái)加速其失效,從而實(shí)現(xiàn)目標(biāo)系統(tǒng)的容錯(cuò)機(jī)制有效性驗(yàn)證、可靠性評(píng)估[1-2].然而,如何得到真實(shí)的軟件故障或差錯(cuò)數(shù)據(jù)是該技術(shù)實(shí)現(xiàn)的前提[1-4].

        具有代表性的軟件差錯(cuò)數(shù)據(jù)獲取需要分析軟件的功能特性及其在某個(gè)故障/缺陷被激活后所表現(xiàn)出的錯(cuò)誤行為[2-3,5],工作量很大,且分析周期很長(zhǎng)[1,3].常見(jiàn)的正交缺陷分類(lèi)(orthogonal defect classification, ODC)所屬故障被激活后所產(chǎn)生的程序差錯(cuò)形式隨程序?qū)崿F(xiàn)的不同而不同[1],可能以返回碼或共享變量的形式存在于應(yīng)用程序與其使用的庫(kù)函數(shù)之間[2,6],也可能以異常的形式在程序中進(jìn)行傳播[5-6],或以跳轉(zhuǎn)指令的組合形式出現(xiàn)[7].

        在具有異常處理機(jī)制的程序中,故障激活后所產(chǎn)生的差錯(cuò)若被異常處理機(jī)制偵測(cè),則異常發(fā)生[8-9].若對(duì)該異常處理不當(dāng),則可引起程序失效[9].這一過(guò)程將形成“故障-差錯(cuò)-異常-失效”鏈.

        通過(guò)對(duì)程序異??刂屏?exception control flow,ECF)的分析可收集能夠引起異常的差錯(cuò)信息,包括:由異常類(lèi)型獲取差錯(cuò)內(nèi)容;由異常引發(fā)點(diǎn)獲取差錯(cuò)被偵測(cè)時(shí)的物理位置;由異常傳播路徑獲取差錯(cuò)的影響范圍;由異常捕捉情況獲取差錯(cuò)是否得到修正的信息.這些信息可指導(dǎo)軟件故障注入方案生成所需的差錯(cuò)類(lèi)型、注入位置、注入時(shí)機(jī)的選擇[4-5,10-11].該過(guò)程通過(guò)源代碼的靜態(tài)分析,可在相對(duì)較短的時(shí)間內(nèi)完成.

        本文的主要工作是通過(guò)故障注入實(shí)驗(yàn)分析程序的“故障-差錯(cuò)-異?!钡膫鞑C(jī)理;結(jié)合函數(shù)級(jí)ECF(function-level ECF,F(xiàn)ECF)的描述,分析了同一差錯(cuò)與多個(gè)程序ECF之間的關(guān)系,利用ECF對(duì)程序中潛在可引起異常的差錯(cuò)進(jìn)行分析,建立了EPB模型;實(shí)現(xiàn)了一個(gè)自動(dòng)分析工具軟件,并以O(shè)penStack的核心組件為對(duì)象進(jìn)行了實(shí)驗(yàn)驗(yàn)證.

        1 相關(guān)工作

        Christmansson等[3]認(rèn)為只有注入具有代表性的差錯(cuò)才能有效地模擬真實(shí)故障的發(fā)生,有效地驗(yàn)證軟件的容錯(cuò)機(jī)制.考慮應(yīng)用程序和函數(shù)庫(kù)之間的潛在錯(cuò)誤的故障注入工具LFI(庫(kù)文件故障注入器)改善了應(yīng)用程序的健壯性測(cè)試技術(shù)[2].基于窮盡異常模擬模式的測(cè)試方法結(jié)合異常發(fā)生的時(shí)序特點(diǎn)在異常引發(fā)點(diǎn)注入異常,簡(jiǎn)化了異常處理結(jié)構(gòu)有效性驗(yàn)證的過(guò)程[5].上述工作強(qiáng)調(diào)了故障/差錯(cuò)數(shù)據(jù)的有效性,討論了如何利用差錯(cuò)數(shù)據(jù)進(jìn)行軟件容錯(cuò)機(jī)制的驗(yàn)證,但其尚未涉及如何有效地收集合理的差錯(cuò)數(shù)據(jù).

        關(guān)于軟件故障激活后的傳播過(guò)程及證明故障激活后能否轉(zhuǎn)化為差錯(cuò)的研究,有基于“故障-差錯(cuò)-失效”的傳播關(guān)系選擇具有代表性的差錯(cuò)集合的方法[5].通過(guò)代碼內(nèi)部的故障注入和接口差錯(cuò)注入的實(shí)驗(yàn)研究結(jié)果表明,兩者對(duì)程序的影響存在一定的差異[4].代碼故障激活后的差錯(cuò)不僅能以返回值、錯(cuò)誤碼、傳入/傳出參數(shù)的方式進(jìn)行傳播,還能以共享內(nèi)存數(shù)據(jù)為載體對(duì)程序造成影響[11].應(yīng)從多維度對(duì)故障注入后的EPB進(jìn)行收集、分析、歸類(lèi),從而使得各層次的EPB研究可得到相關(guān)數(shù)據(jù)的支撐,實(shí)驗(yàn)表明,故障激活后所產(chǎn)生的差錯(cuò)能以返回值或異常形式進(jìn)行傳播,且該差錯(cuò)被偵測(cè)的情況和是否引起程序失效取決于程序的實(shí)現(xiàn)[6].這些工作均未深入研究具有異常處理機(jī)制的程序中的“故障-差錯(cuò)-異?!边^(guò)程.

        大多數(shù)與程序ECF相關(guān)的研究工作主要聚焦在它對(duì)程序分析、開(kāi)發(fā)、測(cè)試的影響上.如基于異常傳播分析的C++程序數(shù)據(jù)流分析方法[12]、依賴(lài)性分析方法[13].Harrold等[14-15]在對(duì)異常處理機(jī)制的測(cè)試標(biāo)準(zhǔn)進(jìn)行研究時(shí),考慮了異常處理機(jī)制和異常傳播對(duì)程序控制流、數(shù)據(jù)流、控制依賴(lài)性等分析技術(shù)的影響.用于程序開(kāi)發(fā)、維護(hù)、測(cè)試的系統(tǒng)化方法通過(guò)分析顯式ECF,總結(jié)了與異常處理結(jié)構(gòu)實(shí)現(xiàn)相關(guān)的編程錯(cuò)誤模式,可指導(dǎo)開(kāi)發(fā)者如何有效地避免異常處理機(jī)制的錯(cuò)誤使用[16].面向切面機(jī)制在一些情景下會(huì)使異常處理結(jié)構(gòu)的實(shí)現(xiàn)復(fù)雜化,從而降低系統(tǒng)的可靠性[17].Jo等[18]提出了一種基于集合分析的函數(shù)級(jí)別上的Java未捕捉異常分析方法.結(jié)合運(yùn)行時(shí)異常的靜態(tài)測(cè)試方法通過(guò)交替執(zhí)行缺陷檢測(cè)及控制流擴(kuò)展,提高了測(cè)試充分度,還分析了運(yùn)行時(shí)異常對(duì)軟件靜態(tài)測(cè)試的影響[19].這些與程序ECF相關(guān)的研究工作并未考慮到異常本身就是程序錯(cuò)誤的一種表象,所以沒(méi)有利用異常相關(guān)的信息來(lái)分析潛在的EPB.

        2 程序“故障-差錯(cuò)-異?!睓C(jī)理分析

        2.1 ODC故障注入實(shí)驗(yàn)分析

        異常處理機(jī)制(exception handling mechanism,EHM)是程序錯(cuò)誤處理的常用手段之一.當(dāng)程序中EHM偵測(cè)到差錯(cuò)且引發(fā)異常之后,程序的“故障-差錯(cuò)-異常/失效”過(guò)程如圖1所示.

        對(duì)Android上約800個(gè)應(yīng)用組件所進(jìn)行的600萬(wàn)次基于外界輸入的健壯性測(cè)試實(shí)驗(yàn)數(shù)據(jù)表明,約10%的應(yīng)用組件發(fā)生了崩潰且均由未捕捉到的異常所造成[6].

        本文以分布式網(wǎng)絡(luò)基準(zhǔn)程序Ipbench和OpenStack中的核心組件nova為對(duì)象,結(jié)合ODC故障類(lèi)型及其分布數(shù)據(jù),以代碼變異的方式實(shí)施故障注入實(shí)驗(yàn),實(shí)驗(yàn)結(jié)果見(jiàn)表1(表中的E表示可引起異常的故障數(shù)量).

        在Ipbench中共注入348個(gè)故障,其中255個(gè)故障導(dǎo)致了程序崩潰,且249次崩潰是由未捕捉異常引起.

        在nova中共注入1 018個(gè)故障,未出現(xiàn)程序崩潰現(xiàn)象.由表1可知,419個(gè)故障激活后的差錯(cuò)得到程序的修正,可能的原因有:① 有差錯(cuò)的數(shù)據(jù)在被使用之前重新得到初始化;② 有差錯(cuò)程序的執(zhí)行結(jié)果與無(wú)差錯(cuò)程序的執(zhí)行結(jié)果一致;③ 差錯(cuò)引起異常且被捕獲,異常處理例程提供了正確的服務(wù).

        表1 故障注入實(shí)驗(yàn)結(jié)果Tab.1 Results of fault-injection experiments

        2.2 傳播機(jī)理分析

        以nova的_validate_cell函數(shù)為例,程序的“故障-差錯(cuò)-異?!眰鞑ミ^(guò)程分析如下:

        (1) 故障激活所發(fā)生的差錯(cuò)直接引發(fā)異常.如圖2所示,故障激活后的差錯(cuò)直接在當(dāng)前函數(shù)內(nèi)使raise語(yǔ)句得到執(zhí)行,從而引發(fā)異常.同時(shí),圖2中場(chǎng)景a)與b)的故障激活后均引起了同一異常,說(shuō)明程序中故障與異常存在多對(duì)一關(guān)系,即多個(gè)故障激活后的差錯(cuò)最終均以同一異常在程序中進(jìn)行傳播.

        (2) 故障激活所發(fā)生的差錯(cuò)經(jīng)過(guò)傳播后引發(fā)異常.圖3所示的故障激活后的差錯(cuò)通過(guò)數(shù)據(jù)流影響控制流,最終使得raise語(yǔ)句得到執(zhí)行,引發(fā)異常.

        (3) 在程序無(wú)故障的情況下,外界輸入或外界資源違反軟件規(guī)約而導(dǎo)致異常發(fā)生.

        因此,可從“異常”層次出發(fā),分析程序中可引起異常的差錯(cuò)信息及其對(duì)程序行為的影響,達(dá)到分析與異常相關(guān)的EPB的目的.

        圖2 差錯(cuò)直接引起異常例子Fig.2 Example of an error raises exception directly

        3 基于ECF的EPB分析

        為了獲取可引起異常的差錯(cuò)的信息,本文方法并不需要構(gòu)建帶有程序ECF的完整過(guò)程間控制流[20],而只需獲取獨(dú)立的ECF信息,包括:ECF起始與中止位置信息;ECF對(duì)應(yīng)的異常類(lèi)型;異常是否被捕捉;ECF所影響到的函數(shù);ECF所影響到的程序功能或服務(wù).這是一種基于源代碼靜態(tài)分析的方法,如何選擇起始函數(shù)作為分析的起始點(diǎn),則直接影響到了分析結(jié)果的有效性.

        3.1 函數(shù)級(jí)ECF的描述

        圖4所示的是函數(shù)級(jí)異常傳播過(guò)程,其中nk(1≤k≤m,m≥1)表示函數(shù),其他符號(hào)的意思在圖中已經(jīng)加以說(shuō)明.以函數(shù)為粒度的異常傳播過(guò)程可分為A,B和C三類(lèi).

        (1) 過(guò)程A:異常在當(dāng)前函數(shù)nm被引發(fā),而且被捕捉.

        (2) 過(guò)程B:異常在當(dāng)前函數(shù)nm被引發(fā),且沿著函數(shù)調(diào)用棧經(jīng)過(guò)m-k逆向傳播后在函數(shù)nk中被捕捉,1≤k≤m.

        (3) 過(guò)程C:異常在當(dāng)前函數(shù)nm被引發(fā),且沿著函數(shù)調(diào)用棧經(jīng)過(guò)m-1次逆向傳播,變成未捕捉異常.

        圖3差錯(cuò)經(jīng)過(guò)傳播而引起異常的例子

        Fig.3Exampleofanerrorraisesexceptionwithcertainpropagation

        圖4 函數(shù)級(jí)的異常傳播過(guò)程Fig.4 Exception propagation process at function level

        定義1程序P中由raise/throw語(yǔ)句顯式引起的FECF可表示為5元組Ψ=,其中:

        (1)ol=(n,lo)為Ψ的起始位置,表示Ψ由函數(shù)no中代碼行號(hào)為lo的raise/throw語(yǔ)句所引發(fā).

        (2)t為Ψ所對(duì)應(yīng)的異常類(lèi)型.

        (3)z=(nz,lz)為Ψ的終止位置.若Ψ屬于過(guò)程A或B,則nz為Ψ被捕捉時(shí)所在的函數(shù),其對(duì)應(yīng)的異常捕捉語(yǔ)句的行號(hào)為lz;若Ψ屬于過(guò)程C,則Ψ在程序P的函數(shù)nz處終止且傳播出去,lz為Ψ進(jìn)入函數(shù)nz時(shí)的異常入口所對(duì)應(yīng)的語(yǔ)句的代碼行號(hào).

        (4)π以路徑的形式給出了Ψ的傳播過(guò)程.若Ψ屬于過(guò)程A或B,則π為no→nm→…→n1→nz,其中no,nz,nk(k=1,2,…,m,m≥1)為Ψ所影響到的函數(shù);若Ψ屬于過(guò)程C,則π為no→nm→…→n1→nz→nout,其中nout為占位符,表示該路徑對(duì)應(yīng)的ECF未被捕捉.

        (5)e為Ψ被引發(fā)時(shí)程序P的棧底函數(shù),表示被Ψ影響到的程序功能或服務(wù).

        與文獻(xiàn)[4, 20]一致,本文也將入口函數(shù)(entry function, EF)作為函數(shù)調(diào)用鏈的分析起點(diǎn),計(jì)算程序中所有潛在的FECF.

        3.2 利用程序ECF表示EPB

        同一差錯(cuò)可引起不同的FECF.這些FECF組成的集合稱(chēng)為FECF簇,對(duì)于其中的任意Ψi與Ψj,它們具有相同的o與t值.

        根據(jù)“故障-差錯(cuò)-異常”傳播機(jī)理,若故障激活后的差錯(cuò)引起異常,則該故障對(duì)程序帶來(lái)的影響完全可由相應(yīng)的FECF簇表示.所以,可通過(guò)分析各FECF簇,反向推導(dǎo)程序中可引起異常的各個(gè)差錯(cuò)及其對(duì)程序行為的影響,從“異常”層次分析與異常相關(guān)的EPB,收集可引起異常的差錯(cuò)集合.

        3.3 基于程序ECF的EPB分析

        (3)w為一權(quán)值,即:

        (1)

        觀察1w值越大,則EPB對(duì)程序可靠性造成危害的風(fēng)險(xiǎn)越大.

        異常傳播過(guò)程B與C的發(fā)生會(huì)使程序的過(guò)程間控制流中產(chǎn)生潛在的非返回調(diào)用[15],它的數(shù)量(即w值)越大,就意味著異常的傳播范圍越大,所以程序的控制流、數(shù)據(jù)流在錯(cuò)誤狀態(tài)下受到的影響越大.

        算法Gen_FECF: 計(jì)算一個(gè)FECF實(shí)例

        輸入s: 函數(shù)m中的raise/throw語(yǔ)句

        m: 語(yǔ)句s所位于的函數(shù)

        輸出Ψ: 一個(gè)FECF實(shí)例

        聲明 callstack: 遍歷分析函數(shù)調(diào)用鏈時(shí)所維護(hù)的函數(shù)調(diào)用棧

        CTS(m): 函數(shù)m的調(diào)用者(caller)調(diào)用函數(shù)m時(shí)所使用的函數(shù)調(diào)用語(yǔ)句

        開(kāi)始 Gen_FECF(s,m)

        1. 新建Ψ實(shí)例并設(shè)置其屬性:o←(m,s的行號(hào)),t←s對(duì)應(yīng)的異常類(lèi)型,π設(shè)置為m,e←callstack的棧底函數(shù);

        2. If SLEGS(s)存在c可捕捉由s引發(fā)的異常 then

        3.z←(m,c的代碼行號(hào)),m加入π:m→m;

        4. returnΨ;

        5. else then //當(dāng)前函數(shù)m無(wú)法捕捉該異常

        6. temp_stack為callstack的副本;

        7.send←s; //用于暫存Ψ終止時(shí)的語(yǔ)句

        8. While temp_stack不為空:

        9.mtop←temp_stack.top();

        10. temp_stack.pop();

        11. if m!=mtopthen 將mtop加入πendif

        12. if temp_stack is empty: //未捕捉異常

        13.z←(mtop,send的行號(hào));

        14. ifm!=mtopthen

        15. 將nout加入π;

        16. else

        17. 將m→nout加入π;

        18. endif

        19. returnΨ;

        20. else if SLEGS(CTS(mtop))有c可捕捉then

        21.z←(temp_stack.top(),c的行號(hào));

        22. 將temp_stack.top()加入π;

        23. returnΨ;

        24. endif

        25.send←CTS(mtop) ;

        26. endwhile

        27. endif

        結(jié)束Gen_FECF

        在計(jì)算所有FECF時(shí),e可用于表示FECF所影響到的程序功能或服務(wù).

        若在函數(shù)遞歸過(guò)程中出現(xiàn)異常,則異常在該部分的傳播路徑呈現(xiàn)一定的模式.所以,可根據(jù)該模式制定合理的裁剪規(guī)則,對(duì)遞歸部分的調(diào)用鏈進(jìn)行裁剪,使得分析過(guò)程能夠有效地繼續(xù)執(zhí)行下去.

        在算法Gen_FECF中,函數(shù)調(diào)用棧是根據(jù)函數(shù)調(diào)用鏈生成的.由于調(diào)用鏈經(jīng)過(guò)了遞歸調(diào)用鏈裁減處理,并且調(diào)用鏈中所有函數(shù)都屬于程序P,函數(shù)調(diào)用棧的深度最多為2·|FDS(P)|-2,其中FDS(P)為定義于程序P中且在程序P中實(shí)現(xiàn)的函數(shù)集合.算法Gen_FECF在最好情況下的時(shí)間復(fù)雜度為O(1),在最壞情況下為O(|FDS(P)|).

        根據(jù)EHM的性質(zhì)[14],對(duì)于異常的傳播及其處理過(guò)程,異常保護(hù)區(qū)z(try語(yǔ)句所保護(hù)的代碼塊)的異常保護(hù)序列EGS(z)指的是z對(duì)應(yīng)的異常處理例程所組成的有序序列(c1,c2,…,cn),n≥1,其順序由z對(duì)應(yīng)的異常處理例程的順序決定.假如zj嵌套于zi之中,那么傳播到zj中的異常首先會(huì)被EGS(zj)中的異常處理例程嘗試捕捉處理,若該異常未被捕捉,則EGS(zi)再?lài)L試對(duì)其捕捉處理,則LEGS(zj)=(cj1,cj2,…,cjn,ci1,ci2,…,cim),若zi不嵌套于任何異常保護(hù)區(qū)中,則LEGS(zi)=EGS(zi)=(ci1,ci2,…,cim),m≥1,n≥1.若語(yǔ)句s位于z中,則語(yǔ)句s受到LEGS(z)的保護(hù),記為SLEGS(z).若有異常在s(raise/throw語(yǔ)句)處被拋出或異常傳播至s(函數(shù)調(diào)用語(yǔ)句)處,若SLEGS(s)能捕捉該異常,則該異常在s語(yǔ)句所在的函數(shù)中被捕捉,否則該異常從當(dāng)前函數(shù)傳播出去且沿著函數(shù)調(diào)用棧逆向傳播.

        在形如(m1,m2, …,mn-1,mn)所表示的調(diào)用棧中,m1表示棧底,mn表示棧頂,n≥1.suc(mi)是mi的后繼mi+1,n≥i≥1,suc(mn)=null.CTS(suc(mk))為函數(shù)mk中調(diào)用函數(shù)suc(mk)時(shí)的函數(shù)調(diào)用語(yǔ)句,且CTS(null) =null.為不失一般性,調(diào)用鏈的遞歸裁剪遵循如下規(guī)則.

        規(guī)則1設(shè)當(dāng)前函數(shù)調(diào)用棧具有以下形式:(mbottom, …,M1,M2, …,Mn,M11,M12, …,M1n, …,Mk1,Mk2, …,Mkn, …,Mq1,Mq2, …,Mqp,mother, …),其中,Mkn表示函數(shù)Mn的第k次遞歸調(diào)用,k≥1.Mqp表示函數(shù)Mp第q次遞歸調(diào)用,q>k,n≥p≥0.若?i,j,k≥i,j≥1,式(2)得到滿(mǎn)足,則調(diào)用??刹眉魹?mbottom, …,M1,M2, …,Mn,Mq1,Mq2, …,Mqp,mother, …),且FECF的o、t、z、e屬性值保持不變,π中受到FECF影響的函數(shù)及其順序不變.

        SLEGS(CTS(Mi1))=SLEGS(CTS(Mj1))=SLEGS(CTS(Mq1))

        SLEGS(CTS(Mi2))=SLEGS(CTS(Mj2))=SLEGS(CTS(M2))

        (2)

        SLEGS(CTS(Min))=SLEGS(CTS(Mjn))=SLEGS(CTS(Mn))

        證明.

        情形一:若在Mkn中無(wú)異常發(fā)生,n≥1,則無(wú)FECF的生成受到裁剪動(dòng)作的影響.

        情形二:假如異常x在函數(shù)Mkn中由raise/throw語(yǔ)句引發(fā),k≥1,n≥1:① 若x在Mkn中捕捉,則會(huì)有與異常x相同的異常在函數(shù)Mn中由相同的raise/throw語(yǔ)句引發(fā)且被相同catch/except語(yǔ)句捕捉,因?yàn)镸kn與Mn為相同函數(shù).② 若x從Mkn傳播出去,則會(huì)有與異常x相同的異常在函數(shù)Mn中由相同的raise/throw語(yǔ)句引發(fā)且從相同的異常出口從Mn傳播出去,因?yàn)镸kn與Mn為相同函數(shù).

        情形三:假如異常x通過(guò)CTS(suc(Mkn))語(yǔ)句從suc(Mkn)函數(shù)傳播至Mkn中,k≥1,n≥1:① 若x在Mkn中捕捉,則會(huì)有與異常x相同的異常y通過(guò)CTS(suc(Mn))語(yǔ)句從suc(Mn)傳播至Mn,且在Mn中由相同的catch/except語(yǔ)句捕捉.因?yàn)閟uc(Mn)與suc(Mkn)為相同函數(shù),CTS(suc(Mn))與CTS(suc(Mkn))為同一函數(shù)調(diào)用語(yǔ)句,且SLEGS(CTS(suc(Mn))) =SLEGS(CTS(suc(Mkn))).② 若x從Mkn中傳播出去,則會(huì)有異常x相同的異常y從Mn中的相同異常出口傳播出去.因?yàn)閟uc(Mn)與suc(Mkn)為相同函數(shù),CTS(suc(Mn))與CTS(suc(Mkn))為同一函數(shù)調(diào)用語(yǔ)句,且SLEGS(CTS(suc(Mn))) =SLEGS(CTS(suc(Mkn))).

        2. 將調(diào)用棧callStack初始化為空;

        3. Traverse_Invocation_Chain(m);

        4. endfor

        /*遍歷以m開(kāi)始的函數(shù)調(diào)用鏈,用Gen_FECF算法生成FECF實(shí)例*/

        聲明 Traverse_Invocation_Chain (m)

        1. callstack.push(m); //維護(hù)調(diào)用棧,m入棧

        2. for each 語(yǔ)句sinmthen

        3. ifs是raise/throw語(yǔ)句then

        4.Ψ←Gen_FECF(s,m);

        6. else ifs是調(diào)用函數(shù)mcallee的語(yǔ)句then

        7. ifmcallee在callstack出現(xiàn)過(guò)兩次and

        8. SLEGS(CTS(mcallee))=SLEGS(s) then

        9. continue; //滿(mǎn)足要求,裁剪

        10. else then //繼續(xù)分析調(diào)用鏈

        11. Traverse_Invocation_Chain (mcallee);

        12. endif

        13. endif

        14. end for

        15. Callstack.pop(m) //維護(hù)調(diào)用棧,m出棧

        2. existEPB← null

        4. IfΨ.o=Ω.oandΨ.t=Ω.tthen

        5. existEPB ←Ω; break;

        6. endif

        7. endfor

        8. if null = existEPB then //暫無(wú)相應(yīng)FECF簇

        13. else then //將Ψ加入對(duì)應(yīng)簇的EPB實(shí)例

        14. existEPB.w← existEPB.w+φ(Ψ);

        17. endif

        18. endfor

        4 基于Understand的自動(dòng)分析工具

        4.1 EPB自動(dòng)分析工具的結(jié)構(gòu)

        采用本文提出的方法,用Python語(yǔ)言編寫(xiě)了一個(gè)基于Understand的EPB自動(dòng)分析工具,其架構(gòu)如圖5所示.Understand是一款代碼審核工具,提供了可操作源代碼相關(guān)數(shù)據(jù)的API,如詞法、語(yǔ)法、函數(shù)調(diào)用關(guān)系等信息.

        圖5 EPB自動(dòng)分析工具架構(gòu)Fig.5 Structure of automatic analysis tool of EPB

        分析控制器:控制整個(gè)分析過(guò)程,包括:調(diào)用鏈的遍歷分析、局部視圖數(shù)據(jù)生成、FECF數(shù)據(jù)生成、EPB數(shù)據(jù)生成、函數(shù)調(diào)用棧的維護(hù)等.

        局部視圖生成器: 函數(shù)代碼中與FECF生成相關(guān)的數(shù)據(jù)以文件形式存儲(chǔ),內(nèi)容包括: ① raise/throw語(yǔ)句的位置、對(duì)應(yīng)的異常類(lèi)型;② 在當(dāng)前函數(shù)被引發(fā)的異常捕捉情況,記錄捕捉該異常的catch/except語(yǔ)句的位置及其對(duì)應(yīng)的異常類(lèi)型;③ 當(dāng)前函數(shù)的函數(shù)調(diào)用關(guān)系信息;④ 當(dāng)前函數(shù)中的函數(shù)調(diào)用語(yǔ)句是否處于異常保護(hù)區(qū)中,若是,則記錄相應(yīng)的catch/except語(yǔ)句位置及其對(duì)應(yīng)的異常類(lèi)型.

        FECF生成器:當(dāng)異常以raise/throw形式被引發(fā)時(shí),結(jié)合相應(yīng)的局部視圖數(shù)據(jù),根據(jù)Gen_FECF算法生成相應(yīng)FECF數(shù)據(jù).

        4.2 EPB自動(dòng)分析工具的使用步驟

        自動(dòng)分析工具進(jìn)行EPB分析的主要步驟如下:

        (1) 以源代碼為輸入,使用Understand軟件生成程序的詞法、語(yǔ)法、函數(shù)調(diào)用關(guān)系等數(shù)據(jù).

        (2) 以s為分析起點(diǎn),s∈SEF,迭代分析其函數(shù)調(diào)用鏈,檢查函數(shù)內(nèi)是否有被raise/throw語(yǔ)句引發(fā)的異常.若存在異常,則轉(zhuǎn)(3);否則,繼續(xù)按照(2)分析函數(shù)調(diào)用鏈中未被分析的函數(shù),直到所有調(diào)用鏈分析完畢,轉(zhuǎn)(4).

        5 實(shí)驗(yàn)及其分析

        為了驗(yàn)證本文方法及所開(kāi)發(fā)的程序EPB自動(dòng)分析工具的合理性和有效性,以O(shè)penStack的核心組件作為對(duì)象進(jìn)行了實(shí)驗(yàn).

        5.1 實(shí)驗(yàn)環(huán)境

        實(shí)驗(yàn)在虛擬機(jī)上進(jìn)行,操作系統(tǒng)為內(nèi)核版本2.6.32的32位Linux,硬件配置為1GB內(nèi)存,Intel(R) Core(TM) i3-3217U@1.80GHz單核CPU.實(shí)驗(yàn)負(fù)載為OpenStack(G 版本)中的5個(gè)核心組件,該軟件用Python語(yǔ)言編寫(xiě),各組件的SEF數(shù)據(jù)均根據(jù)相應(yīng)的應(yīng)用程序編程接口(application programming interface, API)文檔人工收集而得.

        5.2 實(shí)驗(yàn)結(jié)果與分析

        對(duì)27 876行OpenStack組件的錯(cuò)誤行為的實(shí)驗(yàn)結(jié)果見(jiàn)表2,其中duser=10 000表示用戶(hù)指定的閾值.

        表2 OpenStack組件錯(cuò)誤行為分析結(jié)果Tab.2 Analysis results of erroneous OpenStack component behavior

        調(diào)用鏈中函數(shù)調(diào)用點(diǎn)總量與函數(shù)數(shù)量的比值為10 408/1 426=7.3,說(shuō)明每個(gè)函數(shù)平均被調(diào)用了7.3次,若差錯(cuò)在函數(shù)中引起異常,則該異常可潛在引起由7個(gè)不同ECF組成的FECF簇,表明從異常角度對(duì)差錯(cuò)及其對(duì)程序行為影響進(jìn)行分析是可行的.

        圖6 nova組件中以w排序的前十個(gè)EPB實(shí)例數(shù)據(jù)Fig.6 Top ten EPB Ω ordered by w in nova components

        6 結(jié)束語(yǔ)

        本文通過(guò)故障注入實(shí)驗(yàn)研究了具有EHM的程序的軟件故障、差錯(cuò)、異常之間的傳播機(jī)理.結(jié)合FECF的描述,說(shuō)明了如何利用ECF收集與異常相關(guān)的差錯(cuò)信息,建立了基于ECF的EPB模型,開(kāi)發(fā)了基于該模型的EPB自動(dòng)分析工具,并用該工具對(duì)OpenStack核心組件進(jìn)行了錯(cuò)誤行為分析,結(jié)果表明了基于ECF的EPB分析的合理性和有效性.該方法及其工具為具有EHM的大規(guī)模程序的EPB自動(dòng)分析,指導(dǎo)程序異常處理結(jié)構(gòu)的重構(gòu),使程序可精確捕捉異常,提高程序可靠性,并為構(gòu)造合理的外部激勵(lì)精確激活差錯(cuò),縮短故障注入實(shí)驗(yàn)周期提供了有效手段.

        猜你喜歡
        函數(shù)調(diào)用故障注入調(diào)用
        模擬訓(xùn)練裝備故障注入系統(tǒng)研究
        基于C語(yǔ)言的數(shù)學(xué)菜單的設(shè)計(jì)與實(shí)現(xiàn)
        核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
        SM4算法前四輪約減輪故障注入分析
        LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
        采用修改-回放原理的1553B故障注入方法
        基于函數(shù)調(diào)用序列模式和函數(shù)調(diào)用圖的程序缺陷檢測(cè)方法*
        探討C++編程中避免代碼冗余的技巧
        Unity3D項(xiàng)目腳本優(yōu)化分析與研究
        基于系統(tǒng)調(diào)用的惡意軟件檢測(cè)技術(shù)研究
        国语精品视频在线观看不卡| 中文日韩亚洲欧美制服| 欧美性群另类交| 韩国无码精品人妻一区二 | 波霸影院一区二区| 亚洲国产精品尤物yw在线观看| 亚洲熟妇夜夜一区二区三区| 午夜视频一区二区三区在线观看| 噜噜综合亚洲av中文无码| 国产又黄又大又粗的视频| 污污污污污污WWW网站免费| 久久久亚洲欧洲日产国产成人无码| 国产一区二区三区av香蕉| 中文字幕成人乱码熟女精品国50| 国产va免费精品观看精品| 久久精品国内一区二区三区| 制服丝袜人妻中出第一页| 国产激情综合五月久久| 午夜理论片yy6080私人影院| 欧洲熟妇乱xxxxx大屁股7| 亚洲青涩在线不卡av| 极品粉嫩小仙女高潮喷水操av| 大肉大捧一进一出好爽视频| 中文字幕经典一区| 青青草成人免费播放视频| 19款日产奇骏车怎么样| 久久综合狠狠色综合伊人| 亚洲AⅤ永久无码精品AA| 国产精品一区二区三区成人| 奇米影视色777四色在线首页| 色欲aⅴ亚洲情无码av蜜桃| 国产杨幂AV在线播放| 日本免费一区二区在线视频播放| 女人让男人桶爽30分钟| 久久精品一品道久久精品9 | 国内精品国产三级国产av另类| 激情五月六月婷婷俺来也| 中文字幕无码av波多野吉衣| 亚洲免费视频播放| 精品国产迪丽热巴在线| 久久夜色国产精品噜噜亚洲av|