一種基于符號(hào)計(jì)算的動(dòng)態(tài)并行程序污點(diǎn)分析方法
【專(zhuān)利摘要】一種基于符號(hào)計(jì)算的動(dòng)態(tài)并行程序污點(diǎn)分析方法,根據(jù)并行程序的污染傳播語(yǔ)義構(gòu)建約束表達(dá)式,采用約束求解器驗(yàn)證該變量是否會(huì)在某種交織下被污染,并且生成被污染時(shí)的證據(jù)序列;首先,在給定的污染輸入下執(zhí)行程序,收集特定交織下的污染變量實(shí)例集合;其次,符號(hào)分析:根據(jù)并行程序污染傳播語(yǔ)義,將執(zhí)行路徑轉(zhuǎn)化為約束表達(dá)式以驗(yàn)證此路徑是否新的被污染變量;然后,路徑探索:利用此約束模型來(lái)驗(yàn)證是否存在分支可被取反,以尋找新路徑;最后,繼續(xù)驗(yàn)證新路徑,符號(hào)分析與路徑探索迭代進(jìn)行,直至不再產(chǎn)生新路徑;此方法的目標(biāo)是給定輸入下,驗(yàn)證特定調(diào)度下是否存在一些變量會(huì)在其他交織中被污染;且尋找新語(yǔ)句,以發(fā)現(xiàn)新的污染變量。
【專(zhuān)利說(shuō)明】
-種基于符號(hào)計(jì)算的動(dòng)態(tài)并行程序污點(diǎn)分析方法
技術(shù)領(lǐng)域
[0001] 本發(fā)明屬于可信軟件及軟件分析技術(shù)領(lǐng)域,特別設(shè)及一種基于符號(hào)計(jì)算的動(dòng)態(tài)并 行程序污點(diǎn)分析方法。
【背景技術(shù)】
[0002] 動(dòng)態(tài)污點(diǎn)分析記錄污染源與污染沉潰之間的關(guān)系,安全領(lǐng)域內(nèi)被廣泛應(yīng)用,譬如 數(shù)據(jù)泄露檢測(cè),軟件攻擊防范,惡意軟件分析等等。正是由于其廣泛的應(yīng)用,在污點(diǎn)分析的 精度與效率防范已有大量的工作。不幸的是,現(xiàn)有的動(dòng)態(tài)污點(diǎn)分析方法在檢測(cè)多線程程序 時(shí),都存在一定的under-taint問(wèn)題。運(yùn)主要是因?yàn)橄啾戎诖谐绦騼H有輸入不確定,多 線程程序還有執(zhí)行時(shí)序也不確定,給污點(diǎn)分析帶來(lái)了巨大障礙。
[0003] 然而,分析多線程程序存在一定的難度,難W重現(xiàn)并行錯(cuò)誤。多線程程序具有W下 幾個(gè)特征:1)用戶難W控制所有線程之間的執(zhí)行順序;2)在調(diào)試器中使用插裝技術(shù)或者斷 點(diǎn)調(diào)試方法會(huì)產(chǎn)生副作用,導(dǎo)致某些錯(cuò)誤消失;3)由于操作系統(tǒng)與運(yùn)行時(shí)環(huán)境的原因,導(dǎo)致 錯(cuò)誤發(fā)生的序列很少再次發(fā)生;4)線程交織導(dǎo)致的空間狀態(tài)爆炸,例如,對(duì)于有n個(gè)線程,每 個(gè)線程執(zhí)行k指令的程序,其交織序列數(shù)量可達(dá)(nk)!/化?。?1〉= (11!化。即使在可控制線程 調(diào)度的假設(shè)下,程序員也無(wú)法人工窮舉所有線程交織。
[0004] 目前,已有大量動(dòng)態(tài)污點(diǎn)分析方面的工作,但針對(duì)多線程程序的方法很少且存在 很大的精度問(wèn)題,因?yàn)槠鋬H能對(duì)單一交織路徑下的污點(diǎn)進(jìn)行分析,無(wú)法其他交織下的污點(diǎn), 更不用談同一輸入下不同分支的污點(diǎn)。
【發(fā)明內(nèi)容】
[0005] 為了克服上述現(xiàn)有技術(shù)的缺點(diǎn),本發(fā)明的目的在于提供一種基于符號(hào)計(jì)算的動(dòng)態(tài) 并行程序污點(diǎn)分析方法,根據(jù)多線程程序污染傳播語(yǔ)義構(gòu)建約束表達(dá)式,將污染驗(yàn)證問(wèn)題 轉(zhuǎn)化為約束求解問(wèn)題,采用約束求解器檢測(cè)是否被污染,并生成說(shuō)明被污染的反例執(zhí)行路 徑。
[0006] 為了實(shí)現(xiàn)上述目的,本發(fā)明采用的技術(shù)方案是:
[0007] -種基于符號(hào)計(jì)算的動(dòng)態(tài)并行程序污點(diǎn)分析方法,包括如下步驟:
[000引SI)執(zhí)行待測(cè)程序,W記錄程序的執(zhí)行路徑T;
[0009] S2川欠集執(zhí)行路徑T上的污染變量,放入污染集合TS;
[0010] S3)計(jì)算執(zhí)行路徑T上的潛在污染變量,放入潛在污染集合PTS,所謂的潛在污染變 量,即與被污染變量有數(shù)值依賴(lài)關(guān)系,但是又沒(méi)有在執(zhí)行路徑T上被污染;
[0011] S4)根據(jù)多線程程序污染傳播語(yǔ)義,將執(zhí)行路徑T構(gòu)建為約束模型F,此模型為一階 邏輯表達(dá)式,且包括執(zhí)行路徑T上所有可能污染傳播路徑;
[0012] S5)構(gòu)建潛在污染集合PTS內(nèi)每一個(gè)變量Pts的污染發(fā)生條件化ts,在約束模型F上 驗(yàn)證是否會(huì)被污染,利用約束求解器驗(yàn)證FA化ts,如果可解表示存在某種交織使得Pts被污 染,且將其放入集合TS;如果不可解,表示該變量在T的所有交織下都不會(huì)被污染;
[0013] S6)針對(duì)執(zhí)行路徑T上的任一分支b,構(gòu)建其取反的條件化gate(b),利用約束求解 器驗(yàn)證FA化gate(b)是否有解。如果有解,根據(jù)求解結(jié)果指導(dǎo)程序執(zhí)行出新路徑Tnew;如果 不可解,則驗(yàn)證下一分支。
[0014] S7)如果在給定輸入下,取反分支之后已不再形成新路徑,則停止算法。如果尚存 在新路徑,則繼續(xù)迭代。
[0015] 本發(fā)明進(jìn)一步的改進(jìn)在于:所述步驟SI)中,在符號(hào)執(zhí)行工具化趾平臺(tái)內(nèi)執(zhí)行程 序,W字節(jié)碼的粒度收集序列化的多線程程序執(zhí)行路徑T。
[0016] 本發(fā)明進(jìn)一步的改進(jìn)在于:所述步驟S2)中,將輸入設(shè)定為污染源,對(duì)于一個(gè)語(yǔ)句, 右邊變量如果被污染,那么左邊的變量就會(huì)被污染,被污染的變量則做上標(biāo)記,此污染標(biāo)記 會(huì)隨著并行程序在特定交織下執(zhí)行而傳播,收集被標(biāo)記的變量,放入污染集合TS。
[0017] 本發(fā)明進(jìn)一步的改進(jìn)在于:所述步驟S3)中,將程序中每一個(gè)線程中的全局變量訪 問(wèn)點(diǎn)都作為污染源,并且做上偽污染標(biāo)記,執(zhí)行過(guò)程中,在各自線程內(nèi)部傳播運(yùn)些偽污染標(biāo) 記。用S2)中得到的真實(shí)污染標(biāo)記結(jié)果,替換偽污染標(biāo)記,得到的集合為S,則潛在污染變量 為在S中卻不在TS中的變量,表示為PTS = S-TSd
[0018] 本發(fā)明進(jìn)一步的改進(jìn)在于:所述步驟S4)中,約束模型F蘊(yùn)含了執(zhí)行路徑T所有可能 的交織序列,包括四種約束:程序語(yǔ)義約束、偏序關(guān)系約束、讀寫(xiě)關(guān)系約束W及污染傳播約 束,定義分別如下:
[0019] 1)程序語(yǔ)義約束:描述線程內(nèi)部的定義-使用鏈,W及控制線程內(nèi)部狀態(tài)轉(zhuǎn)換;
[0020] 2)偏序關(guān)系約束:線程內(nèi)部語(yǔ)句之間的關(guān)系,采用順序一致性的語(yǔ)義;線程間語(yǔ)句 的關(guān)系,按照create/join、wait/signal、lock/unlock的語(yǔ)義規(guī)定來(lái)構(gòu)建;
[0021] 3)交織匹配約束:定義線程間的定義-使用鏈,規(guī)定共享變量所讀取到的值,必須 來(lái)自初始值W及最近的寫(xiě)值;同時(shí),當(dāng)線程間有讀寫(xiě)時(shí),也要有對(duì)應(yīng)污染傳播。
[0022] 4)污染傳播約束:規(guī)定線程內(nèi)部變量的污染狀態(tài),確定其數(shù)據(jù)是來(lái)自被污染變量 還是未被污染變量;
[0023] 其中,定義-使用鏈為:將每一個(gè)線程序列轉(zhuǎn)化為SSA格式,對(duì)于每一個(gè)SSA格式的 執(zhí)行序列,除去共享訪問(wèn)點(diǎn)都是一個(gè)完整的定義-使用鏈。
[0024] 本發(fā)明進(jìn)一步的改進(jìn)在于:所述步驟S4),約束模型F的構(gòu)建方法包括W下操作:
[0025] 1)計(jì)算程序語(yǔ)義約束O PS,W控制線程內(nèi)部狀態(tài)轉(zhuǎn)移;
[0026] 2)計(jì)算偏序關(guān)系約束?p。,W構(gòu)建線程間或線程內(nèi)語(yǔ)句之間可能的時(shí)序關(guān)系;
[0027] 3)計(jì)算交織匹配約束?im,W建立線程間的定義-使用鏈W及污染傳播的關(guān)系;
[0028] 4)計(jì)算污染傳播約束?tp,W線程內(nèi)部污染傳播的流程;
[0029] 最后,結(jié)合W上四種約束,構(gòu)成約束模型F=巫PS八巫PO八巫im八巫tp。
[0030] 本發(fā)明進(jìn)一步的改進(jìn)在于:定義執(zhí)行路徑事件集臺(tái)
I其中k 為線程數(shù)量,Ti={ei,e2,…,en}作為線程i的執(zhí)行序列,en表示Tl的第n個(gè)事件,0(en)表示事 件en的順序,n表示Ti的事件數(shù)量,則:
[0031 ]所述程序語(yǔ)義約束的計(jì)算方法:
[0032] 將每一個(gè)線程序列轉(zhuǎn)化為SSA格式,直接將SSA格式序列轉(zhuǎn)化為路徑表達(dá)式;
[0033] 所述偏序關(guān)系約束為 <
,包括W下四種 內(nèi)存模型約束海,鎖同步約束要/,;:/W,條件變量約束爾,線程創(chuàng)建結(jié)束約束 少其各自計(jì)算方法為:
[0034] 內(nèi)存模型約束:采用順序一致性模型,所有操作完全按程序的順序執(zhí)行,線程內(nèi)的 事件順序符合約束:
[0035]
[0036] 其中ei與ew表示同一線程內(nèi)連續(xù)的兩個(gè)事件,T表示所有線程序列;[0037] 鎖同步約束:lock/unlock操作的目的為構(gòu)建鎖同步語(yǔ)義約束,要求在同一互斥鎖白勺 1qq]z /iiril rir* Iz I I I Hdn I rir*L" /iiril rir*L" 才化 S?vf* . I j /ii j i_ /Uk,玉?
[003引
[0039] 其中,鎖對(duì)li/ui英么發(fā)生在鎖對(duì)IkAik之前,英么發(fā)生在其后;
[0040] 條件變量約束:wait/signal操作的目的是構(gòu)建條件變量同步語(yǔ)義約束,要滿足條 件:每一個(gè)wait操作必須對(duì)應(yīng)一個(gè)signal操作,而一個(gè)signal操作至多喚醒一個(gè)wait操作, 對(duì)于同一條件變量cond,令WT作為在cond上所有wait操作的集合,令SG作為在cond上所有
S ignaU雖化A々隹名?.々n猛;B ^ h ^化:.^而去? W T/A .
[0041]
[004^ 其中,ewt為WT中的任一元素,SGrt表示拘*可W匹配的Si即曰1操作的集合,esg為SGwt 中任一signal操作事件,利用變量巧是否等于1來(lái)表示esg是否與ewt相匹配。子公式
I示,對(duì)于每一個(gè)wait操作Gwt必須有一個(gè)si即al操作與之匹配;
[0043] 線程創(chuàng)建結(jié)束約束:首先規(guī)定,如果事件創(chuàng)建一個(gè)線程,那么被創(chuàng)建線程的所有事 件都要在此事件之后執(zhí)行;如果事件執(zhí)行線程終止操作,那么被終止線程的所有事件都要 在此事件之前;令C為create/fork操作的事件集合,令J作為join操作的事件集合;給定約 束:
[0044]
[0045] 其中,ec為線程創(chuàng)建事件,first(ec)為ec所創(chuàng)建的線程首個(gè)事件的順序;ej為線程 終止事件;last(ej)為e非片終止的線程末尾事件的順序;
[0046] 所述交織匹配約束的計(jì)算方法:
[0047] 使共享變量的讀來(lái)自于最近的寫(xiě),對(duì)于同一共享變量V,令R作為所有對(duì)其進(jìn)行讀 操作的事件集合,令W作為所有對(duì)其進(jìn)行寫(xiě)操作的事件集合,給出W下公式:
[004引
[0049] 其中,er為讀事件,ew與ex為寫(xiě)事件,Vr和Vw為事件er與ew所操作的變量,公式所表 達(dá)的意思是,如果事件er中的Vr取值來(lái)自于事件ew中的Vw,首先要滿足er在ew之后,即0(ew) <〇(er);然后要滿足所有的寫(xiě)要么在ew之前,要么在er之后;如果er中的Vr取值來(lái)自于事件 ew中的Vw,那么Vw的污染標(biāo)記也會(huì)傳播給Vr。
[0050] 所述污染傳播約束的計(jì)算方法:
[0051] 將每一個(gè)線程序列內(nèi)每一個(gè)變量V的污染標(biāo)記為V. tag,按照?qǐng)?zhí)行語(yǔ)句的句型直接 轉(zhuǎn)換為表達(dá),譬如,v = a OP b;那么對(duì)應(yīng)的污染傳播表達(dá)式為V.化g = a.化g or b.化g;
[0052] 最終將W上四種約束相與構(gòu)成約束模型F。
[0053] 本發(fā)明進(jìn)一步的改進(jìn)在于:所述步驟S5)中,對(duì)于PTS中任一變量pts,其污染標(biāo)記 為pts.tag,用pts. tag = l來(lái)表示Pts被污染的情況,求解FApts. tag = l。;如果可解,表示 Pts可被污染;如果不可解,表示Pts不可W被污染。
[0054] 本發(fā)明進(jìn)一步的改進(jìn)在于:所述步驟S6)中利用現(xiàn)有約束模型尋找是否存在可取 反的分支,因?yàn)樵诙嗑€程程序執(zhí)行過(guò)程中,有些分支會(huì)受到語(yǔ)句時(shí)序關(guān)系的影響。首先,從F 中去除所有分支C對(duì)應(yīng)的表達(dá)式,得到。然后,對(duì)于C中的每一個(gè)分支Cl,求解
如果可解,表示其可被取反。其中Oi表示Ci的時(shí)序。其中, 表示取反當(dāng)前的分支,Aw聲。i〇j<〇i^Cj表示對(duì)于其他分支,如果發(fā)生在被取反分支之 前,則必須保持不變。
[0055] 本發(fā)明進(jìn)一步的改進(jìn)在于:所述步驟S7)中判斷是否尚有新路徑,如果存在,則回 至化2)繼續(xù)驗(yàn)證;否則,結(jié)束算法。
[0056] 與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:
[0057] (1)提出一種多線程程序污染傳播約束模型,將多線程程序的變量污染驗(yàn)證問(wèn)題 轉(zhuǎn)化為約束求解問(wèn)題。此模型按照程序語(yǔ)義進(jìn)行約束構(gòu)建,所構(gòu)建的表達(dá)式包含了所有可 能的交織序列,利用約束求解器檢查該變量是否會(huì)在某種交織下被污染。
[005引(2)驗(yàn)證單條路徑所有的交織情況下的污染變量。
[0059] (3)驗(yàn)證給定輸入下所有路徑的污染變量。
[0060] (4)給出每一個(gè)變量被污染的污染傳播交織路徑。
【附圖說(shuō)明】
[0061 ]圖1為本發(fā)明方法整體流程圖。
[0062] 圖2為多線程程序污染傳播模型構(gòu)建方法流程圖。
【具體實(shí)施方式】
[0063] 下面結(jié)合附圖和實(shí)施例詳細(xì)說(shuō)明本發(fā)明的實(shí)施方式。
[0064] 待測(cè)示例程序如下所示,X與Z為共享變量,線程0在第3行與第4行創(chuàng)建了線程1與 線程2,且設(shè)定argv[ 1 ]為污染源,且argv[ 1 ]初值為1。
[00 化]
[0066] 如圖I所示,一種基于符號(hào)計(jì)算的動(dòng)態(tài)并行程序污點(diǎn)分析方法,包括如下步驟:
[0067] 步驟Sl):在輸入argv[ 1 ] = 1情況下隨機(jī)執(zhí)行示例程序,得到初始路徑T= {1,2,3, 6,7,8F,4,10,5,11}.
[006引步驟S2):根據(jù)路徑T,收集其被污染的變量集合TS= {a@Ll,y@L2,m@L3,x@L6,z@ L7,n@L4,x@L10},其中a@Ll表示在line I的變量a。
[0069] 步驟S3):再分析路徑T,如下所示,給每一個(gè)線程做一個(gè)偽標(biāo)記,最后利用TS中的 變量污染標(biāo)記替換運(yùn)些偽標(biāo)記,即得到集合S= {a@Ll,y@L2 ,m@L3, x@L6, z@L7,n@L4, x@L10, z@Ll I},其潛在污染集合為PTS = S-TS = {z@Ll I}。
[0070]
[0071] 步驟S4):根據(jù)多線程程序污點(diǎn)傳播語(yǔ)義將執(zhí)行路徑中狀態(tài)轉(zhuǎn)移、污染傳播、線程 交織關(guān)系轉(zhuǎn)化為無(wú)量詞一階邏輯表達(dá)式,構(gòu)建執(zhí)行路徑T的約束模型F,包括程序語(yǔ)義約束、 偏序關(guān)系約束、線程交織約束、污染傳播約束。整個(gè)約束模型F蘊(yùn)含了執(zhí)行路徑所有可能的 污染傳播序列。具體地,如圖2所示,按照W下步驟生成對(duì)應(yīng)的邏輯表達(dá)式:
[0072] S401):根據(jù)W下程序路徑T的SSA格式,將每一句表達(dá)式相與,則得到程序語(yǔ)義約 束。
[0073;
[0074] 其中,對(duì)于全局變量X與y的上角標(biāo)表示讀(r)或?qū)?W),下角標(biāo)區(qū)分不同的讀或?qū)?操作。
[0075] S402):構(gòu)建偏序關(guān)系約束:線程內(nèi)部時(shí)序關(guān)系,遵守順序一致性,如〇1<〇2表示 line 1在line 2之前發(fā)生。線程間的關(guān)系,本示例中僅有線程創(chuàng)建關(guān)系,例如〇3<〇p2表示 line 3發(fā)生被其創(chuàng)建線程的第一條語(yǔ)句。
[0076] (01 <02<03<04<0已)八(〇p2<〇6<〇7<〇8)八
[0077] (〇p3<〇10<〇ll) A〇3<〇p2 A〇4<〇p3
[0078] S403):構(gòu)建交織匹配約束,其如下所示:
[0079] :磅^注譽(yù)A :錢(qián).《抹沒(méi).心《襄杰瑣' A (巧 < 辦A (巧々 < 雌V巧々 > .持?)V
[0080]
[0081] S404):構(gòu)建污染傳播約束,按照左側(cè)路徑T的SSA格式,轉(zhuǎn)換為右側(cè)的污染傳播表 達(dá)式,將其相與,即得到污染傳播約束。如下所示:
[0082]
[0083] 步驟S5):由S3)可知,z@Lll為待驗(yàn)證變量,其被污染的條件表示為從F中去除分支 語(yǔ)句的表達(dá)式Z至
求解表達(dá)式
,結(jié)果可解,從其解中得到序列U, 2,3,6,7,8F,4,10,ll,5}。此序列即使得z@Lll被污染。
[0084] 步驟S6):從F中去除分支語(yǔ)句的表達(dá)式,即
,得到表達(dá)式戶。根據(jù)取反規(guī) 定,求解
,結(jié)果可解,,從其解中得出一個(gè)部分路徑調(diào)度序列S=U, 2,3,6,7, 4,5,8T}。按照此序列知道執(zhí)行,得到新路徑r = {1,2,3,6,7,4,5,8T,9,10,11}。對(duì)此路徑 從新驗(yàn)證,發(fā)現(xiàn)w@L9也會(huì)被污染。
[0085] 步驟S7):由于Line 8的分支兩側(cè)都被遍歷過(guò),已不再存在新路徑。則算法結(jié)束。
[0086] 總結(jié):本發(fā)明的方法,相比現(xiàn)有方法,在給定輸入下,可W檢測(cè)到其他交織下的污 染變量,也可W檢測(cè)到其他分支下的污染變量,在精度上有很明顯的提高。
【主權(quán)項(xiàng)】
1. 一種基于符號(hào)計(jì)算的動(dòng)態(tài)并行程序污點(diǎn)分析方法,其特征在于,包括如下步驟: 51) 執(zhí)行待測(cè)程序,以記錄程序的執(zhí)行路徑T; 52) 收集執(zhí)行路徑T上的污染變量,放入污染集合TS; 53) 計(jì)算執(zhí)行路徑T上的潛在污染變量,放入潛在污染集合PTS,所述潛在污染變量,即 與被污染變量有數(shù)值依賴(lài)關(guān)系,但是又沒(méi)有在執(zhí)行路徑T上被污染; 54) 根據(jù)多線程程序污染傳播語(yǔ)義,將執(zhí)行路徑T構(gòu)建為約束模型F,此模型為一階邏輯 表達(dá)式,且包括執(zhí)行路徑T上所有可能污染傳播路徑; 55) 構(gòu)建潛在污染集合PTS內(nèi)每一個(gè)變量pts的污染發(fā)生條件ppts,在約束模型F上驗(yàn)證 是否會(huì)被污染,利用約束求解器驗(yàn)證FAp Pts,如果可解表示存在某種交織使得pts被污染, 且將其放入污染集合TS;如果不可解,表示該變量在執(zhí)行路徑T的所有交織下都不會(huì)被污 染; 56) 針對(duì)執(zhí)行路徑T上的任一分支b,構(gòu)建其取反的條件Negate(b),利用約束求解器驗(yàn) 證FANegate(b)是否有解,如果有解,根據(jù)求解結(jié)果指導(dǎo)程序執(zhí)行出新路徑T new;如果不可 解,則驗(yàn)證下一分支; 57) 如果在給定輸入下,取反分支之后已不再形成新路徑,則停止算法,如果尚存在新 路徑,則繼續(xù)迭代。2. 根據(jù)權(quán)利要求1所述基于符號(hào)計(jì)算的動(dòng)態(tài)并行程序污點(diǎn)分析方法,其特征在于,所述 步驟S1)中,在符號(hào)執(zhí)行工具KLEE平臺(tái)內(nèi)執(zhí)行待測(cè)程序,以字節(jié)碼的粒度收集序列化的多線 程程序執(zhí)行路徑T。3. 根據(jù)權(quán)利要求1所述基于符號(hào)計(jì)算的動(dòng)態(tài)并行程序污點(diǎn)分析方法,其特征在于,所述 步驟S2)中,將輸入設(shè)定為污染源,對(duì)于一個(gè)語(yǔ)句,右邊變量如果被污染,那么左邊的變量就 會(huì)被污染,被污染的變量做上標(biāo)記,此污染標(biāo)記會(huì)隨著并行程序在特定交織下執(zhí)行而傳播, 收集被標(biāo)記的變量,放入污染集合TS。4. 根據(jù)權(quán)利要求3所述基于符號(hào)計(jì)算的動(dòng)態(tài)并行程序污點(diǎn)分析方法,其特征在于,所述 步驟S3)中,將程序中每一個(gè)線程中的全局變量訪問(wèn)點(diǎn)都作為污染源,并且做上偽污染標(biāo) 記,執(zhí)行過(guò)程中,在各自線程內(nèi)部傳播這些偽污染標(biāo)記,用步驟S2)中得到的真實(shí)污染標(biāo)記 結(jié)果,替換偽污染標(biāo)記,得到的集合為S,則潛在污染變量為在S中卻不在TS中的變量,表示 為 PTS = S-TS。5. 根據(jù)權(quán)利要求1所述基于符號(hào)計(jì)算的動(dòng)態(tài)并行程序污點(diǎn)分析方法,其特征在于,所述 步驟S4)中,約束模型F蘊(yùn)含了執(zhí)行路徑T所有可能的交織序列,包括四種約束:程序語(yǔ)義約 束、偏序關(guān)系約束、讀寫(xiě)關(guān)系約束以及污染傳播約束,定義分別如下: 1) 程序語(yǔ)義約束:描述線程內(nèi)部的定義-使用鏈,以及控制線程內(nèi)部狀態(tài)轉(zhuǎn)換; 2) 偏序關(guān)系約束:線程內(nèi)部語(yǔ)句之間的關(guān)系,采用順序一致性的語(yǔ)義;線程間語(yǔ)句的關(guān) 系,按照 create/ join、wait/signal、lock/unlock 的語(yǔ)義規(guī)定來(lái)構(gòu)建; 3) 交織匹配約束:定義線程間的定義-使用鏈,規(guī)定共享變量所讀取到的值,必須來(lái)自 初始值以及最近的寫(xiě)值;同時(shí),當(dāng)線程間有讀寫(xiě)時(shí),也要有對(duì)應(yīng)污染傳播。 4) 污染傳播約束:規(guī)定線程內(nèi)部變量的污染狀態(tài),確定其數(shù)據(jù)是來(lái)自被污染變量還是 未被污染變量; 其中,定義-使用鏈為:將每一個(gè)線程序列轉(zhuǎn)化為SSA格式,對(duì)于每一個(gè)SSA格式的執(zhí)行 序列,除去共享訪問(wèn)點(diǎn)都是一個(gè)完整的定義-使用鏈。6. 根據(jù)權(quán)利要求5所述基于符號(hào)計(jì)算的動(dòng)態(tài)并行程序污點(diǎn)分析方法,其特征在于,所述 步驟S4)中,約束模型F的構(gòu)建方法包括以下操作: 1) 計(jì)算程序語(yǔ)義約束Φ PS,以控制線程內(nèi)部狀態(tài)轉(zhuǎn)移; 2) 計(jì)算偏序關(guān)系約束ΦΡ。,以構(gòu)建線程間或線程內(nèi)語(yǔ)句之間可能的時(shí)序關(guān)系; 3) 計(jì)算交織匹配約束,以建立線程間的定義-使用鏈以及污染傳播的關(guān)系; 4) 計(jì)算污染傳播約束Φ tP,以線程內(nèi)部污染傳播的流程; 最后,結(jié)合以上四種約束,構(gòu)成約束模型F=〇psA〇P〇A〇imA〇tP。7. 根據(jù)權(quán)利要求6所述基于符號(hào)計(jì)算的動(dòng)態(tài)并行程序污點(diǎn)分析方法,其特征在于,定義 執(zhí)行路徑事件集合IE-mliXiSk},其中k為線程數(shù)量,…,e n}作為線程i的 執(zhí)行序列,en表示Ti的第η個(gè)事件,0(en)表示事件e n的順序,η表示Ti的事件數(shù)量,則: 所述程序語(yǔ)義約束的計(jì)算方法: 將每一個(gè)線程序列轉(zhuǎn)化為SSA格式,直接將SSA格式序列轉(zhuǎn)化為路徑表達(dá)式; 所述偏序關(guān)系約束為包括四種內(nèi)存模型 約束鎖同步約束Φ&/?/]、條件變量約束和線程創(chuàng)建結(jié)束約束其各自 計(jì)算方法為: 內(nèi)存模型約束:采用順序一致性模型,所有操作完全按程序的順序執(zhí)行,線程內(nèi)的事件 順序符合約束:其中&與&+1表示同一線程內(nèi)連續(xù)的兩個(gè)事件,τ表示所有線程序列; 鎖同步約束:l〇ck/unl〇ck操作的目的為構(gòu)建鎖同步語(yǔ)義約束,要求在同一互斥鎖的 lock/unlock集合L中,對(duì)于任意兩個(gè)lock/unlock事件對(duì):li/m與lk/uk,須滿足公式:其中,鎖對(duì)h/m要么發(fā)生在鎖對(duì)lk/uk之前,要么發(fā)生在其后; 條件變量約束:wait/signal操作的目的是構(gòu)建條件變量同步語(yǔ)義約束,要滿足條件: 每一個(gè)wait操作必須對(duì)應(yīng)一個(gè)signal操作,而一個(gè)signal操作至多喚醒一個(gè)wait操作,對(duì) 于同一條件變量cond,令WT作為在cond上所有wait操作的集合,令SG作為在cond上所有 signal操作的集合,如要滿足之上的條件,須有以下公式:其中,ewt為WT中的任一元素,SGwt表示ewt可以匹配的s i gna 1操作的集合,esg為SGwt中任 一signal操作事件,利用變量是否等于1來(lái)表示esg是否與ewt相匹配,子公式 1表示,對(duì)于每一個(gè)wait操作ewt必須有一個(gè)signal操作與之匹配; 線程創(chuàng)建結(jié)束約束:首先規(guī)定,如果事件創(chuàng)建一個(gè)線程,那么被創(chuàng)建線程的所有事件都 要在此事件之后執(zhí)行;如果事件執(zhí)行線程終止操作,那么被終止線程的所有事件都要在此 事件之前;令C為create/f ork操作的事件集合,令J作為join操作的事件集合;給定約束:其中,e。為線程創(chuàng)建事件,first(e。)為e。所創(chuàng)建的線程首個(gè)事件的順序;為線程終止 事件;last(ej)為^所終止的線程末尾事件的順序; 所述交織匹配約束的計(jì)算方法: 使共享變量的讀來(lái)自于最近的寫(xiě),對(duì)于同一共享變量V,令R作為所有對(duì)其進(jìn)行讀操作 的事件集合,令W作為所有對(duì)其進(jìn)行寫(xiě)操作的事件集合,給出以下公式:其中,er為讀事件,ew與ex為寫(xiě)事件,vr和v w為事件er與ew所操作的變量,公式所表達(dá)的意 思是,如果事件er中的vr取值來(lái)自于事件ew中的Vw,首先要滿足e r在ew之后,即0(ew)<0(er); 然后要滿足所有的寫(xiě)要么在之前,要么在e r之后;如果er中的取值來(lái)自于事件中的Vw, 那么的污染標(biāo)記也會(huì)傳播給Vr; 所述污染傳播約束的計(jì)算方法: 將每一個(gè)線程序列內(nèi)每一個(gè)變量v的污染標(biāo)記為v. tag,按照?qǐng)?zhí)行語(yǔ)句的句型直接轉(zhuǎn)換 為表達(dá),譬如,v = a OP b;那么對(duì)應(yīng)的污染傳播表達(dá)式為v.tag = a.tag or b.tag; 最終將以上四種約束相與構(gòu)成約束模型F。8. 根據(jù)權(quán)利要求7所述基于符號(hào)計(jì)算的動(dòng)態(tài)并行程序污點(diǎn)分析方法,其特征在于,所述 步驟S5)中,對(duì)于潛在污染集合PTS中任一變量pts,其污染標(biāo)記為pts · tag,則用pts · tag= 1 來(lái)表示pts被污染的情況,求解FApts . tag = 1;如果可解,表示pts可被污染;如果不可解, 表示pts不可以被污染。9. 根據(jù)權(quán)利要求1所述基于符號(hào)計(jì)算的動(dòng)態(tài)并行程序污點(diǎn)分析方法,其特征在于,所述 步驟S6)中利用現(xiàn)有約束模型尋找是否存在可取反的分支,首先,從約束模型F中去除所有 分支C對(duì)應(yīng)的表達(dá)式,得到F ',然后,對(duì)于C中的每一個(gè)分支c i,求解 P7 A -!〇 Λ - C),如果可解,表示其可被取反,其中0i表示^的時(shí)序。10. 根據(jù)權(quán)利要求1所述基于符號(hào)計(jì)算的動(dòng)態(tài)并行程序污點(diǎn)分析方法,其特征在于,所 述步驟S7)中判斷是否尚有新路徑,如果存在,則回到S2)繼續(xù)驗(yàn)證;否則,結(jié)束算法。
【文檔編號(hào)】G06F11/36GK105955877SQ201610243975
【公開(kāi)日】2016年9月21日
【申請(qǐng)日】2016年4月19日
【發(fā)明人】劉烴, 郝宇, 尹文浩, 張曉東, 劉沛, 樊浩涵, 鄭慶華
【申請(qǐng)人】西安交通大學(xué)