一种程序语句错误检测方法和装置与流程

文档序号:11234000阅读:993来源:国知局
一种程序语句错误检测方法和装置与流程

本发明涉及计算机技术领域,尤其涉及一种程序语句错误检测方法和装置。



背景技术:

本部分旨在为权利要求书中陈述的本发明的实施方式提供背景或上下文。此处的描述不因为包括在本部分中就承认是现有技术。

程序中空指针的使用是一个致命的问题,且往往不容易被发现,为了防止此种错误,指针使用之前的判空操作不可忽视。目前有很多针对特定编程语言的工具可以自动检测指针的未判空使用,例如针对c语言的coverity代码静态检测工具。然而,lua作为游戏后台的主流开发脚本语言,目前并没有工具来自动检测指针的未判空使用。而指针未判空使用的后果常常是程序崩溃引起宕机,因此,如何对程序中指针未判空使用进行检测成为现有技术中亟待解决的技术问题之一。



技术实现要素:

本发明实施例提供了一种程序语句错误检测方法和装置,用以减少由于程序语句错误导致的程序运行错误或者程序运行崩溃的问题。

本发明实施例提供一种程序语句错误检测方法,包括:

遍历待检测程序语句,识别所述待检测程序语句中包含的变量;

针对识别出的每一变量,确定包含该变量的程序语句的语句类型和包含该变量的程序语句的位置信息,所述语句类型包括使用语句和赋值语句;并

针对每一使用语句,根据该使用语句的位置信息和该使用语句中包含的被使用变量所对应的赋值语句的位置信息,分析相应的赋值语句和使用语句之间包含的程序语句得到所述被使用变量使用的依赖条件;

根据所述依赖条件判断被使用变量是否存在使用错误。

本发明实施例提供一种程序语句错误检测装置,包括:

识别单元,用于遍历待检测程序语句,识别所述待检测程序语句中包含的变量;

确定单元,用于针对识别出的每一变量,确定包含该变量的程序语句的语句类型和包含该变量的程序语句的位置信息,所述语句类型包括使用语句和赋值语句;

分析单元,用于针对每一使用语句,根据该使用语句的位置信息和该使用语句中包含的被使用变量所对应的赋值语句的位置信息,分析相应的赋值语句和使用语句之间包含的程序语句得到所述被使用变量使用的依赖条件;

判断单元,用于根据所述分析单元得到的依赖条件判断被使用变量是否存在使用错误。

本发明实施例提供的程序语句错误检测方法和装置,通过对程序语句中包含的变量进行识别,针对每一变量,从待检测程序语句中确定出包含该变量的使用程序语句和赋值程序语句以及每一类型程序语句的位置信息,针对每一被使用语句,根据该使用语句的位置信息和该使用语句中包含的被使用变量对应的赋值语句的位置信息,对相应的赋值语句和使用语句之间包含的程序语句进行分析得到所述被使用变量使用的依赖条件,根据该变量使用的依赖条件判断该变量是否存在使用错误,由此,实现了对程序语句中的变化使用错误进行检测,减少了由于程序语句错误导致的程序运行错误或者程序运行崩溃的问题。

本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本发明的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1为本发明实施例中,程序语句错误检测方法的实施流程示意图;

图2为本发明实施例中,第一种待检测程序语句示意图;

图3为本发明实施例中,第一种待检测程序语句对应的vdg示意图;

图4为本发明实施例中,第二种待检测程序语句示意图;

图5为本发明实施例中,对第二种待检测程序语句进行指针未判空使用检测的流程示意图;

图6为本发明实施例中,第二种待检测程序语句对应的vdg示意图;

图7为本发明实施例中,程序语句错误检测装置的结构示意图。

具体实施方式

为了减少由于程序语句错误导致的程序运行错误或者程序运行崩溃的问题,本发明实施例提供了一种程序语句错误检测方法和装置。

以下结合说明书附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明,并且在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。

如图1所示,其为本发明实施例提供的程序语句错误检测方法的实施流程示意图,可以包括以下步骤:

