欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種基于Java并發(fā)程序錯(cuò)誤的不變式檢測(cè)系統(tǒng)的制作方法

文檔序號(hào):6373856閱讀:193來(lái)源:國(guó)知局
專利名稱:一種基于Java并發(fā)程序錯(cuò)誤的不變式檢測(cè)系統(tǒng)的制作方法
技術(shù)領(lǐng)域
本發(fā)明屬于程序錯(cuò)誤檢測(cè)技術(shù)領(lǐng)域,具體涉及一種針對(duì)Java并發(fā)程序錯(cuò)誤的檢測(cè)系統(tǒng)。
背景技術(shù)
隨著計(jì)算機(jī)多核技術(shù)的發(fā)展,Java多線程技術(shù)的優(yōu)勢(shì)體現(xiàn)的越來(lái)越明顯。多線程技術(shù)不僅能夠提高程序的運(yùn)行效率,還能提高程序的實(shí)時(shí)響應(yīng)性,從而提升用戶體驗(yàn),目前推出的軟件產(chǎn)品大多以多線程的方式實(shí)現(xiàn)。然而,多線程技術(shù)在為程序帶來(lái)這些優(yōu)勢(shì)的同時(shí),由于其編寫時(shí)的復(fù)雜性和執(zhí)行時(shí)的不確定性,也給程序員帶來(lái)了新的挑戰(zhàn)。在程序編寫時(shí),程序員需要額外地對(duì)各個(gè)線程中的工作進(jìn)行同步管理,保持?jǐn)?shù)據(jù)的一致性,否則就可能引發(fā)程序并發(fā)錯(cuò)誤,會(huì)對(duì)軟件的質(zhì)量造成重大影響,并且這類錯(cuò)誤較難被檢測(cè)和修復(fù)。
為了統(tǒng)一地檢測(cè)程序中多種類型的并發(fā)錯(cuò)誤,一系列基于不變式的檢測(cè)工具被提出。這類工具首先制定相應(yīng)的不變式規(guī)則來(lái)代表可能產(chǎn)生并發(fā)錯(cuò)誤的程序行為,然后通過(guò)一定數(shù)量的訓(xùn)練運(yùn)行提取滿足不變式的所有正確程序行為,最后以收集到的信息指導(dǎo)檢測(cè)運(yùn)行時(shí)的并發(fā)錯(cuò)誤檢查。不變式檢測(cè)方法作為目前最為有效的并發(fā)錯(cuò)誤檢測(cè)手段,以提取正確程序行為的方式自動(dòng)識(shí)別程序并發(fā)錯(cuò)誤,較之傳統(tǒng)的分析方法在精度和效率上都有一定的優(yōu)勢(shì)。但現(xiàn)有的不變式檢測(cè)工具主要為C/C++語(yǔ)言設(shè)計(jì),未考慮Java的程序特性。傳統(tǒng)的不變式檢測(cè)工具以上下文不敏感的信息來(lái)區(qū)分不同程序點(diǎn),該信息一般為靜態(tài)指令(例如,方法名和文件行號(hào)的組合)。但是由于Java中大量的包裝函數(shù),程序中大量的訪存操作被封裝在包裝函數(shù)中,其中最為典型的就是程序中的getter和setter函數(shù)了。如果繼續(xù)沿用靜態(tài)指令來(lái)區(qū)分程序點(diǎn),調(diào)用相同包裝函數(shù)的不同訪存操作都被認(rèn)為是同一程序點(diǎn),這樣可能會(huì)誤導(dǎo)檢測(cè)工具最終檢測(cè)結(jié)果的正確性。以一個(gè)極端的情況為例,私有字段只能通過(guò)getter來(lái)讀取,通過(guò)setter來(lái)修改,那么傳統(tǒng)的工具會(huì)認(rèn)為所有調(diào)用這兩個(gè)函數(shù)的程序點(diǎn)都是相同的,這樣顯然是不精確的。如圖I所示,兩端程序是相同含義的C++和Java的程序片段,且S2語(yǔ)句應(yīng)該在S3語(yǔ)句執(zhí)行完后被執(zhí)行,否則會(huì)造成錯(cuò)誤。對(duì)于C++程序,使用訪存操作的靜態(tài)語(yǔ)句能分析出S36S2是正確依賴,而S16S2則是錯(cuò)誤依賴,這樣在檢測(cè)運(yùn)行時(shí)就能檢測(cè)出這一錯(cuò)誤。但是Java程序中由于封裝函數(shù)的存在,訪存操作都被包含在封裝函數(shù)中,無(wú)論是正確依賴還是錯(cuò)誤依賴都是S46S5,由于無(wú)法區(qū)分正確和錯(cuò)誤依賴,所以這一并發(fā)錯(cuò)誤就無(wú)法被檢測(cè)出來(lái)。簡(jiǎn)單地說(shuō),上下文不敏感的信息不足以區(qū)分Java程序中的訪存程序點(diǎn),使用靜態(tài)語(yǔ)句表示程序點(diǎn)不能滿足Java程序檢測(cè)的要求,而上下文敏感的技術(shù)則為Java程序的不變式檢測(cè)帶來(lái)了新的機(jī)會(huì)。

