语言的变量检测方法和装置与流程

文档序号:11250678阅读:575来源:国知局
语言的变量检测方法和装置与流程

本发明涉及计算机领域,具体而言,涉及一种语言的变量检测方法和装置。



背景技术:

在现有的语言变量检测技术中,采用对c语言变量的未初始化使用进行检测的技术方案,可以利用符号表、抽象语法树、控制流程图等分析未初始化变量。其中,符号表是一种用于语言翻译器中的数据结构。在符号表中,程序源代码中的每个标识符都和它的声明或使用信息绑定在一起,比如,数据类型,作用域以及内存地址等。抽象语法树所对应的树状结构,控制流程图为以图形的方式表达在问题中信息的变换和传递过程,为数据流联系的各种概念的组合,用分解及抽象手段来控制需求分析的复杂性,采用分层的数据流程图来表示一个复杂的系统。

现有技术支持c语言的变量未初始化使用检测,但不支持脚本语言的变量未初始化使用检测,同时也没有考虑条件的满足性,容易报错,导致检测误报率很高,因而语言检测的准确率低,进而导致语言的变量检测效率低下。

另外,在脚本语言的使用过程中,经常出现的典型错误是脚本语言的变量的未初始化使用。由于变量的未初始化使用只有在运行时发生崩溃才会发现这个错误,而对于游戏中使用大量脚本语言代码的情况,靠运行来修改错误,显然非常耗时,降低了语言的变量检测效率。

针对上述的语言的变量检测效率低下的问题,目前尚未提出有效的解决方案。



技术实现要素:

本发明实施例提供了一种语言的变量检测方法和装置,以至少解决相关技术中语言的变量检测效率低下的技术问题。

根据本发明实施例的一个方面,提供了一种语言的变量检测方法。该语言的变量检测方法包括:获取脚本语言的目标源代码中的目标变量;获取目标变量的依赖关系,其中,依赖关系用于表示目标变量中的定义变量与使用变量之间的关系;根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件,其中,目标条件用于约束目标变量为未赋值变量;当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量。

根据本发明实施例的另一方面,还提供了一种语言的变量检测装置。该语言的变量检测装置包括:第一获取单元,用于获取脚本语言的目标源代码中的目标变量;第二获取单元,用于获取目标变量的依赖关系,其中,依赖关系用于表示目标变量中的定义变量与使用变量之间的关系;切片分析单元,用于根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件,其中,目标条件用于约束目标变量为未赋值变量;第一确定单元,用于当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量。

在本发明实施例中,采用获取脚本语言的目标源代码中的目标变量;获取目标变量的依赖关系,其中,依赖关系用于表示目标变量中的定义变量与使用变量之间的关系;根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件,其中,目标条件用于约束目标变量为未赋值变量;当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量,由于采用脚本语言的变量未初始化使用检测,通过对目标变量做切片分析,同时考虑求解条件的可满足性,达到了对脚本语言进行检测的目的,从而实现了提高变量检测的效率的技术效果,进而解决了相关技术中语言的变量检测效率低下的技术问题。

附图说明

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

图1是根据本发明实施例的语言的变量检测方法的硬件环境的示意图;

图2是根据本发明实施例的一种语言的变量检测方法的流程图;

图3是根据本发明实施例的一种获取脚本语言的目标源代码中的目标变量方法的流程图;

图4是根据本发明实施例的一种对值依赖图上的目标变量所属的目标语句进行切片分析的方法的流程图;

图5是根据本发明实施例的一种对目标变量所属的目标语句进行切片分析的方法的流程图;

图6是根据本发明实施例的一种对目标变量所属的目标语句进行切片分析的方法的流程图;

图7是根据本发明实施例的另一种语言的变量检测方法的流程图;

图8是根据本发明实施例的一种vdg的示意图;

图9是根据本发明实施例的另一种vdg的示意图;

图10是根据本发明实施例的另一种vdg的示意图;

图11是根据本发明实施例的一种语言的变量检测装置的示意图;

图12是根据本发明实施例的另一种语言的变量检测装置的示意图;

图13是根据本发明实施例的另一种语言的变量检测装置的示意图;

图14是根据本发明实施例的另一种语言的变量检测装置的示意图;

图15是根据本发明实施例的另一种语言的变量检测装置的示意图;

图16是根据本发明实施例的另一种语言的变量检测装置的示意图;以及

图17是根据本发明实施例的一种终端的结构框图。

具体实施方式

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

实施例1

根据本发明实施例,提供了一种语言的变量检测方法的实施例。

可选地,在本实施例中,上述语言的变量检测方法可以应用于如图1所示的由服务器102和终端104所构成的硬件环境中。图1是根据本发明实施例的语言的变量检测方法的硬件环境的示意图。如图1所示,服务器102通过网络与终端104进行连接,上述网络包括但不限于:广域网、城域网或局域网,终端104并不限定于pc、手机、平板电脑等。本发明实施例的语言的变量检测方法可以由服务器102来执行,也可以由终端104来执行,还可以是由服务器102和终端104共同执行。其中,终端104执行本发明实施例的语言的变量检测方法也可以是由安装在其上的客户端来执行。

图2是根据本发明实施例的一种语言的变量检测方法的流程图。如图2所示,该方法可以包括以下步骤:

步骤s202,获取脚本语言的目标源代码中的目标变量。

在本申请上述步骤s202提供的技术方案中,获取脚本语言的目标源代码中的目标变量。

该实施例的脚本语言可以为lua脚本语言,lua脚本语言为一个小巧的脚本语言,主要是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能,由于lua支持热加载,游戏中后台可以采用lua作为脚本语言。

获取脚本语言的目标源代码,该目标源代码具有源程序中的语句,以及每条语句中的定义变量和使用变量。获取目标源代码中的目标变量,该目标变量包括定义变量和使用变量。

步骤s204,获取目标变量的依赖关系。

在本申请上述步骤s204提供的技术方案中,获取目标变量的依赖关系,其中,依赖关系用于表示目标变量中的定义变量与使用变量之间的关系。

在获取脚本语言的目标源代码中的目标变量之后,获取目标变量的依赖关系。可以构造目标源代码的抽象语法树(abstractsyntaxtree,简称为ast),该抽象语法树为源代码语法所对应的树状结构,为程序的一种中间表示形式。该抽象语法树上的每个节点可以表示源代码的语句、变量等,也即,源代码中的每条语句都在抽象语法树中都有对应的节点。