s11、遍历待检测程序语句,识别待检测程序语句中包含的变量。

具体实施时,可以根据程序语句中包含的预设标识符来识别待检测程序语句中包含的变量。为了便于描述,以指针变量为例,在lua语言中,判断一个变量是否为指针的方法如下:指针的使用是冒号形式,比如调用函数“pointer:method()”,基于此,本发明实施例中,可以遍历待检测程序语句,查找到所有包含冒号的程序语句,提取出冒号之前的变量(本例中即为指针)。

较佳地,为了提高变量识别效率,本发明实施例中,在执行步骤s11之前,可以抽象出待检测程序语句的ast(abstractsyntaxtree,抽象语法树),基于此,步骤s11中,可以遍历构造的ast,识别ast中包含的预设标识符,从包含预设标识符的程序语句中提取待检测程序语句中包含的变量。

具体实施时,可以借用lua的开源parser工具lua-parser,利用访问者(visitor)模式构造待检测程序语句的ast树,然后用visitor遍历该ast树,识别该ast中包含的预设标识符,例如,对于指针变量,该预设标识符可以为冒号,由此识别出待检测程序语句中包含的指针变量。

为了便于理解,以待检测程序语句为图2所示的程序语句为例,遍历图2所示的程序语句可以得到3个包含冒号的表达式,提取出冒号之前的变量(本例中即为pointer和puser)添加至指针变量集合中,为了便于描述,本发明实施例中以判断指针pointer使用是否存在错误为例进行说明。

较佳地,具体实施时,由于未使用的变量不会引发程序运行错误或者程序运行崩溃,为了进一步提高识别效率,本发明实施例中可以仅针对使用的变量进行识别,即本发明实施例中仅针对使用语句中包含的被使用变量进行识别。

s12、针对识别出的每一变量,确定包含该变量的程序语句的语句类型和包含该变量的程序语句的位置信息。

本步骤中,针对步骤s11中识别出的每一变量,确定包含该变量的程序语句的位置信息和语句类型。其中,语句类型包含赋值语句和使用语句。

针对识别出的每一变量,通过遍历构造的ast树确定包含该变量的程序语句。进一步地,可以根据包含该变量的程序语句中的特征标识符来确定该程序语句的语句类型。例如,对于赋值语句来说,程序语句中包含的特征标识符可以为等于号(“=”),对于使用语句来说,程序语句中包含的特征标识符可以为冒号(“:”)。

为了便于说明,仍然以指针变量为例进行说明。针对每一包含指针变量的程序语句,可以根据该程序语句包含的特征标识符来确定该程序语句的语句类型。以图2所示的程序语句为例,根据步骤s11中识别出包含指针变量的表达式如下:1、localpointer=nil;2、pointer=puser:getpointer1();3、pointer=puser:getpointer2();4、returnpointer:getintval()。

根据上述语句类型的确定方式可知,表达式1中仅包含等于号,因此,表达式1属于赋值语句;表达式2和表达式3中包含等于号和冒号,对于指针pointer来说,表达式2和表达式3属于赋值语句,对于指针puser来说表达式2和表达式3属于使用语句,表达式4中仅包含冒号,因此,表达式4属于使用语句。

进一步地,还需要确定出每一类型程序语句的在待检测程序语句中的位置信息,不同程序语句的位置信息可以以该程序语句在待检测程序语句中的行数表示。例如,上述表达式1在待检测程序语句中的位置信息可以表示为第5行;上述表达式2在待检测程序语句中的位置信息可以表示为第11行,上述表达式3在待检测程序语句中的位置信息可以表示为第17行,上述表达式4在待检测程序语句中的位置信息可以表示为第22行。

需要说明的是,具体实施时,在确定使用语句时,无需确定正确的使用语句。以检测程序语句错误为是否包含指针变量未判空使用为例,则在步骤s12中确定包含指针变量的使用语句中无需确定指针变量判空使用的程序语句,例如,图2所示的程序语句中包含的如下语句:“ifpointer==nil”。