發(fā)明內(nèi)容
為了解決上述提到的Java程序中的封裝函數(shù)導(dǎo)致傳統(tǒng)工具無(wú)法有效區(qū)分程序點(diǎn)的問(wèn)題,本發(fā)明提供一種基于Java并發(fā)程序錯(cuò)誤的不變式檢測(cè)系統(tǒng)。
本發(fā)明在動(dòng)態(tài)運(yùn)行時(shí)對(duì)程序的上下文信息進(jìn)行記錄,并為每個(gè)帶有上下文信息的程序點(diǎn)收集和檢測(cè)程序并發(fā)錯(cuò)誤,以此消除因封裝函數(shù)所帶來(lái)的程序點(diǎn)無(wú)法區(qū)分的影響。本發(fā)明提供了一種基于Java并發(fā)程序錯(cuò)誤的不變式檢測(cè)系統(tǒng),包括預(yù)處理模塊、不變式訓(xùn)練模塊、不變式文件分析模塊,不變式檢測(cè)模塊,錯(cuò)誤排序刪減模塊以及上下文收集傳遞模塊六大模塊;所述上下文收集傳遞模塊與所述不變式訓(xùn)練模塊以及所述不變式檢測(cè)模塊同時(shí)運(yùn)行,在動(dòng)態(tài)運(yùn)行時(shí)所述上下文收集傳遞模塊將當(dāng)前的上下文信息進(jìn)行轉(zhuǎn)換,傳遞給所述不變式訓(xùn)練模塊或所述不變式檢測(cè)模塊;所述不變式訓(xùn)練模塊或不變式檢測(cè)模塊使用接收到的上下文信息連同靜態(tài)語(yǔ)句來(lái)表示一個(gè)唯一的程序點(diǎn)。其中
I.預(yù)處理模塊,負(fù)責(zé)檢測(cè)和過(guò)濾程序中不會(huì)引起并發(fā)錯(cuò)誤的對(duì)象。這樣的對(duì)象有兩類,分別是局部對(duì)象和單賦值對(duì)象。本發(fā)明通過(guò)靜態(tài)分析找出這些對(duì)象,并在字節(jié)碼中添加標(biāo)簽進(jìn)行標(biāo)示。在訓(xùn)練和檢測(cè)運(yùn)行階段,本發(fā)明識(shí)別這些標(biāo)簽,并忽略對(duì)有標(biāo)簽對(duì)象的檢查和記錄,從而降低檢測(cè)所帶來(lái)的開銷。

