本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種程序語(yǔ)句錯(cuò)誤檢測(cè)方法和裝置。
背景技術(shù):
本部分旨在為權(quán)利要求書(shū)中陳述的本發(fā)明的實(shí)施方式提供背景或上下文。此處的描述不因?yàn)榘ㄔ诒静糠种芯统姓J(rèn)是現(xiàn)有技術(shù)。
程序中空指針的使用是一個(gè)致命的問(wèn)題,且往往不容易被發(fā)現(xiàn),為了防止此種錯(cuò)誤,指針使用之前的判空操作不可忽視。目前有很多針對(duì)特定編程語(yǔ)言的工具可以自動(dòng)檢測(cè)指針的未判空使用,例如針對(duì)c語(yǔ)言的coverity代碼靜態(tài)檢測(cè)工具。然而,lua作為游戲后臺(tái)的主流開(kāi)發(fā)腳本語(yǔ)言,目前并沒(méi)有工具來(lái)自動(dòng)檢測(cè)指針的未判空使用。而指針未判空使用的后果常常是程序崩潰引起宕機(jī),因此,如何對(duì)程序中指針未判空使用進(jìn)行檢測(cè)成為現(xiàn)有技術(shù)中亟待解決的技術(shù)問(wèn)題之一。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供了一種程序語(yǔ)句錯(cuò)誤檢測(cè)方法和裝置,用以減少由于程序語(yǔ)句錯(cuò)誤導(dǎo)致的程序運(yùn)行錯(cuò)誤或者程序運(yùn)行崩潰的問(wèn)題。
本發(fā)明實(shí)施例提供一種程序語(yǔ)句錯(cuò)誤檢測(cè)方法,包括:
遍歷待檢測(cè)程序語(yǔ)句,識(shí)別所述待檢測(cè)程序語(yǔ)句中包含的變量;
針對(duì)識(shí)別出的每一變量,確定包含該變量的程序語(yǔ)句的語(yǔ)句類型和包含該變量的程序語(yǔ)句的位置信息,所述語(yǔ)句類型包括使用語(yǔ)句和賦值語(yǔ)句;并
針對(duì)每一使用語(yǔ)句,根據(jù)該使用語(yǔ)句的位置信息和該使用語(yǔ)句中包含的被使用變量所對(duì)應(yīng)的賦值語(yǔ)句的位置信息,分析相應(yīng)的賦值語(yǔ)句和使用語(yǔ)句之間包含的程序語(yǔ)句得到所述被使用變量使用的依賴條件;
根據(jù)所述依賴條件判斷被使用變量是否存在使用錯(cuò)誤。
本發(fā)明實(shí)施例提供一種程序語(yǔ)句錯(cuò)誤檢測(cè)裝置,包括:
識(shí)別單元,用于遍歷待檢測(cè)程序語(yǔ)句,識(shí)別所述待檢測(cè)程序語(yǔ)句中包含的變量;
確定單元,用于針對(duì)識(shí)別出的每一變量,確定包含該變量的程序語(yǔ)句的語(yǔ)句類型和包含該變量的程序語(yǔ)句的位置信息,所述語(yǔ)句類型包括使用語(yǔ)句和賦值語(yǔ)句;
分析單元,用于針對(duì)每一使用語(yǔ)句,根據(jù)該使用語(yǔ)句的位置信息和該使用語(yǔ)句中包含的被使用變量所對(duì)應(yīng)的賦值語(yǔ)句的位置信息,分析相應(yīng)的賦值語(yǔ)句和使用語(yǔ)句之間包含的程序語(yǔ)句得到所述被使用變量使用的依賴條件;
判斷單元,用于根據(jù)所述分析單元得到的依賴條件判斷被使用變量是否存在使用錯(cuò)誤。
本發(fā)明實(shí)施例提供的程序語(yǔ)句錯(cuò)誤檢測(cè)方法和裝置,通過(guò)對(duì)程序語(yǔ)句中包含的變量進(jìn)行識(shí)別,針對(duì)每一變量,從待檢測(cè)程序語(yǔ)句中確定出包含該變量的使用程序語(yǔ)句和賦值程序語(yǔ)句以及每一類型程序語(yǔ)句的位置信息,針對(duì)每一被使用語(yǔ)句,根據(jù)該使用語(yǔ)句的位置信息和該使用語(yǔ)句中包含的被使用變量對(duì)應(yīng)的賦值語(yǔ)句的位置信息,對(duì)相應(yīng)的賦值語(yǔ)句和使用語(yǔ)句之間包含的程序語(yǔ)句進(jìn)行分析得到所述被使用變量使用的依賴條件,根據(jù)該變量使用的依賴條件判斷該變量是否存在使用錯(cuò)誤,由此,實(shí)現(xiàn)了對(duì)程序語(yǔ)句中的變化使用錯(cuò)誤進(jìn)行檢測(cè),減少了由于程序語(yǔ)句錯(cuò)誤導(dǎo)致的程序運(yùn)行錯(cuò)誤或者程序運(yùn)行崩潰的問(wèn)題。
本發(fā)明的其它特征和優(yōu)點(diǎn)將在隨后的說(shuō)明書(shū)中闡述,并且,部分地從說(shuō)明書(shū)中變得顯而易見(jiàn),或者通過(guò)實(shí)施本發(fā)明而了解。本發(fā)明的目的和其他優(yōu)點(diǎn)可通過(guò)在所寫(xiě)的說(shuō)明書(shū)、權(quán)利要求書(shū)、以及附圖中所特別指出的結(jié)構(gòu)來(lái)實(shí)現(xiàn)和獲得。
附圖說(shuō)明
此處所說(shuō)明的附圖用來(lái)提供對(duì)本發(fā)明的進(jìn)一步理解,構(gòu)成本發(fā)明的一部分,本發(fā)明的示意性實(shí)施例及其說(shuō)明用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定。在附圖中:
圖1為本發(fā)明實(shí)施例中,程序語(yǔ)句錯(cuò)誤檢測(cè)方法的實(shí)施流程示意圖;
圖2為本發(fā)明實(shí)施例中,第一種待檢測(cè)程序語(yǔ)句示意圖;
圖3為本發(fā)明實(shí)施例中,第一種待檢測(cè)程序語(yǔ)句對(duì)應(yīng)的vdg示意圖;
圖4為本發(fā)明實(shí)施例中,第二種待檢測(cè)程序語(yǔ)句示意圖;
圖5為本發(fā)明實(shí)施例中,對(duì)第二種待檢測(cè)程序語(yǔ)句進(jìn)行指針未判空使用檢測(cè)的流程示意圖;
圖6為本發(fā)明實(shí)施例中,第二種待檢測(cè)程序語(yǔ)句對(duì)應(yīng)的vdg示意圖;
圖7為本發(fā)明實(shí)施例中,程序語(yǔ)句錯(cuò)誤檢測(cè)裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為了減少由于程序語(yǔ)句錯(cuò)誤導(dǎo)致的程序運(yùn)行錯(cuò)誤或者程序運(yùn)行崩潰的問(wèn)題,本發(fā)明實(shí)施例提供了一種程序語(yǔ)句錯(cuò)誤檢測(cè)方法和裝置。
以下結(jié)合說(shuō)明書(shū)附圖對(duì)本發(fā)明的優(yōu)選實(shí)施例進(jìn)行說(shuō)明,應(yīng)當(dāng)理解,此處所描述的優(yōu)選實(shí)施例僅用于說(shuō)明和解釋本發(fā)明,并不用于限定本發(fā)明,并且在不沖突的情況下,本發(fā)明中的實(shí)施例及實(shí)施例中的特征可以相互組合。
如圖1所示,其為本發(fā)明實(shí)施例提供的程序語(yǔ)句錯(cuò)誤檢測(cè)方法的實(shí)施流程示意圖,可以包括以下步驟:
s11、遍歷待檢測(cè)程序語(yǔ)句,識(shí)別待檢測(cè)程序語(yǔ)句中包含的變量。
具體實(shí)施時(shí),可以根據(jù)程序語(yǔ)句中包含的預(yù)設(shè)標(biāo)識(shí)符來(lái)識(shí)別待檢測(cè)程序語(yǔ)句中包含的變量。為了便于描述,以指針變量為例,在lua語(yǔ)言中,判斷一個(gè)變量是否為指針的方法如下:指針的使用是冒號(hào)形式,比如調(diào)用函數(shù)“pointer:method()”,基于此,本發(fā)明實(shí)施例中,可以遍歷待檢測(cè)程序語(yǔ)句,查找到所有包含冒號(hào)的程序語(yǔ)句,提取出冒號(hào)之前的變量(本例中即為指針)。
較佳地,為了提高變量識(shí)別效率,本發(fā)明實(shí)施例中,在執(zhí)行步驟s11之前,可以抽象出待檢測(cè)程序語(yǔ)句的ast(abstractsyntaxtree,抽象語(yǔ)法樹(shù)),基于此,步驟s11中,可以遍歷構(gòu)造的ast,識(shí)別ast中包含的預(yù)設(shè)標(biāo)識(shí)符,從包含預(yù)設(shè)標(biāo)識(shí)符的程序語(yǔ)句中提取待檢測(cè)程序語(yǔ)句中包含的變量。
具體實(shí)施時(shí),可以借用lua的開(kāi)源parser工具lua-parser,利用訪問(wèn)者(visitor)模式構(gòu)造待檢測(cè)程序語(yǔ)句的ast樹(shù),然后用visitor遍歷該ast樹(shù),識(shí)別該ast中包含的預(yù)設(shè)標(biāo)識(shí)符,例如,對(duì)于指針變量,該預(yù)設(shè)標(biāo)識(shí)符可以為冒號(hào),由此識(shí)別出待檢測(cè)程序語(yǔ)句中包含的指針變量。
為了便于理解,以待檢測(cè)程序語(yǔ)句為圖2所示的程序語(yǔ)句為例,遍歷圖2所示的程序語(yǔ)句可以得到3個(gè)包含冒號(hào)的表達(dá)式,提取出冒號(hào)之前的變量(本例中即為pointer和puser)添加至指針變量集合中,為了便于描述,本發(fā)明實(shí)施例中以判斷指針pointer使用是否存在錯(cuò)誤為例進(jìn)行說(shuō)明。
較佳地,具體實(shí)施時(shí),由于未使用的變量不會(huì)引發(fā)程序運(yùn)行錯(cuò)誤或者程序運(yùn)行崩潰,為了進(jìn)一步提高識(shí)別效率,本發(fā)明實(shí)施例中可以僅針對(duì)使用的變量進(jìn)行識(shí)別,即本發(fā)明實(shí)施例中僅針對(duì)使用語(yǔ)句中包含的被使用變量進(jìn)行識(shí)別。
s12、針對(duì)識(shí)別出的每一變量,確定包含該變量的程序語(yǔ)句的語(yǔ)句類型和包含該變量的程序語(yǔ)句的位置信息。
本步驟中,針對(duì)步驟s11中識(shí)別出的每一變量,確定包含該變量的程序語(yǔ)句的位置信息和語(yǔ)句類型。其中,語(yǔ)句類型包含賦值語(yǔ)句和使用語(yǔ)句。
針對(duì)識(shí)別出的每一變量,通過(guò)遍歷構(gòu)造的ast樹(shù)確定包含該變量的程序語(yǔ)句。進(jìn)一步地,可以根據(jù)包含該變量的程序語(yǔ)句中的特征標(biāo)識(shí)符來(lái)確定該程序語(yǔ)句的語(yǔ)句類型。例如,對(duì)于賦值語(yǔ)句來(lái)說(shuō),程序語(yǔ)句中包含的特征標(biāo)識(shí)符可以為等于號(hào)(“=”),對(duì)于使用語(yǔ)句來(lái)說(shuō),程序語(yǔ)句中包含的特征標(biāo)識(shí)符可以為冒號(hào)(“:”)。
為了便于說(shuō)明,仍然以指針變量為例進(jìn)行說(shuō)明。針對(duì)每一包含指針變量的程序語(yǔ)句,可以根據(jù)該程序語(yǔ)句包含的特征標(biāo)識(shí)符來(lái)確定該程序語(yǔ)句的語(yǔ)句類型。以圖2所示的程序語(yǔ)句為例,根據(jù)步驟s11中識(shí)別出包含指針變量的表達(dá)式如下:1、localpointer=nil;2、pointer=puser:getpointer1();3、pointer=puser:getpointer2();4、returnpointer:getintval()。
根據(jù)上述語(yǔ)句類型的確定方式可知,表達(dá)式1中僅包含等于號(hào),因此,表達(dá)式1屬于賦值語(yǔ)句;表達(dá)式2和表達(dá)式3中包含等于號(hào)和冒號(hào),對(duì)于指針pointer來(lái)說(shuō),表達(dá)式2和表達(dá)式3屬于賦值語(yǔ)句,對(duì)于指針puser來(lái)說(shuō)表達(dá)式2和表達(dá)式3屬于使用語(yǔ)句,表達(dá)式4中僅包含冒號(hào),因此,表達(dá)式4屬于使用語(yǔ)句。
進(jìn)一步地,還需要確定出每一類型程序語(yǔ)句的在待檢測(cè)程序語(yǔ)句中的位置信息,不同程序語(yǔ)句的位置信息可以以該程序語(yǔ)句在待檢測(cè)程序語(yǔ)句中的行數(shù)表示。例如,上述表達(dá)式1在待檢測(cè)程序語(yǔ)句中的位置信息可以表示為第5行;上述表達(dá)式2在待檢測(cè)程序語(yǔ)句中的位置信息可以表示為第11行,上述表達(dá)式3在待檢測(cè)程序語(yǔ)句中的位置信息可以表示為第17行,上述表達(dá)式4在待檢測(cè)程序語(yǔ)句中的位置信息可以表示為第22行。
需要說(shuō)明的是,具體實(shí)施時(shí),在確定使用語(yǔ)句時(shí),無(wú)需確定正確的使用語(yǔ)句。以檢測(cè)程序語(yǔ)句錯(cuò)誤為是否包含指針變量未判空使用為例,則在步驟s12中確定包含指針變量的使用語(yǔ)句中無(wú)需確定指針變量判空使用的程序語(yǔ)句,例如,圖2所示的程序語(yǔ)句中包含的如下語(yǔ)句:“ifpointer==nil”。
s13、針對(duì)每一使用語(yǔ)句,根據(jù)該使用語(yǔ)句的位置信息和該使用語(yǔ)句中包含的被使用變量所對(duì)應(yīng)的賦值語(yǔ)句的位置信息,分析相應(yīng)的賦值語(yǔ)句和使用語(yǔ)句之間包含的程序語(yǔ)句得到所述被使用變量使用的依賴條件。
其中,依賴條件包括直接依賴條件和控制依賴條件,分析圖2所示的程序語(yǔ)句可得:指針pointer的直接依賴條件包括以下3個(gè):1、localpointer=nil;2、pointer=puser:getpointer1();3、pointer=puser:getpointer2();而pointer的控制依賴條件包括:ifpint<4和ifflag==0,而flag控制依賴于pint>=4。
s14、根據(jù)所述依賴條件判斷被使用變量是否存在使用錯(cuò)誤。
具體實(shí)施時(shí),針對(duì)每一使用語(yǔ)句中包含的被使用變量,在確定出被使用變量的直接依賴條件和控制依賴條件之后,可以構(gòu)造出被使用變量的vdg(valuedependencegraph,值依賴圖)。在構(gòu)造的vdg上,針對(duì)每一使用語(yǔ)句,對(duì)該使用語(yǔ)句進(jìn)行前向切片,直至到達(dá)被使用變量所對(duì)應(yīng)的第一條賦值語(yǔ)句為止,通過(guò)對(duì)前向切片進(jìn)行分析可以判斷出被使用變量是否存在使用錯(cuò)誤。需要說(shuō)明的是,本發(fā)明實(shí)施例中涉及的被使用變量是指在使用語(yǔ)句中包含的變量,例如,使用語(yǔ)句returnpointer:getintval()中,被使用的變量即為“pointer”。
具體實(shí)施時(shí),可以對(duì)前向切片進(jìn)行分析,確定被使用變量的正確使用路徑;從正確使用路徑中查找被使用變量的控制依賴條件;并進(jìn)一步確定控制依賴條件的反向條件。需要說(shuō)明的是,如果控制依賴條件有多個(gè),則需要確定多個(gè)控制依賴條件的并集的反向條件。
仍然以圖2所示的程序語(yǔ)句為例,針對(duì)使用語(yǔ)句returnpointer:getintval(),從第22行被使用變量pointer的使用程序語(yǔ)句“returnpointer:getintval()”開(kāi)始對(duì)待檢測(cè)程序語(yǔ)句進(jìn)行前向切片,直至第5行被使用變量pointer的第一條賦值語(yǔ)句“l(fā)ocalpointer=nil”為止,前向切片中的程序語(yǔ)句有對(duì)變量的賦值語(yǔ)句、使用語(yǔ)句以及對(duì)該變量的判空語(yǔ)句和相應(yīng)控制流。
如圖3所示,其為針對(duì)圖2所示的待檢測(cè)程序構(gòu)造的vdg進(jìn)行前向切片后得到的vdg示意圖。根據(jù)圖3可以確定,指針變量正確使用路徑為圖3中虛線框內(nèi)所示部分。相應(yīng)地,根據(jù)指針變量正確使用路徑中可以查找到指針變量的控制依賴條件為pint<4||flag==0,對(duì)pint<4||flag==0取反可以得到其相應(yīng)的反向條件為!(flag==0)&&!(pint<4),而對(duì)于flag有其相應(yīng)的到達(dá)條件,從圖3所示的vdg圖中,可以確定flag的控制依賴條件為:((!(pint>=4))=>flag==1)&&((pint>=4)=>flag==0)。
進(jìn)一步地,可以根據(jù)上述得到的分析結(jié)果判斷被使用變量是否存在使用錯(cuò)誤。具體實(shí)施時(shí),可以將分析結(jié)果中得到的反向條件輸入約束求解器;如果約束求解器輸出求解結(jié)果,則確定被使用變量存在使用錯(cuò)誤,如果約束求解器未輸出求解結(jié)果,則確定被使用變量不存在使用錯(cuò)誤。較佳地,具體實(shí)施時(shí),約束求解器可以使用z3約束求解器。
本例中,可以將條件1:!(flag==0)&&!(pint<4)和條件2:((!(pint>=4))=>flag==1)&&((pint>=4)=>flag==0)作為約束條件輸入z3約束求解器中,z3解不出滿足該約束條件的值,因此,不存在變量使用錯(cuò)誤。
具體實(shí)施時(shí),如果判斷出待檢測(cè)程序語(yǔ)句存在變量使用錯(cuò)誤,則還可以根據(jù)實(shí)際情況,針對(duì)判斷出的變量使用錯(cuò)誤進(jìn)行修復(fù);或者輸出變量存在使用錯(cuò)誤的提示信息。較佳地,輸出的提示信息中可以包含有使用語(yǔ)句語(yǔ)句的位置信息,這樣,可以快速地定位到存在變量使用錯(cuò)誤的程序語(yǔ)句。
較佳地,本發(fā)明實(shí)施例涉及的變量使用錯(cuò)誤可以為指針變量未判空使用。相應(yīng)地,在針對(duì)判斷出的變量使用錯(cuò)誤進(jìn)行修復(fù)時(shí),可以根據(jù)根據(jù)使用語(yǔ)句的位置信息,在使用語(yǔ)句之前插入變量判空條件語(yǔ)句或者針對(duì)檢測(cè)到的指針未判空使用輸出相應(yīng)地提示信息。
為了更好地理解本發(fā)明實(shí)施例,以下結(jié)合檢測(cè)圖4所示的程序語(yǔ)句是否存在指針未判空使用的流程對(duì)本發(fā)明實(shí)施例的具體實(shí)施過(guò)程進(jìn)行說(shuō)明,如圖5所示,可以包括以下步驟:
s51、構(gòu)造待檢測(cè)程序語(yǔ)句的ast樹(shù)。
本步驟中,可以使用lua的開(kāi)源parser工具lua-parser,利用訪問(wèn)者模式構(gòu)造待檢測(cè)程序語(yǔ)句的ast樹(shù)。
s52、遍歷構(gòu)造的ast樹(shù),識(shí)別其中的指針變量。
本步驟中,遍歷構(gòu)造的ast樹(shù),識(shí)別出其中包含冒號(hào)的所有表達(dá)式,提取出冒號(hào)之前的變量加入到指針變量集合中。
s53、針對(duì)每一指針變量,構(gòu)造該指針變量對(duì)應(yīng)的vdg圖。
本步驟中,可以遍歷ast樹(shù),確定包含指針變量的程序語(yǔ)句的語(yǔ)句類型以及包含指針變量的程序語(yǔ)句的位置信息,本發(fā)明實(shí)施例中可以分為賦值語(yǔ)句和使用語(yǔ)句,并根據(jù)賦值語(yǔ)句和使用語(yǔ)句構(gòu)造待檢測(cè)程序的值依賴圖vdg。
s54、在所述vdg上,針對(duì)每條使用語(yǔ)句,對(duì)該使用語(yǔ)句進(jìn)行前向切片。
本步驟中,在構(gòu)造的vdg圖上,針對(duì)每個(gè)使用語(yǔ)句,對(duì)該使用語(yǔ)句開(kāi)始做前向切片,直至到達(dá)該使用語(yǔ)句中包含的被使用指針?biāo)鶎?duì)應(yīng)的第一條賦值語(yǔ)句,切片中的語(yǔ)句有對(duì)某個(gè)指針的賦值語(yǔ)句、使用語(yǔ)句、以及對(duì)該指針的判空語(yǔ)句和相應(yīng)控制流。如圖6所示,其針對(duì)圖4所示的程序語(yǔ)句中的指針變量使用語(yǔ)句進(jìn)行前向切片后得到的vdg示意圖。
s55、分析切片,確定指針變量未判空使用的條件。
本步驟中,針對(duì)步驟s54中得到的前向切片,對(duì)得到的前向切片進(jìn)行分析確定指針變量正確使用路徑,即指針賦值后經(jīng)判空使用的路徑,該正確使用路徑為圖6中虛線框中所示部分。分析圖6所示的vdg圖可以得到,指針變量正確使用的控制依賴條件為條件3:(flag==0)||(pint<3),對(duì)該控制依賴條件取反可以得到條件4:!(flag==0)&&!(pint<3),而flag的控制依賴條件為條件5:((!(pint>=4))=>flag==1)&&((pint>=4)=>flag==0)。
s56、將指針未判空使用的條件輸入約束求解器。
s57、判斷約束求解器是否輸出求解結(jié)果,如果是,則執(zhí)行步驟s58,否則,執(zhí)行步驟s54。
針對(duì)圖4所示的待檢測(cè)程序語(yǔ)句,將條件5和條件4輸入z3約束求解器,z3解出滿足條件5和條件4的值為pint=3,因此,可以確定圖4所示的待檢測(cè)程序語(yǔ)句存在指針未判空直接使用的錯(cuò)誤,即在pint=3時(shí)pointer為nil,且沒(méi)有判空。
s58、判斷待檢測(cè)程序中是否存在指針判空語(yǔ)句,如果是,則執(zhí)行步驟s59,否則,執(zhí)行步驟s510。
s59、根據(jù)該條使用語(yǔ)句的位置信息,在該條使用語(yǔ)句之前插入待檢測(cè)程序中包含的指針判空語(yǔ)句,返回執(zhí)行步驟s54。
本例中,存在其它指針判空語(yǔ)句,例如:
ifpointer==nilthen
return0
end
據(jù)此,可以在“returnpointer:getintval()”之前插入指針判空條件語(yǔ)句,條件語(yǔ)句中的return語(yǔ)句采用其他指針判空語(yǔ)句中的return語(yǔ)句,本例中即為“return0”。
s510、輸出存在指針未判空直接使用的提示信息,并返回執(zhí)行步驟s54。
較佳地,在輸出的提示信息中,可以包括該條使用語(yǔ)句的位置信息。
本發(fā)明實(shí)施例中,針對(duì)指針變量通過(guò)檢查從賦值語(yǔ)句到直接使用過(guò)程中是否有路徑可達(dá)(不包括判空語(yǔ)句),如果不可達(dá),說(shuō)明從指針賦值到直接使用之間必存在判空語(yǔ)句,否則存在指針使用未判空的情況,在這條路徑的使用指針語(yǔ)句之前插入判斷指針為空的語(yǔ)句,if語(yǔ)句中的return語(yǔ)句采用待檢測(cè)程序語(yǔ)句中指針判空中的return語(yǔ)句,如果待檢測(cè)程序語(yǔ)句中不存在其它指針判空語(yǔ)句,可以只是輸出提示信息,并不修復(fù),以免引入錯(cuò)誤。
基于同一發(fā)明構(gòu)思,本發(fā)明實(shí)施例中還提供了一種程序語(yǔ)句錯(cuò)誤檢測(cè)裝置,由于上述裝置解決問(wèn)題的原理與程序語(yǔ)句錯(cuò)誤檢測(cè)方法相似,因此上述裝置的實(shí)施可以參見(jiàn)方法的實(shí)施,重復(fù)之處不再贅述。
如圖7所示,其為本發(fā)明實(shí)施例提供的程序語(yǔ)句錯(cuò)誤檢測(cè)裝置的結(jié)構(gòu)示意圖,可以包括:
識(shí)別單元71,用于遍歷待檢測(cè)程序語(yǔ)句,識(shí)別所述待檢測(cè)程序語(yǔ)句中包含的變量;
確定單元72,用于針對(duì)識(shí)別出的每一變量,確定包含該變量的程序語(yǔ)句的語(yǔ)句類型和包含該變量的程序語(yǔ)句的位置信息,所述語(yǔ)句類型包括使用語(yǔ)句和賦值語(yǔ)句;
分析單元73,用于針對(duì)每一使用語(yǔ)句,根據(jù)該使用語(yǔ)句的位置信息和該使用語(yǔ)句中包含的被使用變量所對(duì)應(yīng)的賦值語(yǔ)句的位置信息,分析相應(yīng)的賦值語(yǔ)句和使用語(yǔ)句之間包含的程序語(yǔ)句得到所述被使用變量使用的依賴條件;
判斷單元74,用于根據(jù)所述分析單元73得到的依賴條件判斷被使用變量是否存在使用錯(cuò)誤。
可選地,本發(fā)明實(shí)施例提供的程序語(yǔ)句錯(cuò)誤檢測(cè)裝置還可以包括ast構(gòu)造單元,其中:
所述ast構(gòu)造單元,用于在所述識(shí)別單元遍歷待檢測(cè)程序語(yǔ)句之前,構(gòu)造所述待檢測(cè)程序語(yǔ)句的ast;
所述識(shí)別單元,具體用于遍歷所述ast,識(shí)別所述ast中包含的預(yù)設(shè)標(biāo)識(shí)符;從包含所述預(yù)設(shè)標(biāo)識(shí)符的程序語(yǔ)句中提取所述待檢測(cè)程序語(yǔ)句中包含的變量。
較佳地,所述依賴條件包括直接依賴條件和控制依賴條件。
較佳地,所述判斷單元74,具體包括:
vdg構(gòu)造子單元,用于根據(jù)所述直接依賴條件和控制依賴條件,構(gòu)造被使用變量的值依賴圖vdg;
切片子單元,用于在所述vdg中,針對(duì)每一使用語(yǔ)句,對(duì)該使用語(yǔ)句進(jìn)行前向切片,直至到達(dá)該使用語(yǔ)句中包含的被使用變量所對(duì)應(yīng)的賦值語(yǔ)句為止;
分析子單元,用于對(duì)所述前向切片進(jìn)行分析得到分析結(jié)果;
判斷子單元,用于根據(jù)所述分析結(jié)果,判斷被使用變量是否存在使用錯(cuò)誤。
較佳地,所述分析子單元,具體用于對(duì)所述前向切片進(jìn)行分析,確定被使用變量的正確使用路徑;從所述正確使用路徑中查找被使用變量的控制依賴條件;并確定所述控制依賴條件的反向條件。
較佳地,如果所述控制依賴條件有多個(gè);則所述分析子單元,具體用于確定多個(gè)控制依賴條件的并集的反向條件。
較佳地,,所述判斷子單元,具體用于將所述反向條件輸入約束求解器;如果所述約束求解器輸出針對(duì)所述反向條件的求解結(jié)果,則確定被使用變量存在使用錯(cuò)誤,如果所述約束求解器未輸出針對(duì)所述反向條件的求解結(jié)果,則確定被使用變量不存在使用錯(cuò)誤。
可選地,本發(fā)明實(shí)施例提供的程序語(yǔ)句錯(cuò)誤檢測(cè)裝置還可以包括:
修復(fù)單元,用于如果所述判斷單元判斷出被使用變量存在使用錯(cuò)誤,則針對(duì)判斷出的變量使用錯(cuò)誤進(jìn)行修復(fù);或者
提示單元,用于輸出變量存在使用錯(cuò)誤的提示信息。
可選地,所述提示信息中包含有存在變量使用錯(cuò)誤的使用語(yǔ)句的位置信息。
較佳地,本發(fā)明實(shí)施例中涉及的變量包括指針變量;以及變量使用錯(cuò)誤包括指針變量未判空使用。所述修復(fù)單元,具體用于針對(duì)判斷出的指針未判空使用錯(cuò)誤,根據(jù)存在指針未判空使用錯(cuò)誤的使用語(yǔ)句的位置信息,在相應(yīng)的使用語(yǔ)句之前插入指針判空條件語(yǔ)句。
為了描述的方便,以上各部分按照功能劃分為各模塊(或單元)分別描述。當(dāng)然,在實(shí)施本發(fā)明時(shí)可以把各模塊(或單元)的功能在同一個(gè)或多個(gè)軟件或硬件中實(shí)現(xiàn)。
在一些可能的實(shí)施方式中,根據(jù)本發(fā)明的程序語(yǔ)句錯(cuò)誤檢測(cè)裝置可以包括至少一個(gè)處理單元、以及至少一個(gè)存儲(chǔ)單元。其中,所述存儲(chǔ)單元存儲(chǔ)有程序代碼,當(dāng)所述程序代碼被所述處理單元執(zhí)行時(shí),使得所述處理單元執(zhí)行本說(shuō)明書(shū)中描述的根據(jù)本發(fā)明各種示例性實(shí)施方式的程序語(yǔ)句錯(cuò)誤檢測(cè)方法中的各種步驟。例如,所述處理單元可以執(zhí)行如圖1中所示的步驟s11,遍歷待檢測(cè)程序語(yǔ)句,識(shí)別待檢測(cè)程序語(yǔ)句中包含的變量,步驟s12,針對(duì)每一變量,確定包含該變量的程序語(yǔ)句的語(yǔ)句類型和包含該變量的程序語(yǔ)句的位置信息,所述語(yǔ)句類型包括使用語(yǔ)句和賦值語(yǔ)句;步驟s13,針對(duì)每一使用語(yǔ)句,根據(jù)該使用語(yǔ)句的位置信息和該使用語(yǔ)句中包含的被使用變量所對(duì)應(yīng)的賦值語(yǔ)句的位置信息,分析相應(yīng)的賦值語(yǔ)句和使用語(yǔ)句之間包含的程序語(yǔ)句得到所述被使用變量使用的依賴條件,以及步驟s14、根據(jù)所述依賴條件判斷被使用變量是否存在使用錯(cuò)誤。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實(shí)施例可提供為方法、系統(tǒng)、或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本發(fā)明可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤(pán)存儲(chǔ)器、cd-rom、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來(lái)描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合。可提供這些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過(guò)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。
這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。
這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
盡管已描述了本發(fā)明的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對(duì)這些實(shí)施例做出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實(shí)施例以及落入本發(fā)明范圍的所有變更和修改。
顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。