s13、针对每一使用语句,根据该使用语句的位置信息和该使用语句中包含的被使用变量所对应的赋值语句的位置信息,分析相应的赋值语句和使用语句之间包含的程序语句得到所述被使用变量使用的依赖条件。

其中,依赖条件包括直接依赖条件和控制依赖条件,分析图2所示的程序语句可得:指针pointer的直接依赖条件包括以下3个:1、localpointer=nil;2、pointer=puser:getpointer1();3、pointer=puser:getpointer2();而pointer的控制依赖条件包括:ifpint<4和ifflag==0,而flag控制依赖于pint>=4。

s14、根据所述依赖条件判断被使用变量是否存在使用错误。

具体实施时,针对每一使用语句中包含的被使用变量,在确定出被使用变量的直接依赖条件和控制依赖条件之后,可以构造出被使用变量的vdg(valuedependencegraph,值依赖图)。在构造的vdg上,针对每一使用语句,对该使用语句进行前向切片,直至到达被使用变量所对应的第一条赋值语句为止,通过对前向切片进行分析可以判断出被使用变量是否存在使用错误。需要说明的是,本发明实施例中涉及的被使用变量是指在使用语句中包含的变量,例如,使用语句returnpointer:getintval()中,被使用的变量即为“pointer”。

具体实施时,可以对前向切片进行分析,确定被使用变量的正确使用路径;从正确使用路径中查找被使用变量的控制依赖条件;并进一步确定控制依赖条件的反向条件。需要说明的是,如果控制依赖条件有多个,则需要确定多个控制依赖条件的并集的反向条件。

仍然以图2所示的程序语句为例,针对使用语句returnpointer:getintval(),从第22行被使用变量pointer的使用程序语句“returnpointer:getintval()”开始对待检测程序语句进行前向切片,直至第5行被使用变量pointer的第一条赋值语句“localpointer=nil”为止,前向切片中的程序语句有对变量的赋值语句、使用语句以及对该变量的判空语句和相应控制流。

如图3所示,其为针对图2所示的待检测程序构造的vdg进行前向切片后得到的vdg示意图。根据图3可以确定,指针变量正确使用路径为图3中虚线框内所示部分。相应地,根据指针变量正确使用路径中可以查找到指针变量的控制依赖条件为pint<4||flag==0,对pint<4||flag==0取反可以得到其相应的反向条件为!(flag==0)&&!(pint<4),而对于flag有其相应的到达条件,从图3所示的vdg图中,可以确定flag的控制依赖条件为:((!(pint>=4))=>flag==1)&&((pint>=4)=>flag==0)。

进一步地,可以根据上述得到的分析结果判断被使用变量是否存在使用错误。具体实施时,可以将分析结果中得到的反向条件输入约束求解器;如果约束求解器输出求解结果,则确定被使用变量存在使用错误,如果约束求解器未输出求解结果,则确定被使用变量不存在使用错误。较佳地,具体实施时,约束求解器可以使用z3约束求解器。

本例中,可以将条件1:!(flag==0)&&!(pint<4)和条件2:((!(pint>=4))=>flag==1)&&((pint>=4)=>flag==0)作为约束条件输入z3约束求解器中,z3解不出满足该约束条件的值,因此,不存在变量使用错误。

具体实施时,如果判断出待检测程序语句存在变量使用错误,则还可以根据实际情况,针对判断出的变量使用错误进行修复;或者输出变量存在使用错误的提示信息。较佳地,输出的提示信息中可以包含有使用语句语句的位置信息,这样,可以快速地定位到存在变量使用错误的程序语句。

较佳地,本发明实施例涉及的变量使用错误可以为指针变量未判空使用。相应地,在针对判断出的变量使用错误进行修复时,可以根据根据使用语句的位置信息,在使用语句之前插入变量判空条件语句或者针对检测到的指针未判空使用输出相应地提示信息。