2.不變式訓(xùn)練模塊,使用多次訓(xùn)練運(yùn)行,基于對(duì)象粒度提取程序中的不變式信息,并將收集的不變式集合以文件形式進(jìn)行保存,每次正確運(yùn)行產(chǎn)生一個(gè)不變式記錄文件。3.文件分析模塊,負(fù)責(zé)把所有記錄文件中的信息按照不變式規(guī)則進(jìn)行歸并,最終合成一個(gè)文件。4.不變式檢測(cè)模塊,利用合成文件指導(dǎo)檢測(cè)運(yùn)行。當(dāng)檢測(cè)運(yùn)行中的程序行為與記錄中的對(duì)象不變式信息出現(xiàn)矛盾時(shí),說(shuō)明可能存在并發(fā)錯(cuò)誤,需要進(jìn)一步分析。5.錯(cuò)誤排序刪減模塊,負(fù)責(zé)對(duì)檢測(cè)模塊檢測(cè)到的程序錯(cuò)誤做可信性分析。該模塊使用啟發(fā)式算法,為所有檢測(cè)到的錯(cuò)誤計(jì)算相應(yīng)的可信值。刪除可信值較低的錯(cuò)誤,其他篩選得到的錯(cuò)誤經(jīng)過(guò)排序后反饋給程序員。6.上下文收集傳遞模塊,用于在動(dòng)態(tài)運(yùn)行時(shí)以一定的方式記錄和傳遞當(dāng)前的上下文信息。上下文收集傳遞模塊與不變式訓(xùn)練模塊以及不變式檢測(cè)模塊同時(shí)運(yùn)行,在動(dòng)態(tài)運(yùn)行時(shí)上下文收集傳遞模塊將當(dāng)前的上下文信息進(jìn)行轉(zhuǎn)換,傳遞給不變式訓(xùn)練模塊或不變式檢測(cè)模塊;
不變式訓(xùn)練模塊或不變式檢測(cè)模塊使用接收到的上下文信息連同靜態(tài)語(yǔ)句來(lái)表示一個(gè)唯一的程序點(diǎn);
上下文收集傳遞模塊與在訓(xùn)練和檢測(cè)運(yùn)行中同一程序點(diǎn)上的上下文信息保持一致。本發(fā)明中,上下文收集傳遞模塊記錄和傳遞當(dāng)前的上下文信息時(shí)可采用PCC模式,即利用程序當(dāng)前行號(hào)和當(dāng)前調(diào)用棧的信息連續(xù)地使用哈希函數(shù)進(jìn)行計(jì)算,通過(guò)計(jì)算出的值來(lái)表示當(dāng)前程序點(diǎn)的上下文內(nèi)容,用公式表達(dá)為
p = f{p, c) = (3/3 十 c) mod 264 ⑴
其中p*表示被調(diào)用函數(shù)中某個(gè)程序位置的上下文哈希值的數(shù)值,P表示調(diào)用函數(shù)的上下文哈希值,c表示在當(dāng)前函數(shù)中的位置信息。PCC模式具體計(jì)算過(guò)程是通過(guò)從上至下的方式展開的,即表示上下文的哈希值P會(huì)從調(diào)用函數(shù)向被調(diào)用函數(shù)傳遞并進(jìn)行相應(yīng)的計(jì)算。PCC模式中的計(jì)算起點(diǎn)函數(shù)包括1)程序的main函數(shù);2)程序中所有繼承了java. lang. Thread類和java. lang. Runnable類中所聲明的run函數(shù)。這些起點(diǎn)函數(shù)都是程序中所有線程的入口 ;具體實(shí)現(xiàn)中為了使不同運(yùn)行中相同下上文環(huán)境具有相同的PCC值,PCC模式下把所有起點(diǎn)函數(shù)的PCC值初始化為O。本發(fā)明中,PCC方法能簡(jiǎn)單地通過(guò)比較PCC值,達(dá)到區(qū)分程序中的上下文環(huán)境的目的,不對(duì)程序的運(yùn)行帶來(lái)過(guò)大的性能影響;并且在不同的運(yùn)行中,相同的上下文環(huán)境能匹配相同的PCC值。本發(fā)明中,上下文收集傳遞模塊記錄和傳遞當(dāng)前的上下文信息時(shí)還可采用PaCC方法,其也以計(jì)算哈希值的方式來(lái)表示當(dāng)前程序調(diào)用棧的信息。其記錄從調(diào)用棧底向上到真正調(diào)用封裝函數(shù)的位置。PaCC模式下計(jì)算的程序點(diǎn)哈希值依賴于當(dāng)前上下文窗口中siz印個(gè)程序點(diǎn)的信息,包括它們的文件名字符串哈希值(C),文件行號(hào)(h)。哈希值由上下文窗口由下至上計(jì)算,計(jì)算sizep次,其計(jì)算公式為
權(quán)利要求
1.一種基于Java并發(fā)程序錯(cuò)誤的不變式檢測(cè)系統(tǒng),包括預(yù)處理模塊、不變式訓(xùn)練模塊、不變式文件分析模塊,不變式檢測(cè)模塊,錯(cuò)誤排序刪減模塊,其特征在于還包括上下文收集傳遞模塊;所述上下文收集傳遞模塊與所述不變式訓(xùn)練模塊以及所述不變式檢測(cè)模塊同時(shí)運(yùn)行,在動(dòng)態(tài)運(yùn)行時(shí)所述上下文收集傳遞模塊將當(dāng)前的上下文信息進(jìn)行轉(zhuǎn)換,傳遞給所述不變式訓(xùn)練模塊或所述不變式檢測(cè)模塊;所述不變式訓(xùn)練模塊或不變式檢測(cè)模塊使用接收到的上下文信息連同靜態(tài)語(yǔ)句來(lái)表示一個(gè)唯一的程序點(diǎn)。
2.根據(jù)權(quán)利要求I所述的不變式檢測(cè)系統(tǒng),其特征在于所述上下文收集傳遞模塊記錄和傳遞當(dāng)前的上下文信息時(shí)采用PCC模式,即利用程序當(dāng)前行號(hào)和當(dāng)前調(diào)用棧的信息連續(xù)地使用哈希函數(shù)進(jìn)行計(jì)算,通過(guò)計(jì)算出的值來(lái)表示當(dāng)前程序點(diǎn)的上下文內(nèi)容,用公式表達(dá)為 P = i{Pf c) = (3p + c) mod 204 ⑴ 其中P*表示被調(diào)用函數(shù)中某個(gè)程序位置的上下文哈希值的數(shù)值,P表示調(diào)用函數(shù)的上下文哈希值,c表示在當(dāng)前函數(shù)中的位置信息; 所述PCC模式具體計(jì)算過(guò)程是通過(guò)從上至下的方式展開的,即表示上下文的哈希值P會(huì)從調(diào)用函數(shù)向被調(diào)用函數(shù)傳遞并進(jìn)行相應(yīng)的計(jì)算; 所述PCC模式中的計(jì)算起點(diǎn)函數(shù)包括1)程序的main函數(shù),2)程序中所有繼承了java. lang. Thread 類和 java. lang. Runnable 類中所聲明的 run 函數(shù); 所述PCC模式下,所有起點(diǎn)函數(shù)的PCC值初始化為O。
3.根據(jù)權(quán)利要求I所述的不變式檢測(cè)系統(tǒng),其特征在于所述上下文收集傳遞模塊記錄和傳遞當(dāng)前的上下文信息時(shí)采用PaCC模式,其用計(jì)算哈希值的方式來(lái)表示當(dāng)前程序調(diào)用棧的信息,其記錄從調(diào)用棧底向上到真正調(diào)用封裝函數(shù)的位置,PaCC模式下計(jì)算的程序點(diǎn)哈希值由上下文窗口由下至上計(jì)算,計(jì)算sizep次,其計(jì)算公式為 Pg =c, Ii) = (13ρa(bǔ) + Sc + h) mod 2 ^⑵ 其中Pa*表示被調(diào)用函數(shù)中某個(gè)程序位置的上下文哈希值的數(shù)值,Pa表示調(diào)用函數(shù)的上下文哈希值,c表示文件名字符串哈希值,h表示文件行號(hào); 其中所述sizep表示上下文窗口的大小,其大于或等于當(dāng)前封裝方法的棧深度depthw加1,即 sizep >= depthw+I (3) 。
4.根據(jù)權(quán)利要求3所述的不變式檢測(cè)系統(tǒng),其特征在于所述上下文窗口的大小sizep為4。
全文摘要
本發(fā)明屬于程序錯(cuò)誤檢測(cè)技術(shù)領(lǐng)域,具體為一種基于Java并發(fā)程序錯(cuò)誤的不變式檢測(cè)系統(tǒng)。其包括預(yù)處理模塊、不變式訓(xùn)練模塊、不變式文件分析模塊,不變式檢測(cè)模塊,錯(cuò)誤排序刪減模塊及上下文收集傳遞模塊六大模塊;本發(fā)明在在動(dòng)態(tài)運(yùn)行時(shí)以PaCC及PCC模式對(duì)程序的上下文信息進(jìn)行記錄,解決了Java程序中的封裝函數(shù)導(dǎo)致傳統(tǒng)工具無(wú)法有效區(qū)分程序點(diǎn)的問(wèn)題。
文檔編號(hào)G06F11/36GK102799527SQ201210236250
公開日2012年11月28日 申請(qǐng)日期2012年7月10日 優(yōu)先權(quán)日2012年7月10日
發(fā)明者楊珉, 王笛 申請(qǐng)人:復(fù)旦大學(xué)
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
龙泉市| 拉萨市| 陕西省| 嵊州市| 沂水县| 开远市| 湘乡市| 太湖县| 海城市| 垫江县| 都昌县| 鹤峰县| 黄冈市| 日喀则市| 尤溪县| 卢氏县| 原阳县| 临沂市| 花莲市| 怀集县| 崇明县| 前郭尔| 临江市| 武鸣县| 临安市| 郯城县| 湖口县| 闸北区| 郑州市| 民和| 哈尔滨市| 稻城县| 丹江口市| 图片| 滕州市| 海阳市| 延庆县| 文安县| 体育| 崇信县| 赫章县|