一種驗(yàn)證并發(fā)程序中違反原子性錯(cuò)誤是否被正確修復(fù)的方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明屬于軟件工程中程序分析與驗(yàn)證技術(shù)領(lǐng)域,尤其是并發(fā)軟件的分析與驗(yàn)證 領(lǐng)域;同時(shí)本發(fā)明亦屬于軟件工程中Bug修復(fù)驗(yàn)證領(lǐng)域。這些領(lǐng)域主要依托程序靜態(tài)、動(dòng)態(tài) 亦或動(dòng)靜態(tài)結(jié)合的程序分析技術(shù),對(duì)軟件的正確性、修復(fù)的正確性進(jìn)行驗(yàn)證。
【背景技術(shù)】
[0002] 隨著多核處理器的發(fā)展,并發(fā)程序,由于其高效性,廣受青睞。但是,并發(fā)程序由于 其通過(guò)不同線程間的通信,尤其是共享內(nèi)存通信來(lái)保證程序中不同線程間的一致性,很難 在編碼過(guò)程中不產(chǎn)生Bug,原子性錯(cuò)誤就是其中最主要的一類,約占所有并發(fā)錯(cuò)誤的2/3。
[0003] 原子性錯(cuò)誤有如下幾個(gè)模式,如表1,其中eiS事件,t i,iv分別為其所對(duì)應(yīng)的 線程、所存取的內(nèi)存位置及其存取類型,這些模式的完整性已得到了理論性的證明。
[0004] 表1 :原子性錯(cuò)誤的各種模式
【主權(quán)項(xiàng)】
1. 一種驗(yàn)證并發(fā)程序中違反原子性錯(cuò)誤是否被正確修復(fù)的方法,其特征是利用原始程 序執(zhí)行錯(cuò)誤時(shí)的執(zhí)行日志,結(jié)合原子性錯(cuò)誤的各種模式構(gòu)造新的、適合于修復(fù)后程序的執(zhí) 行日志,并通過(guò)觀察修復(fù)后的程序是否能夠按照新的日志正確執(zhí)行來(lái)判斷原子性錯(cuò)誤是否 被修復(fù),包括W下步驟: 1) 利用原始程序的錯(cuò)誤執(zhí)行日志W(wǎng)及修復(fù)后的程序,構(gòu)造與錯(cuò)誤執(zhí)行日志對(duì)應(yīng)同時(shí)又 包含修復(fù)信息的執(zhí)行軌跡,所述修復(fù)指同步化,所述修復(fù)信息指如何使用同步化來(lái)修復(fù)的 信息,一個(gè)執(zhí)行軌跡是一個(gè)事件序列,表示為5 = <61〉,其中每個(gè)事件e;包含下列屬性: ti;事件e,所屬的線程; nii;事件e;所存取的內(nèi)存位置; li;當(dāng)事件e i執(zhí)行時(shí),其所擁有的鎖; ai;事件e i的存取類型,包括讀,寫(xiě),獲取鎖,釋放鎖,等待,通知,創(chuàng)建線程和等待線程 結(jié)束8種類型; 2) 利用所得執(zhí)行軌跡,W及原子性錯(cuò)誤的不同模式,構(gòu)造適合于修復(fù)后程序的新執(zhí)行 軌跡: 21) 使用步驟1)所構(gòu)造的執(zhí)行軌跡,首先根據(jù)一個(gè)并發(fā)程序必須滿足的約束,即 Happens-Before關(guān)系和鎖約束構(gòu)造一個(gè)有向無(wú)環(huán)圖,該圖中包含執(zhí)行軌跡中的所有事件, 事件用圖的結(jié)點(diǎn)表示,且僅包含Happens-Before關(guān)系和鎖約束所要求的事件間順序關(guān)系, 順序關(guān)系用圖的有向邊表示; 22) 根據(jù)原子性錯(cuò)誤的各種模式,在步驟1)所構(gòu)造的執(zhí)行軌跡中捜索相應(yīng)的事件序 列; 23) 不斷的向有向無(wú)環(huán)圖中添加符合原子性錯(cuò)誤模式的邊,直到其不能滿足 Happens-Before關(guān)系和鎖約束,輸出一個(gè)新構(gòu)造的有向無(wú)環(huán)圖,判斷新構(gòu)造的有向無(wú)環(huán)圖 是否覆蓋所有滿足原子性錯(cuò)誤的模式的邊,如不能覆蓋,則構(gòu)造新的有向無(wú)環(huán)圖來(lái)覆蓋他 們,直到構(gòu)造得到的所有有向無(wú)環(huán)圖覆蓋所有滿足原子性錯(cuò)誤模式的邊; 24) 對(duì)于步驟23)中的每一個(gè)有向無(wú)環(huán)圖,繼續(xù)向其中加入有向無(wú)環(huán)圖不包含但原始 執(zhí)行軌跡包含的邊,直到不能滿足Happens-Before關(guān)系和鎖約束,最終輸出該圖的一個(gè)拓 撲排序,即一個(gè)新執(zhí)行軌跡; 3) 按照構(gòu)造的新執(zhí)行軌跡,執(zhí)行修復(fù)后的程序,觀察程序是否正常執(zhí)行來(lái)判斷原子性 錯(cuò)誤是否被修復(fù)。
2. 根據(jù)權(quán)利要求1所述的一種驗(yàn)證并發(fā)程序中違反原子性錯(cuò)誤是否被正確修復(fù)的方 法,其特征是步驟1)中,修復(fù)信息來(lái)自于用戶,根據(jù)修復(fù)信息對(duì)程序進(jìn)行插狀,構(gòu)造執(zhí)行軌 跡時(shí)包括W下操作: 11) 對(duì)每一個(gè)存取線程間共享內(nèi)存的指令,使用一個(gè)全局鎖進(jìn)行同步,并在其中記錄該 指令所對(duì)應(yīng)的執(zhí)行時(shí)事件的各種信息,即執(zhí)行軌跡; 12) 根據(jù)修復(fù)信息,使用條件判斷語(yǔ)句讓程序選擇性的跳過(guò)用于修復(fù)錯(cuò)誤所引入的指 令,使修復(fù)后的程序仍然能夠按照的錯(cuò)誤執(zhí)行日志執(zhí)行,從而記錄與的錯(cuò)誤執(zhí)行日志相對(duì) 應(yīng)的執(zhí)行軌跡; 13) 雖然跳過(guò)用于修復(fù)錯(cuò)誤所引入的鎖指令,在執(zhí)行程序構(gòu)造執(zhí)行軌跡時(shí),仍然記錄新 引入的鎖,使得執(zhí)行軌跡與原始的錯(cuò)誤執(zhí)行日志相對(duì)應(yīng),且包含修復(fù)信息。
3. 根據(jù)權(quán)利要求1所述的一種驗(yàn)證并發(fā)程序中違反原子性錯(cuò)誤是否被正確修復(fù)的方 法,其特征是步驟3)中,根據(jù)程序的控制流圖和所構(gòu)造的新執(zhí)行軌跡按照W下規(guī)則進(jìn)行啟 發(fā)式執(zhí)行,設(shè)e。是控制流圖中所指示的實(shí)際將要執(zhí)行的事件,e t是新執(zhí)行軌跡所指示的將 要執(zhí)行的事件: a) 若e濟(jì)e。不屬于相同線程,則阻塞正在運(yùn)行的線程,切換到e r所屬線程; b) 若e。與e t是同一事件,那么正常執(zhí)行,e t指向新執(zhí)行軌跡中的下一事件,執(zhí)行e。,同 時(shí)讓e。指向e t指向的下一將要執(zhí)行的事件; C)若e。與e,不是同一事件,但屬于同一線程: cl)控制流圖中存在e。到e t的路徑,執(zhí)行e。,不改變et; c2)控制流圖中不存在e。到e t的路徑,但e。存在于新執(zhí)行軌跡中e t之后,那么不做任 何執(zhí)行,e,指向新執(zhí)行軌跡中下一事件; c3)控制流圖中不存在e。到e t的路徑,e。也不存在于新執(zhí)行軌跡中e t之后,執(zhí)行e。, 指向新執(zhí)行軌跡中的下一事件。
4. 根據(jù)權(quán)利要求1所述的一種驗(yàn)證并發(fā)程序中違反原子性錯(cuò)誤是否被正確修復(fù)的方 法,其特征是步驟23)中為了提高算法效率,采用W下3種無(wú)損優(yōu)化方法W及2種有損優(yōu)化 方法中的一種或多種,所述無(wú)損優(yōu)化方法指不影響算法正確性的優(yōu)化方法,有損優(yōu)化方法 指會(huì)影響正確性的優(yōu)化方法: 無(wú)損優(yōu)化1 ;由于事件順序關(guān)系的傳遞性,一條邊實(shí)際蘊(yùn)含了一組順序關(guān)系,該些順序 關(guān)系不再需要通過(guò)顯式的向圖中加入邊,減少該些邊從而減少所需覆蓋的滿足原子性錯(cuò)誤 的模式的邊; 無(wú)損優(yōu)化2; -次向有向無(wú)環(huán)圖中加入多條滿足原子性錯(cuò)誤的模式的邊,測(cè)試其是否 滿足有向無(wú)環(huán)圖應(yīng)該滿足的約束,若不滿足,則進(jìn)行回滾,即將該些邊去除,若滿足則一條 一條的加入有向無(wú)環(huán)圖; 無(wú)損優(yōu)化3 ;算法并行化;在步驟23)開(kāi)始時(shí),同時(shí)開(kāi)啟多個(gè)線程,同時(shí)通過(guò)覆蓋不同的 邊構(gòu)造不同的新執(zhí)行軌跡來(lái)快速覆蓋所有的滿足原子性錯(cuò)誤的模式的邊; 有損優(yōu)化1 ;從所需覆蓋的滿足原子性錯(cuò)誤模式的邊中,去除那些對(duì)應(yīng)相同源碼語(yǔ)句, 但不同事件的,滿足原子性錯(cuò)誤模式的邊; 有損優(yōu)化2 ;按照原子集預(yù)測(cè)法來(lái)預(yù)測(cè)原子集,W減少所需覆蓋的滿足多變量原子性 錯(cuò)誤模式的邊。
【專利摘要】一種驗(yàn)證并發(fā)程序中違反原子性錯(cuò)誤是否被正確修復(fù)的方法,利用原始程序執(zhí)行錯(cuò)誤時(shí)的執(zhí)行日志,結(jié)合原子性錯(cuò)誤的各種模式構(gòu)造新的、適合于修復(fù)后程序的執(zhí)行日志,并通過(guò)觀察修復(fù)后的程序是否能夠按照新的日志正確執(zhí)行來(lái)判斷原子性錯(cuò)誤是否被修復(fù)。用戶在并發(fā)程序出錯(cuò)后,使用同步化方法修復(fù)原子性錯(cuò)誤,本發(fā)明方法能夠幫助用戶在重復(fù)執(zhí)行修復(fù)程序若干次后自動(dòng)判斷bug是否被正確修復(fù)。本發(fā)明方法不要求用戶知道Bug的準(zhǔn)確位置,符合用戶檢驗(yàn)錯(cuò)誤是否被修復(fù)的習(xí)慣性方法。
【IPC分類】G06F11-36
【公開(kāi)號(hào)】CN104536878
【申請(qǐng)?zhí)枴緾N201410709983
【發(fā)明人】徐寶文, 周駿貴, 時(shí)清凱, 陳振宇, 張馳, 濮力, 程秀才, 謝佩章, 王婧宇
【申請(qǐng)人】南京大學(xué), 江蘇蘇測(cè)軟件檢測(cè)技術(shù)有限公司
【公開(kāi)日】2015年4月22日
【申請(qǐng)日】2014年11月28日