为了更好地理解本发明实施例,以下结合检测图4所示的程序语句是否存在指针未判空使用的流程对本发明实施例的具体实施过程进行说明,如图5所示,可以包括以下步骤:

s51、构造待检测程序语句的ast树。

本步骤中,可以使用lua的开源parser工具lua-parser,利用访问者模式构造待检测程序语句的ast树。

s52、遍历构造的ast树,识别其中的指针变量。

本步骤中,遍历构造的ast树,识别出其中包含冒号的所有表达式,提取出冒号之前的变量加入到指针变量集合中。

s53、针对每一指针变量,构造该指针变量对应的vdg图。

本步骤中,可以遍历ast树,确定包含指针变量的程序语句的语句类型以及包含指针变量的程序语句的位置信息,本发明实施例中可以分为赋值语句和使用语句,并根据赋值语句和使用语句构造待检测程序的值依赖图vdg。

s54、在所述vdg上,针对每条使用语句,对该使用语句进行前向切片。

本步骤中,在构造的vdg图上,针对每个使用语句,对该使用语句开始做前向切片,直至到达该使用语句中包含的被使用指针所对应的第一条赋值语句,切片中的语句有对某个指针的赋值语句、使用语句、以及对该指针的判空语句和相应控制流。如图6所示,其针对图4所示的程序语句中的指针变量使用语句进行前向切片后得到的vdg示意图。

s55、分析切片,确定指针变量未判空使用的条件。

本步骤中,针对步骤s54中得到的前向切片,对得到的前向切片进行分析确定指针变量正确使用路径,即指针赋值后经判空使用的路径,该正确使用路径为图6中虚线框中所示部分。分析图6所示的vdg图可以得到,指针变量正确使用的控制依赖条件为条件3:(flag==0)||(pint<3),对该控制依赖条件取反可以得到条件4:!(flag==0)&&!(pint<3),而flag的控制依赖条件为条件5:((!(pint>=4))=>flag==1)&&((pint>=4)=>flag==0)。

s56、将指针未判空使用的条件输入约束求解器。

s57、判断约束求解器是否输出求解结果,如果是,则执行步骤s58,否则,执行步骤s54。

针对图4所示的待检测程序语句,将条件5和条件4输入z3约束求解器,z3解出满足条件5和条件4的值为pint=3,因此,可以确定图4所示的待检测程序语句存在指针未判空直接使用的错误,即在pint=3时pointer为nil,且没有判空。

s58、判断待检测程序中是否存在指针判空语句,如果是,则执行步骤s59,否则,执行步骤s510。

s59、根据该条使用语句的位置信息,在该条使用语句之前插入待检测程序中包含的指针判空语句,返回执行步骤s54。

本例中,存在其它指针判空语句,例如:

ifpointer==nilthen

return0

end

据此,可以在“returnpointer:getintval()”之前插入指针判空条件语句,条件语句中的return语句采用其他指针判空语句中的return语句,本例中即为“return0”。

s510、输出存在指针未判空直接使用的提示信息,并返回执行步骤s54。

较佳地,在输出的提示信息中,可以包括该条使用语句的位置信息。

本发明实施例中,针对指针变量通过检查从赋值语句到直接使用过程中是否有路径可达(不包括判空语句),如果不可达,说明从指针赋值到直接使用之间必存在判空语句,否则存在指针使用未判空的情况,在这条路径的使用指针语句之前插入判断指针为空的语句,if语句中的return语句采用待检测程序语句中指针判空中的return语句,如果待检测程序语句中不存在其它指针判空语句,可以只是输出提示信息,并不修复,以免引入错误。

基于同一发明构思,本发明实施例中还提供了一种程序语句错误检测装置,由于上述装置解决问题的原理与程序语句错误检测方法相似,因此上述装置的实施可以参见方法的实施,重复之处不再赘述。

如图7所示,其为本发明实施例提供的程序语句错误检测装置的结构示意图,可以包括:

识别单元71,用于遍历待检测程序语句,识别所述待检测程序语句中包含的变量;