可选地,遍历上述抽象语法树,找到源代码程序中每条语句中的定义变量和使用变量,可以根据定义的变量和使用变量构造值依赖图(valuedependencegraph,简称为vdg),该值依赖图用于表示变量定义、变量使用之间的依赖关系。值依赖图上的节点可以与抽象语法树上的节点相同,为用于保存变量未初始化检测过程中有用的节点,是程序中的语句和程序入口,值依赖图上的节点之间的连线可以用于表示节点之间的依赖关系,包括了vdg连线上所含变量的由定义到使用的关系,这种依赖关系是由条件语句到达的,也即,是否到达与条件语句有关。可选地,需要通过相关算法计算vdg连线上两点之间的到达条件,称为两点之间的守卫(guard),从而实现了获取目标变量的依赖关系的目的。

步骤s206,根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件。

在本申请上述步骤s206提供的技术方案中,根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件,其中,目标条件用于约束目标变量为未赋值变量。

该实施例的切片为和源程序中的变量有关的所有语句,可以为条件语句,也可以为赋值语句等。切片分析用于从源程序中抽取对源程序中特定点上的特定变量具有影响的语句以及控制条件,其中,程序的后向切片包含了所有与变量有直接或间接影响的语句和控制条件,对有影响的语句和控制条件组成新的程序,该过程称作切片分析,然后通过分析切片来分析源程序的行为。

该实施例的目标语句可以为条件语句、赋值语句等,在获取目标变量的依赖关系之后,根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件。

可选地,在值依赖图上对每个声明的目标变量做切片分析。首先在值依赖图中寻找所有目标变量的声明点,其中,声明点为所有目标变量在值依赖图中声明的位置,将其作为起始点进行后向切片。此时对于每个声明的目标变量,都将得到一个对应的切片,切片中的节点为与该声明的目标变量的值有关的使用点。

在值依赖图上,从声明点到使用点之间的路径为“声明-使用路径”,该路径中不包括其它对声明的目标变量的赋值语句。在做后向切片之后,分析切片,对于每条“声明-使用”路径计算其目标条件,该目标条件可以表示为目标变量之间的依赖关系,也即,目标变量从声明到使用的到达条件。可选地,当一个目标变量依赖于另一个目标变量的到达条件时,可以进行约束二次求精,得到目标变量的目标条件,该目标条件为一种约束条件,用于约束目标变量为未赋值变量,不包括其它对声明的目标变量的赋值语句。

步骤s208,当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量。

在本申请上述步骤s208提供的技术方案中,当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量。

在根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件之后,对目标变量求解出满足目标条件的求解结果,可以利用求解器求解目标条件的可满足性,也即,求解出满足目标条件的值,该求解器可以为smtsolver,从而求解出满足目标条件的未赋值的变量使用点,避免了目标变量的未初始化使用只有在运行、发生崩溃时才发现的问题,避免了靠运行来修改错误的问题,提高了变量未初始化使用检测的准确性和效率。

举例而言,当参数param的目标条件为!(param>8)and!(param<4)时,目标变量var未被赋初值,smtsolver可解出该满足该约束的值为4、5、6、7、8,所以目标变量var为未初始化变量,也即,为变量未赋值使用的情况。

当对目标变量未求解出满足目标条件的求解结果时,确定目标变量不为未初始化变量,也即,smtsolver解不出满足该目标条件的值,所以目标条件不可到达,不存在目标变量的未赋值使用情况。

通过上述步骤s202至步骤s208,通过获取脚本语言的目标源代码中的目标变量;获取目标变量的依赖关系,其中,依赖关系用于表示目标变量中的定义变量与使用变量之间的关系;根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件,其中,目标条件用于约束目标变量为未赋值变量;当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量,由于采用脚本语言的变量未初始化使用检测,通过对目标变量做切片分析,同时考虑求解条件的可满足性,达到了对脚本语言进行检测的目的,从而实现了提高变量检测的效率的技术效果,进而解决了相关技术中语言的变量检测效率低下的技术问题。

作为一种可选的实施方式,步骤s202,获取脚本语言的目标源代码中的目标变量包括:构造脚本语言的目标源代码的抽象语法树;遍历抽象语法树,得到每条语句中的定义变量和使用变量。

图3是根据本发明实施例的一种获取脚本语言的目标源代码中的目标变量方法的流程图。如图3所示,该方法包括以下步骤:

步骤s301,构造脚本语言的目标源代码的抽象语法树。

在本申请上述步骤s301提供的技术方案中,构造脚本语言的目标源代码的抽象语法树,其中,抽象语法树上的每个节点与目标源代码中的每条语句相对应。

抽象语法树为用于表示源代码语法所对应的树状结构,抽象语法树上的每个节点可以表示源代码的语句、变量等,也即,源代码中的每条语句都在抽象语法树中都有对应的节点。在获取脚本语言的目标源代码中的目标变量时,获取脚本语言的目标源代码,根据目标源代码构造抽象语法树。可选地,当脚本语言为lua脚本语言时,可以利用分析程序(parser)工具lua-parser构造出lua的ast树,ast树上的每个节点表示源代码的一种结构,源代码中的每条语句都在ast树中有对应的节点。

步骤s302,遍历抽象语法树,得到每条语句中的定义变量和使用变量。

在本申请上述步骤s302提供的技术方案中,遍历抽象语法树,得到每条语句中的定义变量和使用变量,其中,目标变量包括定义变量和使用变量。

在构造脚本语言的目标源代码的抽象语法树之后,遍历抽象语法树,找到程序中每条语句中的定义变量和使用变量,并分析每条语句的定义变量和使用变量,可以根据每条语句中的定义变量和使用变量构造出值依赖图,确定节点之间的依赖关系。

该实施例通过构造脚本语言的目标源代码的抽象语法树,其中,抽象语法树上的每个节点与目标源代码中的每条语句相对应;遍历抽象语法树,得到每条语句中的定义变量和使用变量,其中,目标变量包括定义变量和使用变量,实现了获取脚本语言的目标源代码中的目标变量的目的,进而获取目标变量的依赖关系,其中,依赖关系用于表示目标变量中的定义变量与使用变量之间的关系;根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件,其中,目标条件用于约束目标变量为未赋值变量;当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量,实现了提高变量检测的效率的技术效果。

作为一种可选的实施方式,在获取目标变量的依赖关系之后,该变量检测方法还包括:将目标源代码中的语句确定为多个目标节点;通过依赖关系连接多个目标节点,得到值依赖图;步骤s206,根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件包括:对值依赖图上的目标变量所属的目标语句进行切片分析,得到目标变量的目标条件。

