專(zhuān)利名稱(chēng):基于代碼查詢(xún)進(jìn)行源代碼插樁的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)程序動(dòng)態(tài)分析,主要涉及一種基于代碼查詢(xún)的插樁方法。
背景技術(shù):
程序分析通常利用靜態(tài)程序分析和動(dòng)態(tài)程序分析對(duì)程序行為進(jìn)行自動(dòng)分析,進(jìn)而提高軟件質(zhì)量。動(dòng)態(tài)程序分析常借助于插樁方法來(lái)收集程序動(dòng)態(tài)運(yùn)行行為,某些與運(yùn)行環(huán)境相關(guān)的程序行為只能通過(guò)插樁來(lái)收集,而靜態(tài)程序分析無(wú)法進(jìn)行分析。軟件開(kāi)發(fā)過(guò)程中, 代碼審查者在代碼編寫(xiě)階段完成后使用源代碼插樁方法對(duì)代碼進(jìn)行審查,通常審查者擁有閱讀源代碼權(quán)限但不便對(duì)代碼進(jìn)行修改。通過(guò)對(duì)程序運(yùn)行行為的分析盡早發(fā)現(xiàn)代碼中的錯(cuò)誤,進(jìn)而提高軟件質(zhì)量。源代碼插樁能夠充分地利用程序語(yǔ)義、可視化地顯示插樁代碼、并且不會(huì)提高代碼邏輯復(fù)雜性。程序插樁技術(shù),是在保證被測(cè)程序原有邏輯完整性的基礎(chǔ)上在程序中插入一些探針,通過(guò)探針的執(zhí)行并拋出程序運(yùn)行的特征數(shù)據(jù),通過(guò)對(duì)這些數(shù)據(jù)的分析,可以獲得程序的控制流和數(shù)據(jù)流信息,進(jìn)而得到邏輯覆蓋等動(dòng)態(tài)信息,從而實(shí)現(xiàn)測(cè)試目的的方法。由于程序插樁技術(shù)是在被測(cè)程序中插入探針,然后通過(guò)探針的執(zhí)行來(lái)獲得程序的控制流和數(shù)據(jù)流信息,以此來(lái)實(shí)現(xiàn)測(cè)試的目的。因此,根據(jù)探針插入的時(shí)間可以分為目標(biāo)代碼插樁和源代碼插樁。現(xiàn)有插樁方法主要包括斷言機(jī)制、字節(jié)碼插樁、面向方面插樁等三類(lèi)方法。斷言機(jī)制直接在寫(xiě)源文件中添加插樁代碼,將會(huì)降低代碼閱讀性。字節(jié)碼插樁則直接對(duì)字節(jié)碼文件進(jìn)行修改,被插字節(jié)碼的源代碼無(wú)法可視化,且無(wú)法保證代碼插入過(guò)程的正確性。面向方面插樁在程序縱向繼承關(guān)系的基礎(chǔ)上增加了橫向方面關(guān)系,增加了程序的邏輯復(fù)雜性。目前插樁技術(shù)主要存在的瓶頸主要有插樁點(diǎn)及其代碼非可視化、插樁點(diǎn)自動(dòng)定位困難、難以做到插樁語(yǔ)句上下文敏感、自動(dòng)插樁性能較低的問(wèn)題。代碼查詢(xún)技術(shù)在軟件設(shè)計(jì)有著十分重要的地位。一些查詢(xún)工具被設(shè)計(jì)用于幫助程序員理解程序中大量經(jīng)常變化和復(fù)雜的關(guān)系。目前,代碼查詢(xún)技術(shù)已經(jīng)被廣泛的用于軟件代碼查詢(xún)技術(shù)在軟件分析和測(cè)試工作中發(fā)揮著重要的作用,在軟件架構(gòu)分析,逆向工程,一致性驗(yàn)證,代碼審查等方面都有廣泛的應(yīng)用。從另一方面看,代碼查詢(xún)已經(jīng)延伸至系統(tǒng)框架錯(cuò)誤檢測(cè),識(shí)別重構(gòu)可能,定位項(xiàng)目缺陷,查詢(xún)橫切關(guān)注點(diǎn),監(jiān)測(cè)開(kāi)發(fā)過(guò)程,評(píng)估設(shè)計(jì)適量, 跟蹤冗余依賴(lài)條件等等。通常插樁過(guò)程分兩步進(jìn)行(1)定位插樁語(yǔ)句將要插入的位置(2) 構(gòu)建插樁語(yǔ)句。目前插樁技術(shù)主要存在的瓶頸主要有插樁點(diǎn)及其代碼非可視化、插樁點(diǎn)自動(dòng)定位困難、難以做到插樁語(yǔ)句上下文敏感、自動(dòng)插樁性能較低的問(wèn)題。
發(fā)明內(nèi)容
本發(fā)明目的是,鑒于上述問(wèn)題,本發(fā)明旨在提供一個(gè)源代碼插樁方法,該方法結(jié)合代碼查詢(xún)技術(shù),有效的將代碼查詢(xún)得到的插樁位置以及上下文內(nèi)容與插樁機(jī)制相結(jié)合在一起。
本發(fā)明是通過(guò)以下的技術(shù)方案實(shí)現(xiàn)的無(wú)痕可管理的源代碼手動(dòng)定義標(biāo)志插樁方法
步驟10 打開(kāi)一個(gè)工程(程序);
步驟11 通過(guò)在JSearch編輯器里輸入相應(yīng)的插樁命令; 步驟12 工具運(yùn)行Jkarch命令,得到所有的插樁點(diǎn)定義
步驟13 審查所有插樁點(diǎn)的定義若發(fā)現(xiàn)帶有錯(cuò)誤的插樁點(diǎn),則進(jìn)入步驟14對(duì)其進(jìn)行修改;沒(méi)有發(fā)現(xiàn)帶有錯(cuò)誤的插樁點(diǎn),則直接進(jìn)入步驟15 ; 步驟14 修改插樁的定義至正確; 步驟15 將插樁點(diǎn)與原源文件合并生成新源文件; 其中步驟11和步驟12所使用的JSearch命令符合下面的語(yǔ)法規(guī)范 S ; = find Id:T satisfying CS IS T : = object
statement method class interface
CS ; = {exist Id:T}{all Id:T} where CE CE = CE && CE CE I I CE !CE (CE)
Id. Att=' value' Id Rel Id Att : = name
dataType specificType returnType paramsType Rel : = extend use
change
isln
call
IS := insert before Id IN insert after Id IN IS
IN := "STR〃 STR := STR String STR STR %Att% STRNULL
查詢(xún)命令S以關(guān)鍵字find開(kāi)始,后跟一個(gè)Id: T的聲明格式,再接satisfying關(guān)鍵字, 最后以條件語(yǔ)句CS結(jié)尾。它的含義是要查詢(xún)滿足查詢(xún)條件CS的T類(lèi)型的程序元素。語(yǔ)法規(guī)則中的T是指程序元素的類(lèi)型,它可以是object、statement、function、 interface和class的其中之一,分別對(duì)應(yīng)于變量、語(yǔ)句、方法、接口和類(lèi)。Id:T聲明了一個(gè)類(lèi)型為T(mén),別名為Id的元素。Id作為它聲明元素的別名在之后的查詢(xún)條件表達(dá)式CE中被使用。在條件表達(dá)式中出現(xiàn)的Id必須先被聲明,并且同名的Id不能被重復(fù)聲明,以免混淆。 緊跟在關(guān)鍵字find之后聲明的Id就對(duì)應(yīng)于查詢(xún)目標(biāo)元素。條件語(yǔ)句CS描述的是目標(biāo)元素需要滿足的查詢(xún)條件。它的語(yǔ)法規(guī)則在形式上符合帶量詞的一階謂詞的公式,具體含義是存在Tll類(lèi)型的元素Idll、T12類(lèi)型的元素 Idl2……,且對(duì)任一 T21類(lèi)型的元素Id21、T22類(lèi)型的元素Id22……,使得條件表達(dá)式CE成立。其中,Idli (i=l,2…)是緊跟關(guān)鍵字exist之后的元素的別名,并且它聲明的類(lèi)型為 Tli:Id2j (j=l,2…)是緊跟關(guān)鍵字all之后的元素別名,并且它聲明的類(lèi)型為T(mén)2j。條件表達(dá)式CE是一個(gè)布爾邏輯表達(dá)式,支持與(‘&&’)、或(‘ I I ’)、非(‘ ! ’) 的邏輯運(yùn)算符。用戶(hù)還可以通過(guò)在條件表達(dá)式中添加括號(hào)’(‘和’)’,來(lái)改變運(yùn)算符的運(yùn)算先后次序。可以看到,在有關(guān)CE的語(yǔ)法規(guī)則中有兩個(gè)條件表達(dá)式Id. Att=’ value’和Id Rel Id,它們是結(jié)構(gòu)最簡(jiǎn)單的條件表達(dá)式,本文把這兩個(gè)表達(dá)式稱(chēng)作原子表達(dá)式。任何一個(gè)條件表達(dá)式都是在一個(gè)或多個(gè)原子表達(dá)式的基礎(chǔ)上添加與&&、或11、非!以及括號(hào)(和)等運(yùn)算符拼接而成的。其中,Id. Att=’value’稱(chēng)為屬性條件表達(dá)式,本文規(guī)定如果元素Id的Att 屬性的屬性值等于value,則表達(dá)式的值為T(mén)rue ;否則表達(dá)式的值為i^ilse。Idl Rel Id2 稱(chēng)為關(guān)系條件表達(dá)式,規(guī)定如果元素Idl與Id2間存在關(guān)系Rel,則表達(dá)式的值為T(mén)rue,否則表達(dá)式的值為i^alse。下表定義了針對(duì)不同的程序元素定義了一系列的屬性(表1),同時(shí)也定義了元素間的一系列關(guān)系(表2)。 表格1程序元素的屬性
權(quán)利要求
1.一種基于代碼查詢(xún)進(jìn)行源代碼插樁的方法,其特征是包括步驟 步驟10 打開(kāi)一個(gè)或多個(gè)工程(程序);步驟11 通過(guò)在Jkarch命令編輯器里輸入相應(yīng)的JSearch插樁命令; 步驟12 工具運(yùn)行Jkarch命令,得到所有的插樁點(diǎn)定義;步驟13 審查所有插樁點(diǎn)的定義若發(fā)現(xiàn)帶有錯(cuò)誤的插樁點(diǎn),則進(jìn)入步驟14對(duì)其進(jìn)行修改;沒(méi)有發(fā)現(xiàn)帶有錯(cuò)誤的插樁點(diǎn),則直接進(jìn)入步驟15 ; 步驟14 修改插樁的定義至正確; 步驟15 將插樁點(diǎn)與原源文件合并生成新源文件。
2.根據(jù)權(quán)利要求1所述的基于代碼查詢(xún)進(jìn)行源代碼插樁的方法,其特征是所述的輸入 JSearch插樁命令即步驟11中,其中輸入相應(yīng)的Jkarch插樁命令過(guò)程包括步驟30 打開(kāi)JSearch命令編輯器;步驟31 判斷是否需要在工程中的源文件上定義插樁點(diǎn),如果是,則跳轉(zhuǎn)到步驟32,如果不是,則跳轉(zhuǎn)到步驟35;步驟32 按照J(rèn)karch命令語(yǔ)法規(guī)則給出目標(biāo)插樁點(diǎn)位置的JSearch命令描述; 步驟33 按照J(rèn)karch命令語(yǔ)法規(guī)則給出目標(biāo)插樁點(diǎn)插樁語(yǔ)句的模板描述; 步驟34 將步驟32和步驟33得到的命令描述和模板描述的字符串輸入到JSearch命令編輯器中;步驟35:結(jié)束本次插樁定義。
3.根據(jù)權(quán)利要求1所述的基于代碼查詢(xún)進(jìn)行源代碼插樁的方法,其特征是運(yùn)行 Jkarch插樁命令即步驟12,其中運(yùn)行相應(yīng)的Jkarch插樁命令、得到所有的插樁點(diǎn)定義過(guò)程包括步驟40 從JSearch命令編輯器中獲得JSearch命令字符串,即命令描述和模板描述的字符串;步驟41 從已經(jīng)打開(kāi)工程中的Java源代碼中生成相應(yīng)的代碼信息,這些代碼信息包括類(lèi)、接口、方法、對(duì)象和語(yǔ)句信息;步驟42 對(duì)步驟40中得到的JSearch命令字符串進(jìn)行語(yǔ)法檢測(cè)和預(yù)處理得到檢索指令;步驟43 按照檢索指令在步驟41中得到的代碼信息中進(jìn)行目標(biāo)元素檢索,得到相應(yīng)的目標(biāo)元素集合和相應(yīng)的輔助元素集合構(gòu)成的元素屬性值;步驟44 將JSearch命令中插樁模板的參數(shù)替換成步驟43中的元素屬性值,得到相應(yīng)的插樁語(yǔ)句集合;步驟45 將步驟44中得到的插樁語(yǔ)句集合生成相應(yīng)的插樁點(diǎn)。
4.根據(jù)權(quán)利要求3所述的基于代碼查詢(xún)進(jìn)行源代碼插樁的方法,其特征是生成代碼信息即所述步驟41中,從源代碼生成與JSearch命令字符串相應(yīng)的代碼信息的方式是首先生成源代碼相應(yīng)的抽象語(yǔ)法樹(shù),在將語(yǔ)法樹(shù)中的類(lèi)、接口、方法、對(duì)象和語(yǔ)句信息依次從語(yǔ)法樹(shù)中抽取出來(lái),形成表的數(shù)據(jù)結(jié)構(gòu)。
5.根據(jù)權(quán)利要求3所述的基于代碼查詢(xún)進(jìn)行源代碼插樁的方法,其特征是語(yǔ)法檢查及檢索準(zhǔn)備工作即步驟42中,其中檢測(cè)和預(yù)處理即檢查和檢索準(zhǔn)備工作的過(guò)程包括步驟601 匹配關(guān)鍵字find ;步驟602 匹配Target元素,并將其存放到Query, target中; 步驟603 匹配關(guān)鍵satisfying ;步驟604 當(dāng)匹配關(guān)鍵字exist成功或者匹配關(guān)鍵字all成功,則跳轉(zhuǎn)步驟605,,否則跳轉(zhuǎn)步驟608 ;步驟605 構(gòu)造相應(yīng)的predicate ;PM 606 -M predicatelist Query, predicates ψ ;步驟607 跳轉(zhuǎn)步驟604 ; 步驟608 匹配關(guān)鍵字where ; 步驟609 當(dāng)掃描完整個(gè)字符串,則跳轉(zhuǎn)618 ;步驟610 如果匹配Att表達(dá)式成功,則跳轉(zhuǎn)步驟611,否則跳轉(zhuǎn)步驟612 ;步驟611 生成AttrCondition對(duì)象,存放到Query. conditionLex隊(duì)列中,跳轉(zhuǎn)步驟·617 ;步驟612 如果匹配Rel表達(dá)式成功,則跳轉(zhuǎn)步驟613,否則跳轉(zhuǎn)步驟614 ;步驟613 生成RelCondition對(duì)象,存放到Query. conditionLex隊(duì)列中,跳轉(zhuǎn)步驟·617 ;步驟614 如果匹配運(yùn)算符成功,則跳轉(zhuǎn)步驟615,否則跳轉(zhuǎn)步驟616步驟615 生成Operator對(duì)象,存放到Query. conditionLex隊(duì)列中,跳轉(zhuǎn)步驟617 ;步驟616:返回出錯(cuò)狀態(tài);步驟617 跳轉(zhuǎn)步驟609 ;步驟618 返回Query單次查詢(xún)結(jié)構(gòu)。
6.根據(jù)權(quán)利要求3所述的基于代碼查詢(xún)進(jìn)行源代碼插樁的方法,其特征是目標(biāo)元素檢索即步驟43中,其中檢索過(guò)程包括步驟701 初始化運(yùn)算符棧op_stack ; 步驟702 初始化操作數(shù)棧r_stack ;步驟703 當(dāng)conditionLex列表中的所有對(duì)象已經(jīng)處理完,則跳轉(zhuǎn)步驟714 ; 步驟704 從conditionLex列表中取出一個(gè)Lex對(duì)象1 步驟705 如果1的類(lèi)型是Attr或者Rel,則跳轉(zhuǎn)步驟706,否者跳轉(zhuǎn)步驟707 ; 步驟706 將1壓入操作數(shù)棧,跳轉(zhuǎn)步驟703 ;步驟707 如果1的類(lèi)型是Operator,則跳轉(zhuǎn)步驟708,否則跳轉(zhuǎn)步驟703 ;步驟708 如果1的優(yōu)先級(jí)比top (op_stack)大,則跳轉(zhuǎn)步驟709,否則跳轉(zhuǎn)步驟710 ;步驟709 將1壓入op_stack中,跳轉(zhuǎn)步驟703 ;步驟710:如果1的優(yōu)先級(jí)與t0p(0p_stack)相等,則跳轉(zhuǎn)步驟711,否則跳轉(zhuǎn)步驟·712 ;步驟711 彈出op_stack元素,跳轉(zhuǎn)步驟703 ; 步驟712 彈出[stack的元素,計(jì)算相應(yīng)的集合; 步驟713 跳轉(zhuǎn)步驟703 ; 步驟714 返回r_stack彈出元素。
7.根據(jù)權(quán)利要求1或3所述的基于代碼查詢(xún)進(jìn)行源代碼插樁的方法,其特征是插樁點(diǎn)即步驟12、步驟13、步驟14、步驟15和步驟45中,其實(shí)現(xiàn)在源文件編輯器標(biāo)尺上增加相應(yīng)的標(biāo)記,該標(biāo)記指定了插樁語(yǔ)句應(yīng)該插入的字符位置、文件行數(shù)和插入內(nèi)容。
8.根據(jù)權(quán)利要求7所述的基于代碼查詢(xún)進(jìn)行源代碼插樁的方法,其特征是所述的插樁點(diǎn)定義方式,所有插樁標(biāo)志均隨程序(工程)進(jìn)行插樁標(biāo)志在程序(工程)關(guān)閉后自動(dòng)進(jìn)行保存,在下次打開(kāi)工程時(shí)插樁標(biāo)志依舊能夠在源代碼編輯器的標(biāo)尺上進(jìn)行還原。
全文摘要
一種使用基于代碼查詢(xún)進(jìn)行源代碼插樁的方法,包括步驟步驟10打開(kāi)一個(gè)工程;步驟11通過(guò)在JSearch編輯器里輸入相應(yīng)的插樁命令;步驟12工具運(yùn)行JSearch命令,得到所有的插樁點(diǎn)定義步驟13審查所有插樁點(diǎn)的定義若發(fā)現(xiàn)帶有錯(cuò)誤的插樁點(diǎn),則進(jìn)入步驟14對(duì)其進(jìn)行修改;沒(méi)有發(fā)現(xiàn)帶有錯(cuò)誤的插樁點(diǎn),則直接進(jìn)入步驟15;步驟14修改插樁的定義至正確;步驟15將插樁點(diǎn)與原源文件合并生成新源文件;本發(fā)明為明確定義的代碼查詢(xún)和插樁命令,參數(shù)化的插樁語(yǔ)句模板,插樁代碼可視化,自動(dòng)插樁高效性等。
文檔編號(hào)G06F11/36GK102298552SQ20111027589
公開(kāi)日2011年12月28日 申請(qǐng)日期2011年9月19日 優(yōu)先權(quán)日2011年9月19日
發(fā)明者張?zhí)? 趙建華, 陶永晶 申請(qǐng)人:南京大學(xué)