确定单元72,用于针对识别出的每一变量,确定包含该变量的程序语句的语句类型和包含该变量的程序语句的位置信息,所述语句类型包括使用语句和赋值语句;

分析单元73,用于针对每一使用语句,根据该使用语句的位置信息和该使用语句中包含的被使用变量所对应的赋值语句的位置信息,分析相应的赋值语句和使用语句之间包含的程序语句得到所述被使用变量使用的依赖条件;

判断单元74,用于根据所述分析单元73得到的依赖条件判断被使用变量是否存在使用错误。

可选地,本发明实施例提供的程序语句错误检测装置还可以包括ast构造单元,其中:

所述ast构造单元,用于在所述识别单元遍历待检测程序语句之前,构造所述待检测程序语句的ast;

所述识别单元,具体用于遍历所述ast,识别所述ast中包含的预设标识符;从包含所述预设标识符的程序语句中提取所述待检测程序语句中包含的变量。

较佳地,所述依赖条件包括直接依赖条件和控制依赖条件。

较佳地,所述判断单元74,具体包括:

vdg构造子单元,用于根据所述直接依赖条件和控制依赖条件,构造被使用变量的值依赖图vdg;

切片子单元,用于在所述vdg中,针对每一使用语句,对该使用语句进行前向切片,直至到达该使用语句中包含的被使用变量所对应的赋值语句为止;

分析子单元,用于对所述前向切片进行分析得到分析结果;

判断子单元,用于根据所述分析结果,判断被使用变量是否存在使用错误。

较佳地,所述分析子单元,具体用于对所述前向切片进行分析,确定被使用变量的正确使用路径;从所述正确使用路径中查找被使用变量的控制依赖条件;并确定所述控制依赖条件的反向条件。

较佳地,如果所述控制依赖条件有多个;则所述分析子单元,具体用于确定多个控制依赖条件的并集的反向条件。

较佳地,,所述判断子单元,具体用于将所述反向条件输入约束求解器;如果所述约束求解器输出针对所述反向条件的求解结果,则确定被使用变量存在使用错误,如果所述约束求解器未输出针对所述反向条件的求解结果,则确定被使用变量不存在使用错误。

可选地,本发明实施例提供的程序语句错误检测装置还可以包括:

修复单元,用于如果所述判断单元判断出被使用变量存在使用错误,则针对判断出的变量使用错误进行修复;或者

提示单元,用于输出变量存在使用错误的提示信息。

可选地,所述提示信息中包含有存在变量使用错误的使用语句的位置信息。

较佳地,本发明实施例中涉及的变量包括指针变量;以及变量使用错误包括指针变量未判空使用。所述修复单元,具体用于针对判断出的指针未判空使用错误,根据存在指针未判空使用错误的使用语句的位置信息,在相应的使用语句之前插入指针判空条件语句。

为了描述的方便,以上各部分按照功能划分为各模块(或单元)分别描述。当然,在实施本发明时可以把各模块(或单元)的功能在同一个或多个软件或硬件中实现。

在一些可能的实施方式中,根据本发明的程序语句错误检测装置可以包括至少一个处理单元、以及至少一个存储单元。其中,所述存储单元存储有程序代码,当所述程序代码被所述处理单元执行时,使得所述处理单元执行本说明书中描述的根据本发明各种示例性实施方式的程序语句错误检测方法中的各种步骤。例如,所述处理单元可以执行如图1中所示的步骤s11,遍历待检测程序语句,识别待检测程序语句中包含的变量,步骤s12,针对每一变量,确定包含该变量的程序语句的语句类型和包含该变量的程序语句的位置信息,所述语句类型包括使用语句和赋值语句;步骤s13,针对每一使用语句,根据该使用语句的位置信息和该使用语句中包含的被使用变量所对应的赋值语句的位置信息,分析相应的赋值语句和使用语句之间包含的程序语句得到所述被使用变量使用的依赖条件,以及步骤s14、根据所述依赖条件判断被使用变量是否存在使用错误。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1