值依赖图上的节点是程序中的语句,而节点之间的连线则代表节点之间的依赖关系,也即,连线上的两个节点之间所包含的变量由定义到使用的关系。在获取目标变量的依赖关系之后,将目标源代码中的语句确定为值依赖图的多个目标节点,通过依赖关系连接多个目标节点,从而构造出值依赖图;在值依赖图上找出所有目标变量的声明点,将其作为起始点作后向切片,此时对于每个声明的目标变量,都将得到一个对应的切片,切片中的节点为与该变量的值有关的使用点,分析切片,对不包括其它声明变量的赋值语句的路径进行计算,得到目标条件,从而实现了对值依赖图上的目标变量所属的目标语句进行切片分析,得到目标变量的目标条件。

作为一种可选的实施方式,对值依赖图上的目标变量所属的目标语句进行切片分析,得到目标变量的目标条件包括:查找值依赖图上的所有目标变量的声明点;从声明点开始执行后向切片操作,得到目标变量所属的目标语句;在值依赖图上确定由声明点到使用点的目标路径;计算目标路径上的目标条件。

图4是根据本发明实施例的一种对值依赖图上的目标变量所属的目标语句进行切片分析的方法的流程图。如图4所示,该方法包括以下步骤:

步骤s401,查找值依赖图上的所有目标变量的声明点。

在本申请上述步骤s401提供的技术方案中,查找值依赖图上的所有目标变量的声明点。

值依赖图上具有声明变量的位置,在获取目标变量的依赖关系之后,查找值依赖图上的所有目标变量的声明点,将该声明点确定为切向分析的起始点。

步骤s402,从声明点开始执行后向切片操作,得到目标变量所属的目标语句。

在本申请上述步骤s402提供的技术方案中,从声明点开始执行后向切片操作,得到目标变量所属的目标语句,其中,值依赖图上与目标语句对应的节点为与目标变量的值有关的使用点。

在查找值依赖图上的所有目标变量的声明点之后,从声明点开始执行后向切片操作,此时对于每个声明的变量,都将得到一个对应的切片,得到目标变量所属的目标语句。值依赖图上与目标语句对应的节点为与目标变量的值有关的使用点,也即,切片中的节点为与该变量的值有关的使用点。

步骤s403,在值依赖图上确定由声明点到使用点的目标路径。

在本申请上述步骤s403提供的技术方案中,在值依赖图上确定由声明点到使用点的目标路径,其中,目标路径不包括目标源代码中已经对目标变量赋值过的语句。

在从声明点开始执行后向切片操作,得到目标变量所属的目标语句之后,在值依赖图上确定由声明点到使用点的目标路径,也即,确定“声明-使用”路径,该目标路径中不包括目标源代码中已经对目标变量声明过的语句,也即,不包括其它对声明变量进行赋值的语句。

步骤s404,计算目标路径上的目标条件。

在本申请上述步骤s404提供的技术方案中,计算目标路径上的目标条件。

在确定由声明点到使用点的目标路径之后,计算目标路径上的目标条件,也即,计算从声明点到使用点之间的到达条件,包含了变量由定义到使用的关系。

举例而言,变量“声明-使用”的到达条件是:!(param>8)and!(param<=8),可以进一步通过smtsolver解算器求解满足该到达条件的值。

该实施例通过查找值依赖图上的所有目标变量的声明点;从声明点开始执行后向切片操作,得到目标变量所属的目标语句,其中,值依赖图上与目标语句对应的节点为与目标变量的值有关的使用点;在值依赖图上确定由声明点到使用点的目标路径,其中,目标路径不包括目标源代码中已经对目标变量赋值过的语句;计算目标路径上的目标条件,实现了对值依赖图上的目标变量所属的目标语句进行切片分析,得到目标变量的目标条件的目的,进而当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量,实现了提高变量检测的效率的技术效果。

作为一种可选的实施方式,步骤s206,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件包括:获取目标变量所属的第一目标语句,其中,第一目标语句包括目标变量的第一赋值条件;确定与第一赋值条件相反的赋值条件为第一目标条件;获取目标变量所属的第二目标语句,其中,第二目标语句包括目标变量的第二赋值条件;确定与第二赋值条件相反的赋值条件为第二目标条件;确定用于在第一目标条件下且在第二目标条件下对目标变量执行与逻辑运算的条件为目标条件;其中,步骤s208,当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量包括:当对目标变量求解出满足第一目标条件且满足第二目标条件的求解结果时,确定目标变量为未初始化变量。

图5是根据本发明实施例的一种对目标变量所属的目标语句进行切片分析的方法的流程图。如图5所示,该方法包括以下步骤:

步骤s501,获取目标变量所属的第一目标语句,其中,第一目标语句包括目标变量的第一赋值条件。

在本申请上述步骤s501提供的技术方案中,获取目标变量所属的第一目标语句,其中,第一目标语句包括目标变量的第一赋值条件。

目标变量可以所属多个语句。在根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件时,获取目标变量所属的第一目标语句,该第一目标语句包括了目标变量的第一赋值条件,比如,第一目标语句为“ifparam>8thenvar=4”,也即,在“param>8”的第一赋值条件下,为目标变量var赋值4。

步骤s502,确定与第一赋值条件相反的赋值条件为第一目标条件。

在本申请上述步骤s502提供的技术方案中,确定与第一赋值条件相反的赋值条件为第一目标条件。

在获取目标变量所属的第一目标语句之后,确定与第一赋值条件相反的赋值条件为第一目标条件。

举例而言,第一目标语句为“ifparam>8thenvar=4”,第一赋值条件为“param>8”,确定与“param>8”相反的条件“!(param>8)”为第一目标条件。

步骤s503,获取目标变量所属的第二目标语句,其中,第二目标语句包括目标变量的第二赋值条件。

在本申请上述步骤s503提供的技术方案中,获取目标变量所属的第二目标语句,其中,第二目标语句包括目标变量的第二赋值条件。

获取目标变量所属的第二目标语句,该第二目标语句包括了目标变量的第二赋值条件。

举例而言,第一目标语句为“ifparam<4thenvar=2”,也即,在“param<4”的第二赋值条件下,为目标变量var赋值2。

步骤s504,确定与第二赋值条件相反的赋值条件为第二目标条件。

在本申请上述步骤s504提供的技术方案中,确定与第二赋值条件相反的赋值条件为第二目标条件。

在获取目标变量所属的第二目标语句之后,确定与第二赋值条件相反的赋值条件为第二目标条件。

举例而言,第一目标语句为“ifparam<4thenvar=2”,第二赋值条件为“param<4,确定与“param<4”相反的条件“!(param<4)”为第二目标条件。

可选地,该实施例先执行步骤s503、步骤s504,再执行步骤s501、步骤s502。

步骤s505,确定用于在第一目标条件下且在第二目标条件下对目标变量执行与逻辑运算的条件为目标条件。

在本申请上述步骤s505提供的技术方案中,确定用于在第一目标条件下且在第二目标条件下对目标变量执行与逻辑运算的条件为目标条件。

在确定与第一赋值条件相反的赋值条件为第一目标条件,确定与第二赋值条件相反的赋值条件为第二目标条件之后,确定用于在第一目标条件下且在第二目标条件下对目标变量执行与逻辑运算的条件为目标条件。

举例而言,第一目标条件为“!(param>8)”,第二目标条件为“!(param<4)”,对目标变量var执行与逻辑运算的条件为目标条件,也即,目标条件为!(param>8)and!(param<4)。

在当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量时,当对目标变量求解出满足第一目标条件且满足第二目标条件的求解结果时,确定目标变量为未初始化变量,可以通过smtsolver解算器解出该满足该约束的值,比如,求解出的值为4、5、6、7、8,所以存在目标变量var的未赋值使用情况。

该实施例通过获取目标变量所属的第一目标语句,其中,第一目标语句包括目标变量的第一赋值条件;确定与第一赋值条件相反的赋值条件为第一目标条件;获取目标变量所属的第二目标语句,其中,第二目标语句包括目标变量的第二赋值条件;确定与第二赋值条件相反的赋值条件为第二目标条件;确定用于在第一目标条件下且在第二目标条件下对目标变量执行与逻辑运算的条件为目标条件;当对目标变量求解出满足第一目标条件,实现了达到目标变量所属的目标语句进行切片分析,得到目标变量的目标条件的目的,实现了提高变量检测的效率的技术效果。

作为一种可选的实施方式,步骤s206,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件包括:获取第一目标变量所属的第一目标语句,其中,第一目标语句包括第一目标变量的第一赋值条件;确定与第一赋值条件相反的赋值条件为第一目标条件;获取第一目标变量所属的第二目标语句,其中,第二目标语句包括第一目标变量的第二赋值条件,第二赋值条件由第一赋值条件对应的第二目标变量确定;确定与第二赋值条件相反的赋值条件为第二目标条件;确定用于在第一目标条件下且在第二目标条件下对第一目标变量执行与逻辑运算的条件为第三目标条件;确定第二赋值条件的第四目标条件,第四目标条件为第二目标变量的取值条件;确定用于在第三目标条件下且在第四目标条件下对第一目标变量执行与逻辑运算的条件为目标条件;当对目标变量求解出满足第三目标条件且满足第四目标条件的求解结果时,确定目标变量为未初始化变量。

图6是根据本发明实施例的一种对目标变量所属的目标语句进行切片分析的方法的流程图。如图6所示,该方法包括以下步骤:

步骤s601,获取第一目标变量所属的第一目标语句,其中,第一目标语句包括第一目标变量的第一赋值条件。

在本申请上述步骤s601提供的技术方案中,获取第一目标变量所属的第一目标语句,其中,第一目标语句包括第一目标变量的第一赋值条件。

在对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件时,获取第一目标变量所属的第一目标语句。

举例而言,第一目标语句为“ifparam==1thenvar=4”,也即,在“param==1”的第一赋值条件下,为第一目标变量var赋值4。

步骤s602,确定与第一赋值条件相反的赋值条件为第一目标条件。

在本申请上述步骤s602提供的技术方案中,确定与第一赋值条件相反的赋值条件为第一目标条件。

在获取第一目标变量所属的第一目标语句之后,确定与第一赋值条件相反的赋值条件为第一目标条件。

举例而言,第一目标语句为“ifparam==1thenvar=4”,第一赋值条件为”ifparam==1”,确定与“ifparam==1”相反的条件“!(param==1)”为第一目标条件。

步骤s603,获取第一目标变量所属的第二目标语句,其中,第二目标语句包括第一目标变量的第二赋值条件,第二赋值条件由第一赋值条件对应的第二目标变量确定。

在本申请上述步骤s603提供的技术方案中,获取第一目标变量所属的第二目标语句,其中,第二目标语句包括第一目标变量的第二赋值条件,第二赋值条件由第一赋值条件对应的第二目标变量确定。

在对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件时,获取第一目标变量所属的第二目标语句。

举例而言,第二目标语句为“ifflag==1thenvar=3”,也即,在第二赋值条件“flag==1”下,为第一目标变量var赋值3。该第二赋值条件“flag==1”由第一赋值条件对应的第二目标变量flag确定,比如,第一赋值条件为“ifparam==1”,则第二赋值条件中的flag的取值由“ifparam==1thenflag=0”,“localflag=1”中的第二目标变量确定。

步骤s604,确定与第二赋值条件相反的赋值条件为第二目标条件。

在本申请上述步骤s604提供的技术方案中,确定与第二赋值条件相反的赋值条件为第二目标条件。

在获取第一目标变量所属的第二目标语句之后,确定与第二赋值条件相反的赋值条件为第二目标条件。

举例而言,第二目标语句为“ifflag==1thenvar=3”,第二赋值条件为“ifflag==1”,确定与“ifflag==1”相反的条件“!(flag==1)”为第一目标条件。

步骤s605,确定用于在第一目标条件下且在第二目标条件下对第一目标变量执行与逻辑运算的条件为第三目标条件。

在本申请上述步骤s605提供的技术方案中,确定用于在第一目标条件下且在第二目标条件下对第一目标变量和第二目标变量执行与逻辑运算的条件为第三目标条件。

在确定与第一赋值条件相反的赋值条件为第一目标条件,确定与第二赋值条件相反的赋值条件为第二目标条件之后,确定用于在第一目标条件下且在第二目标条件下对第一目标变量执行与逻辑运算的条件为第三目标条件。

举例而言,第一目标条件为“!(param==1)”,第二目标条件为“!(flag==1)”,对第一目标变量var执行与逻辑运算的条件为第三目标条件,也即,第三目标条件为“!(param==1)and!(flag==1)”。

步骤s606,确定第二赋值条件的第四目标条件,其中,第四目标条件为第二目标变量的取值条件。

在本申请上述步骤s606提供的技术方案中,确定第二赋值条件的第四目标条件,其中,第四目标条件为第二目标变量的取值条件。

确定第二赋值条件的第四目标条件,比如,确定第二赋值条件“ifflag==1”的第四目标条件,第四目标条件为第二目标变量的取值条件,比如,第四目标条件可以为((!(param==1))=>flag==1)&&((param==1)=>flag==0),也即,在!(param==1)的条件下,第二目标变量flag取值为1。在(param==1)的条件下,flag取值为0。

步骤s607,确定用于在第三目标条件下且在第四目标条件下对第一目标变量执行与逻辑运算的条件为目标条件。

在本申请上述步骤s607提供的技术方案中,确定用于在第三目标条件下且在第四目标条件下对第一目标变量和第二目标变量执行与逻辑运算的条件为目标条件。

在确定第二赋值条件的第四目标条件之后,确定用于在第三目标条件下且在第四目标条件下对第一目标变量执行与逻辑运算的条件为目标条件。

举例而言,第三目标条件为“!(param==1)and!(flag==1)”,第四目标条件可以为((!(param==1))=>flag==1)&&((param==1)=>flag==0),则目标条件为第三目标条件&&第四目标条件。smtsolver解不出满足该约束的值,所以该目标条件不可到达,即不存在var的未赋值使用。

其中,步骤s208,当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量包括:当对目标变量求解出满足第三目标条件且满足第四目标条件的求解结果时,确定目标变量为未初始化变量。

该实施例通过获取第一目标变量所属的第一目标语句,其中,第一目标语句包括第一目标变量的第一赋值条件;确定与第一赋值条件相反的赋值条件为第一目标条件;获取第一目标变量所属的第二目标语句,其中,第二目标语句包括第一目标变量的第二赋值条件,第二赋值条件由第一赋值条件对应的第二目标变量确定;确定与第二赋值条件相反的赋值条件为第二目标条件;确定用于在第一目标条件下且在第二目标条件下对第一目标变量执行与逻辑运算的条件为第三目标条件;确定第二赋值条件的第四目标条件,其中,第四目标条件为第二目标变量的取值目标条件;确定用于在第三目标条件下且在第四目标条件下对第一目标变量执行与逻辑运算的条件为目标条件;当对目标变量求解出满足第三目标条件且满足第四目标条件的求解结果时,确定目标变量为未初始化变量,实现对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件的目的。

作为一种可选的实施方式,在步骤s206,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件之后,当未对目标变量求解出满足目标条件的求解结果时,确定目标变量为初始化变量。

smtsolver解不出满足该约束的值,所以该目标条件不可到达,即不存在var的未赋值使用。

该实施例采用脚本语言的变量未初始化使用检测,通过对目标变量做切片分析,同时考虑求解条件的可满足性,达到了对脚本语言进行检测的目的,从而实现了提高变量检测的效率的技术效果,进而解决了相关技术中语言的变量检测效率低下的技术问题。

实施例2

下面结合优选的实施例对本发明的技术方案进行说明。

在该实施例中,因为lua支持热加载,游戏中后台普遍采用lua作为脚本语言。在lua使用过程中一个经常出现的典型错误是lua变量的未初始化使用,因为变量的未初始化使用只有在运行时发生崩溃才会发现这个错误,而对于游戏中使用大量lua代码的情况,靠运行来修改错误,显然非常耗时,降低变量检测的效率,影响了需要寻求其它的解决途径。

该实施例为一种通过静态分析检测出lua代码中变量未初始化使用的情况,报告未初始化变量,可以给予开发人员警告,从而一次性修复所有这类错误,大大节省开发时间。该静态分析检测方法通过遍历抽象语法树,构造变量的值依赖图,然后在vdg图上对每个声明的变量做切片分析,利用smtsolver求解条件识别未赋值的变量使用点。

图7是根据本发明实施例的另一种语言的变量检测方法的流程图。如图7所示,该方法包括以下步骤:

步骤s701,将源代码生成ast树。

该实施例的脚本语言为lua脚本语言,利用lua的parser分析程序,可以语法剖析程式工具lua-parser构造出lua的ast树,其中,ast树上的每个节点表示源代码的一种结构,源代码中的每条语句都在ast树中有对应的节点。

步骤s702,遍历ast树,分析每条语句的变量。

在将源代码生成ast树之后,遍历ast树,分析ast树上的每条语句的变量,找到程序中每条语句中定义的变量和使用的变量。

步骤s703,根据每条语句的变量构造vdg树。

在遍历ast树,分析每条语句的变量之后,根据每条语句的变量构造vdg树。vdg图的节点是程序中的语句和程序入口,而节点之间的连线则代表节点间的依赖关系。该依赖关系包括了两个节点间所含变量的由定义到使用的关系。这种依赖关系是有条件语句到达的,也即,是否到达与条件语句有关,此时需要通过相关算法计算两点之间的到达条件,也称为两点之间的守卫。

步骤s704,根据vdg树构造后向切片。

在根据每条语句的变量构造vdg树之后,根据vdg树构造后向切片。首先在vdg图中寻找所有变量的声明点,将其作为起始点作后向切片。此时对于每个声明的变量,都将得到一个对应的切片,切片中的节点为与该变量的值有关的使用点,其中,切片为与变量有关的所有语句。

步骤s705,分析切片,构造“声明-使用”链。

在根据vdg树构造后向切片之后,分析切片,构造“声明-使用”链,也即,“声明-使用”路径。对于每条“声明-使用”路径,不包括其他对声明变量的赋值语句。

步骤s706,二次约束求精。

在分析切片,构造“声明-使用”链之后,进行约束二次求精。

举例而言,变量var“声明-使用”的到达条件是condition1:!(param==1)and!(flag==1),而flag又依赖于param,所以需要二次求精。在vdg图中寻找flag的switch节点(switchnode),获取其取值以及到达条件,flag的取值条件为condition2:((!(param==1))=>flag==1)&&((param==1)=>flag==0),将condtion1&&condition2一起进行约束求解。smtsolver解不出满足该约束的值,所以该“声明-使用”不可到达,也即,不存在var的未赋值使用。

步骤s707,对每条链进行求解。

在分析切片,构造“声明-使用”链之后,或者在二次约束求精之后,对每条链进行求解,也即,对每条“声明-使用”链计算其到达条件,可以采用smtsolver解出满足该到达条件的值。

步骤s708,报告未初始化使用变量。

在对每条链进行求解之后,报告未初始化使用变量,也即,在得到所有可达的未赋值的使用点后,输出这些点以及相关的缺陷跟踪,还可以继续执行步骤705,分析切片,构造“声明-使用”链。

该实施例通过将源代码生成ast树,遍历ast树,分析每条语句的变量,根据每条语句的变量构造vdg树,根据vdg树构造后向切片,分析切片,构造“声明-使用”链,二次约束求精,对每条链进行求解,报告未初始化使用变量,实现了通过静态分析检测出lua代码中变量未初始化使用的情况,给予开发人员警告,从而一次性修复所有这类错误,大大节省开发时间。

下面举例说明本文提出的基于vdg图的静态分析方法的可行性。

代码1是根据本发明实施例的一种存在变量未初始化的示意代码。

代码2是根据本发明实施例的一种无变量未初始化的示意代码。

代码1所示为存在变量未初始化使用的情况,其中,当参数param>=4andparam<=8时,变量var未被赋初值,而代码2所示代码为不存在变量未初始化使用的代码,无论param取何值,var都可以被赋初值。

图8是根据本发明实施例的一种vdg的示意图。如图8所示,该vdg图与代码1相对应,输入变量var,在param>8的条件下,var=4,在param<4的条件下,var=2,返回var+1。该变量var“声明-使用”的到达(不经过其他对var的赋值语句)条件是:!(param>8)and!(param<4),smtsolver可解出该满足该约束的值,比如,4、5、6、7、8,所以存在变量var的未赋值使用。

图9是根据本发明实施例的另一种vdg的示意图。如图9所示,该vdg图与代码2相对应,输入变量var,在param>8的条件下,var=4,在param<=8的条件下,var=2,返回var+1。变量var“声明-使用”的到达条件是:!(param>8)and!(param<=8),smtsolver解不出满足该约束的值,所以该“声明-使用”不可到达,所以不存在var的未赋值使用,分析方法反馈的结果与实际情况相符。

另外,该实施例的方法也适用于代码存在需要约束条件二次求精的情况,下面对其进行举例说明。

代码3是根据本发明实施例的一种需要约束条件二次求精的示意代码。

图10是根据本发明实施例的另一种vdg的示意图。如图10所示,该vdg图与代码3相对应,输入变量var,在param==1的条件下,var=4,在flag==1的条件下,var=3,返回var+1。而flag又依赖于param,在param!=1的条件下,flag=1,变量var“声明-使用”的到达条件是condition1:!(param==1)and!(flag==1),而flag又依赖于param,所以需要二次求精。在vdg图中寻找flag的switch节点(switchflag:switchnode),获取其取值以及到达条件,最终得到flag条件节点的到达条件为condition2:((!(param==1))=>flag==1)&&((param==1)=>flag==0),将condtion1&&condition2一起进行约束求解。smtsolver解不出满足该约束的值,所以该“声明-使用”不可到达,也即,不存在var的未赋值使用。

该实施例通过静态分析检测出lua代码中变量未初始化使用的情况,给予开发人员警告,从而一次性修复所有这类错误,大大节省开发时间。该静态分析检测方法通过遍历抽象语法树(ast树),构造变量的vdg图,然后在vdg图上对每个声明的变量做切片分析,利用smtsolver求解条件识别未赋值的变量使用点,解决了lua的变量未初始化使用检测,使得开发人员不需要依靠运行程序,在程序崩溃时才能发现变量的未初始化使用,大大提高开发效率。

需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

实施例3

根据本发明实施例,还提供了一种用于实施上述语言的变量检测方法的语言的变量检测装置。图11是根据本发明实施例的一种语言的变量检测装置的示意图。如图11所示,该装置可以包括:第一获取单元10、第二获取单元20、切片分析单元30和第一确定单元40。

第一获取单元10,用于获取脚本语言的目标源代码中的目标变量。

第二获取单元20,用于获取目标变量的依赖关系,其中,依赖关系用于表示目标变量中的定义变量与使用变量之间的关系。

切片分析单元30,用于根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件,其中,目标条件用于约束目标变量为未赋值变量。

第一确定单元40,用于当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量。

图12是根据本发明实施例的另一种语言的变量检测装置的示意图。如图12所示,该装置可以包括:第一获取单元10、第二获取单元20、切片分析单元30和第一确定单元40。其中,第一获取单元10包括:构造模块11和遍历模块12。

需要说明的是,该实施例的第一获取单元10、第二获取单元20、切片分析单元30和第一确定单元40与图11所示实施例的语言的变量检测装置中的作用相同,此处不再赘述。

构造模块11,用于构造脚本语言的目标源代码的抽象语法树,其中,抽象语法树上的每个节点与目标源代码中的每条语句相对应。

遍历模块12,用于遍历抽象语法树,得到每条语句中的定义变量和使用变量,其中,目标变量包括定义变量和使用变量。

图13是根据本发明实施例的另一种语言的变量检测装置的示意图。如图13所示,该装置可以包括:第一获取单元10、第二获取单元20、切片分析单元30和第一确定单元40。其中,第一获取单元10包括:构造模块11和遍历模块12。该装置还包括:第二确定单元50和连接单元60。其中,切片分析单元30包括:切片分析模块31。

需要说明的是,该实施例的第一获取单元10、第二获取单元20、切片分析单元30和第一确定单元40,构造模块11和遍历模块12与图12所示实施例的语言的变量检测装置中的作用相同,此处不再赘述。

第二确定单元50,用于在获取目标变量的依赖关系之后,将目标源代码中的语句确定为多个目标节点。

连接单元60,用于通过依赖关系连接多个目标节点,得到值依赖图,其中,多个目标节点的变量包括:定义变量和使用变量。

切片分析单元30包括:切片分析模块31,用于对值依赖图上的目标变量所属的目标语句进行切片分析,得到目标变量的目标条件。

图14是根据本发明实施例的另一种语言的变量检测装置的示意图。如图14所示,该装置可以包括:第一获取单元10、第二获取单元20、切片分析单元30和第一确定单元40。其中,第一获取单元10包括:构造模块11和遍历模块12。该装置还包括:第二确定单元50和连接单元60。其中,切片分析单元30包括:切片分析模块31。其中,切片分析模块31包括:查找子模块311、切片分析子模块312、确定子模块313和314计算子模块。

需要说明的是,该实施例的第一获取单元10、第二获取单元20、切片分析单元30和第一确定单元40。其中,第一获取单元10包括:构造模块11和遍历模块12,第二确定单元50和连接单元60,切片分析模块31与图13所示实施例的语言的变量检测装置中的作用相同,此处不再赘述。

查找子模块311,用于查找值依赖图上的所有目标变量的声明点。

切片分析子模块312,用于从声明点开始执行后向切片操作,得到目标变量所属的目标语句,其中,值依赖图上与目标语句对应的节点为与目标变量的值有关的使用点。

确定子模块313,用于在值依赖图上确定由声明点到使用点的目标路径,其中,目标路径不包括目标源代码中已经对目标变量赋值过的语句。

计算子模块314,用于计算目标路径上的目标条件。

图15是根据本发明实施例的另一种语言的变量检测装置的示意图。如图15所示,该装置可以包括:第一获取单元10、第二获取单元20、切片分析单元30和第一确定单元40。其中,切片分析单元30包括:第一获取模块31、第一确定模块32、第二获取模块33、第二确定模块34和第三确定模块35,第一确定单元40包括:第四确定模块41。

需要说明的是,该实施例的第一获取单元10、第二获取单元20、切片分析单元30和第一确定单元40与图11所示实施例中的语言的变量检测装置中的作用相同,此处不再赘述。

第一获取模块31,用于获取目标变量所属的第一目标语句,其中,第一目标语句包括目标变量的第一赋值条件。

第一确定模块32,确定与第一赋值条件相反的赋值条件为第一目标条件。

第二获取模块33,用于获取目标变量所属的第二目标语句,其中,第二目标语句包括目标变量的第二赋值条件.

第二确定模块34,用于确定与第二赋值条件相反的赋值条件为第二目标条件。

第三确定模块35,用于确定用于在第一目标条件下且在第二目标条件下对目标变量执行与逻辑运算的条件为目标条件。

第四确定模块41,用于当对目标变量求解出满足第一目标条件且满足第二目标条件的求解结果时,确定目标变量为未初始化变量。

图16是根据本发明实施例的另一种语言的变量检测装置的示意图。如图16所示,该装置可以包括:第一获取单元10、第二获取单元20、切片分析单元30和第一确定单元40。其中,切片分析单元30包括:第三获取模块36、第五确定模块37、第四获取模块38、第六确定模块39、第七确定模块310、第八确定模块311和第九确定模块312。第一确定单元40包括:第十确定模块42。

需要说明的是,该实施例的第一获取单元10、第二获取单元20、切片分析单元30和第一确定单元40与图11所示实施例中的语言的变量检测装置中的作用相同,此处不再赘述。

第三获取模块36,用于获取第一目标变量所属的第一目标语句,其中,第一目标语句包括第一目标变量的第一赋值条件。

第五确定模块37,用于确定与第一赋值条件相反的赋值条件为第一目标条件。

第四获取模块38,用于获取第一目标变量所属的第二目标语句,其中,第二目标语句包括第一目标变量的第二赋值条件,第二赋值条件由第一赋值条件对应的第二目标变量确定。

第六确定模块39,用于确定与第二赋值条件相反的赋值条件为第二目标条件。

第七确定模块310,用于确定用于在第一目标条件下且在第二目标条件下对第一目标变量执行与逻辑运算的条件为第三目标条件。

第八确定模块311,用于确定第二赋值条件的第四目标条件,其中,第四目标条件为第二目标变量的取值目标条件。

第九确定模块312,用于确定用于在第三目标条件下且在第四目标条件下对第一目标变量执行与逻辑运算的条件为目标条件。

其中,第一确定单元40包括:第十确定模块42用于当对目标变量求解出满足第三目标条件且满足第四目标条件的求解结果时,确定目标变量为未初始化变量。

可选地,该装置还包括:第三确定单元,用于在对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件之后,当未对目标变量求解出满足目标条件的求解结果时,确定目标变量为初始化变量。

需要说明的是,该实施例中的第一获取单元10可以用于执行本申请实施例1中的步骤s202,该实施例中的第二获取单元20可以用于执行本申请实施例1中的步骤s204,该实施例中的切片分析单元30可以用于执行本申请实施例1中的步骤s206,该实施例中的第一确定单元40可以用于执行本申请实施例1中的步骤s208。

该实施例通过第一获取单元10获取脚本语言的目标源代码中的目标变量,通过第二获取单元20获取目标变量的依赖关系,其中,依赖关系用于表示目标变量中的定义变量与使用变量之间的关系,通过切片分析单元30根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件,其中,目标条件用于约束目标变量为未赋值变量,通过第一确定单元40当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量,由于采用脚本语言的变量未初始化使用检测,通过对目标变量做切片分析,同时考虑求解条件的可满足性,达到了对脚本语言进行检测的目的,从而实现了提高变量检测的效率的技术效果,进而解决了相关技术中语言的变量检测效率低下的技术问题。

此处需要说明的是,上述单元和模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例1所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在如图1所示的硬件环境中,可以通过软件实现,也可以通过硬件实现,其中,硬件环境包括网络环境。

实施例4

根据本发明实施例,还提供了一种用于实施上述语言的变量检测方法的服务器或终端。

图17是根据本发明实施例的一种终端的结构框图。如图17所示,该终端可以包括:一个或多个(图中仅示出一个)处理器171、存储器173、以及传输装置175,如图17所示,该终端还可以包括输入输出设备177。

其中,存储器173可用于存储软件程序以及模块,如本发明实施例中的语言的变量检测方法和装置对应的程序指令/模块,处理器171通过运行存储在存储器173内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的语言的变量检测方法。存储器173可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器173可进一步包括相对于处理器171远程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

上述的传输装置175用于经由一个网络接收或者发送数据,还可以用于处理器与存储器之间的数据传输。上述的网络具体实例可包括有线网络及无线网络。在一个实例中,传输装置175包括一个网络适配器(networkinterfacecontroller,nic),其可通过网线与其他网络设备与路由器相连从而可与互联网或局域网进行通讯。在一个实例中,传输装置175为射频(radiofrequency,rf)模块,其用于通过无线方式与互联网进行通讯。

其中,具体地,存储器173用于存储应用程序。

处理器171可以通过传输装置175调用存储器173存储的应用程序,以执行下述步骤:

获取脚本语言的目标源代码中的目标变量;

获取目标变量的依赖关系,其中,依赖关系用于表示目标变量中的定义变量与使用变量之间的关系;

根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件,其中,目标条件用于约束目标变量为未赋值变量;

当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量。

处理器171还用于执行下述步骤:构造脚本语言的目标源代码的抽象语法树,其中,抽象语法树上的每个节点与目标源代码中的每条语句相对应;遍历抽象语法树,得到每条语句中的定义变量和使用变量,其中,目标变量包括定义变量和使用变量。

处理器171还用于执行下述步骤:在获取目标变量的依赖关系之后,将目标源代码中的语句确定为多个目标节点;通过依赖关系连接多个目标节点,得到值依赖图,其中,多个目标节点的变量包括:定义变量和使用变量;根据依赖关系,对值依赖图上的目标变量所属的目标语句进行切片分析,得到目标变量的目标条件。

处理器171还用于执行下述步骤:查找值依赖图上的所有目标变量的声明点;从声明点开始执行后向切片操作,得到目标变量所属的目标语句,其中,值依赖图上与目标语句对应的节点为与目标变量的值有关的使用点;在值依赖图上确定由声明点到使用点的目标路径,其中,目标路径不包括目标源代码中已经对目标变量赋值过的语句;计算目标路径上的目标条件。

处理器171还用于执行下述步骤:获取目标变量所属的第一目标语句,其中,第一目标语句包括目标变量的第一赋值条件;确定与第一赋值条件相反的赋值条件为第一目标条件;获取目标变量所属的第二目标语句,其中,第二目标语句包括目标变量的第二赋值条件;确定与第二赋值条件相反的赋值条件为第二目标条件;确定用于在第一目标条件下且在第二目标条件下对目标变量执行与逻辑运算的条件为目标条件;当对目标变量求解出满足第一目标条件且满足第二目标条件的求解结果时,确定目标变量为未初始化变量。

处理器171还用于执行下述步骤:获取第一目标变量所属的第一目标语句,其中,第一目标语句包括第一目标变量的第一赋值条件;确定与第一赋值条件相反的赋值条件为第一目标条件;获取第一目标变量所属的第二目标语句,其中,第二目标语句包括第一目标变量的第二赋值条件,第二赋值条件由第一赋值条件对应的第二目标变量确定;确定与第二赋值条件相反的赋值条件为第二目标条件;确定用于在第一目标条件下且在第二目标条件下对第一目标变量执行与逻辑运算的条件为第三目标条件;确定第二赋值条件的第四目标条件,其中,第四目标条件为第二目标变量的取值目标条件;确定用于在第三目标条件下且在第四目标条件下对第一目标变量执行与逻辑运算的条件为目标条件;当对目标变量求解出满足第三目标条件且满足第四目标条件的求解结果时,确定目标变量为未初始化变量。

处理器171还用于执行下述步骤:在对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件之后,当未对目标变量求解出满足目标条件的求解结果时,确定目标变量为初始化变量。

采用本发明实施例,提供了一种语言的变量检测方法的方案。通过获取脚本语言的目标源代码中的目标变量;获取目标变量的依赖关系,其中,依赖关系用于表示目标变量中的定义变量与使用变量之间的关系;根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件,其中,目标条件用于约束目标变量为未赋值变量;当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量,由于采用脚本语言的变量未初始化使用检测,通过对目标变量做切片分析,同时考虑求解条件的可满足性,达到了对脚本语言进行检测的目的,从而实现了提高变量检测的效率的技术效果,进而解决了相关技术中语言的变量检测效率低下的技术问题。

可选地,本实施例中的具体示例可以参考上述实施例中所描述的示例,本实施例在此不再赘述。

本领域普通技术人员可以理解,图17所示的结构仅为示意,终端可以是智能手机(如android手机、ios手机等)、平板电脑、掌上电脑以及移动互联网设备(mobileinternetdevices,mid)、pad等终端设备。图17其并不对上述电子装置的结构造成限定。例如,终端还可包括比图17中所示更多或者更少的组件(如网络接口、显示装置等),或者具有与图17所示不同的配置。

本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(read-onlymemory,rom)、随机存取器(randomaccessmemory,ram)、磁盘或光盘等。

实施例5

本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以用于执行语言的变量检测方法的程序代码。

可选地,在本实施例中,上述存储介质可以位于上述实施例所示的网络中的多个网络设备中的至少一个网络设备上。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:

获取脚本语言的目标源代码中的目标变量;

获取目标变量的依赖关系,其中,依赖关系用于表示目标变量中的定义变量与使用变量之间的关系;

根据依赖关系,对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件,其中,目标条件用于约束目标变量为未赋值变量;

当对目标变量求解出满足目标条件的求解结果时,确定目标变量为未初始化变量。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:构造脚本语言的目标源代码的抽象语法树,其中,抽象语法树上的每个节点与目标源代码中的每条语句相对应;遍历抽象语法树,得到每条语句中的定义变量和使用变量,其中,目标变量包括定义变量和使用变量。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在获取目标变量的依赖关系之后,将目标源代码中的语句确定为多个目标节点;通过依赖关系连接多个目标节点,得到值依赖图,其中,多个目标节点的变量包括:定义变量和使用变量;根据依赖关系,对值依赖图上的目标变量所属的目标语句进行切片分析,得到目标变量的目标条件。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:查找值依赖图上的所有目标变量的声明点;从声明点开始执行后向切片操作,得到目标变量所属的目标语句,其中,值依赖图上与目标语句对应的节点为与目标变量的值有关的使用点;在值依赖图上确定由声明点到使用点的目标路径,其中,目标路径不包括目标源代码中已经对目标变量赋值过的语句;计算目标路径上的目标条件。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:获取目标变量所属的第一目标语句,其中,第一目标语句包括目标变量的第一赋值条件;确定与第一赋值条件相反的赋值条件为第一目标条件;获取目标变量所属的第二目标语句,其中,第二目标语句包括目标变量的第二赋值条件;确定与第二赋值条件相反的赋值条件为第二目标条件;确定用于在第一目标条件下且在第二目标条件下对目标变量执行与逻辑运算的条件为目标条件;当对目标变量求解出满足第一目标条件且满足第二目标条件的求解结果时,确定目标变量为未初始化变量。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:获取第一目标变量所属的第一目标语句,其中,第一目标语句包括第一目标变量的第一赋值条件;确定与第一赋值条件相反的赋值条件为第一目标条件;获取第一目标变量所属的第二目标语句,其中,第二目标语句包括第一目标变量的第二赋值条件,第二赋值条件由第一赋值条件对应的第二目标变量确定;确定与第二赋值条件相反的赋值条件为第二目标条件;确定用于在第一目标条件下且在第二目标条件下对第一目标变量执行与逻辑运算的条件为第三目标条件;确定第二赋值条件的第四目标条件,其中,第四目标条件为第二目标变量的取值条件;确定用于在第三目标条件下且在第四目标条件下对第一目标变量执行与逻辑运算的条件为目标条件;当对目标变量求解出满足第三目标条件且满足第四目标条件的求解结果时,确定目标变量为未初始化变量。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在对目标变量所属的目标语句进行切片分析,得到目标变量的目标条件之后,当未对目标变量求解出满足目标条件的求解结果时,确定目标变量为初始化变量。

可选地,本实施例中的具体示例可以参考上述实施例中所描述的示例,本实施例在此不再赘述。

可选地,在本实施例中,上述存储介质可以包括但不限于:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。

在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

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