CN103257919B - 脚本程序检查方法和装置 - Google Patents

脚本程序检查方法和装置 Download PDF

Info

Publication number
CN103257919B
CN103257919B CN201210039605.2A CN201210039605A CN103257919B CN 103257919 B CN103257919 B CN 103257919B CN 201210039605 A CN201210039605 A CN 201210039605A CN 103257919 B CN103257919 B CN 103257919B
Authority
CN
China
Prior art keywords
variable
shell script
examine
local
mistake
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201210039605.2A
Other languages
English (en)
Other versions
CN103257919A (zh
Inventor
李伟德
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201210039605.2A priority Critical patent/CN103257919B/zh
Publication of CN103257919A publication Critical patent/CN103257919A/zh
Application granted granted Critical
Publication of CN103257919B publication Critical patent/CN103257919B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Stored Programmes (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明实施例公开了一种脚本程序检查方法和装置,涉及软件检测技术领域,能够在脚本程序集被执行之前进行变量的检测,减小脚本程序在运行时出错的可能性。该方法包括:读取待检查脚本程序集中的每个待检查脚本程序,所述待检查脚本程序集包含至少一个所述待检查脚本程序;通过对所述待检查脚本程序进行语法分析,构造出所述待检查脚本程序集的全局变量表和局部变量表;检测每个所述全局变量和每个局部变量是否存在错误。主要用于脚本程序中变量的检查。

Description

脚本程序检查方法和装置
技术领域
本发明涉及软件检测技术领域,尤其涉及脚本程序检查方法和装置。
背景技术
Lua作为一个内部的软件开发工具,其提供一种嵌入式的脚本编程语言,它简洁、高效、可移植并且是轻量级的,被广泛运用于游戏行业。游戏中的配置或者逻辑都可以用lua脚本语言进行编写,用lua编写游戏的逻辑,在需要修改其逻辑时,无需重新编译整个程序代码,甚至还可以使正在运行的游戏能够实现不停机更新。
但是,由于多人协同开发或者开发人员疏忽等原因,在编写过程中很难避免lua脚本语言中出现错误,包括语法错误、变量错误、函数错误等。一个游戏中使用的lua文件至少有几十个,甚至上千个,因此,为了保证游戏的正常使用,在执行lua脚本语言之前,对lua脚本语言的错误检查是十分必要的。
现有技术中,通过编译器对lua脚本语言进行语法检查,能够检查出lua脚本语言中的语法错误。
在实现上述脚本程序检查的过程中,发明人发现现有技术中至少存在如下问题:Lua脚本语言的变量和函数的合法性在运行前从不检查,只有在运行过程中当使用的时候才进行检查。原因主要有以下两点:
1.lua的变量默认为全局变量,并且可以分布在不同的文件中,或者同一文件的不同部分中,如果进行强制性检查,则有违其作为脚本灵活的特点,另一方面,lua中的表变量,其结构可以动态定义或修改,这样在脚本运行前根本无法判断。
2.Lua的函数可以是用lua语言编写的代码,也可能是用其他语言(例如C语言)编写的代码,然后动态注册到lua运行环境中,这样也导致lua在运行前无法确定该函数是否存在。
而lua没有对变量和函数的合法性进行检查,往往使得游戏中的lua文件隐含一些关于变量和函数的错误。
发明内容
本发明的实施例提供一种脚本程序检查方法和装置,能够在脚本程序集被执行之前进行变量的检测,减小脚本程序在运行时出错的可能性。
为达到上述目的,本发明的实施例采用如下技术方案:
一种脚本程序检查方法,包括:
读取待检查脚本程序集中的每个待检查脚本程序,所述待检查脚本程序集包含至少一个所述待检查脚本程序;
通过对所述待检查脚本程序进行语法分析,构造出所述待检查脚本程序集的全局变量表和局部变量表;
检测每个所述全局变量和每个局部变量是否存在错误。
一种脚本程序检查装置,包括:
读取单元,用于读取待检查脚本程序集中的每个待检查脚本程序,所述待检查脚本程序集包含至少一个所述待检查脚本程序;
构造单元,用于通过对所述待检查脚本程序进行语法分析,构造出所述待检查脚本程序集的全局变量表和局部变量表;
第一检测单元,用于检测每个所述全局变量和每个局部变量是否存在错误。
本发明实施例提供的脚本程序检查方法和装置,读取待检查脚本程序集中的每个待检查脚本程序,所述待检查脚本程序集包含至少一个所述待检查脚本程序;通过对所述待检查脚本程序进行语法分析,构造出所述待检查脚本程序集的全局变量表和局部变量表;检测每个所述全局变量和每个局部变量是否存在错误。能够在脚本程序集被执行之前进行变量的检测,减小脚本程序在运行时出错的可能性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种脚本程序检查方法的流程图;
图2为本发明实施例提供的另一种脚本程序检查方法的流程图;
图3为本发明实施例中进行函数拆分过程的示意图;
图4为本发明实施例中对函数拆分进行检查的流程图;
图5为本发明实施例提供的一种脚本程序检查装置的结构图;
图6为本发明实施例提供的另一种脚本程序检查装置的结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
Lua作为一种脚本编程语言,因其简洁、高效、可移植并且是轻量级的,目前在大型游戏开发中被广泛应用,但在lua开发中,由于以下原因,无法很好地保证lua脚本代码中变量和函数的正确性:
1.需要多人同时协助实现一个脚本,对于部分脚本,例如一个boss(游戏中的一个角色)的AI(逻辑),或者一个副本的流程,往往是几个人同时开发,各自负责一部分,这样,很可能脚本在整体逻辑上没有问题,但往往有部分比较特殊的地方没有被触发,从而无法发现一些问题。
2.因为开发人员的疏忽,把一个变量或者函数的某个字符拼错或者拼反,从而导致某段逻辑无法正常执行;开发人员直接拷贝粘贴相似的一段代码,但部分变量忘记进行了修改;开发人员定义新函数的时候,和已有函数名重复,从容导致原来的函数失效;开发人员编写代码不规则,本应是定义局部变量的,无意中写成了全局变量,从而可能导致内存泄漏,例如,
而Lua作为一种附属语言,部分函数或者宏信息是定义在宿主游戏程序里的,甚至脚本中的一些数据是跟游戏环境相关的;因此,用lua编辑器写的程序无法在本地调试,甚至可能无法正常编译,只有上传到服务器上,通过打印log信息来调试了。
上述问题可能引发不可意料的逻辑,例如误将一个局部变量定义成全局变量后,在其它的某个地方,也刚好用到了一个同名变量,且该变量忘记初始化,这样lua执行的时候,就会用到了上次定义的“全局变量”。为了解决上述问题,本发明提供以下实施例:
本发明实施例提供了一种脚本程序检查方法,如图1所示,包括以下步骤:
101、读取待检查脚本程序集中的每个待检查脚本程序,所述待检查脚本程序集包含至少一个所述待检查脚本程序。
待检查脚本程序集为被检测的对象,本实施例可以对被执行前的待检查脚本程序集进行检测。
102、通过对所述待检查脚本程序进行语法分析,构造出所述待检查脚本程序集的全局变量表和局部变量表。
脚本程序均使用约定的语法规则进行编写,因此,可以通过对所述待检查脚本程序进行语法分析的方式,构造出所述待检查脚本程序集的全局变量表和局部变量表。
具体的,首先,从读取待检查脚本程序集中的每个待检查脚本程序,然后,依次对每个待检查脚本程序进行分词操作,读取待检查脚本程序中的每个词,并根据每个词的含义构造出所述待检查脚本程序集的全局变量表和局部变量表。
本实施例中的全局变量表和局部变量表是为检测待检查脚本程序集而构造的。
103、检测每个所述全局变量和每个局部变量是否存在错误。
变量在脚本程序中的定义和使用具有一定的规则,按照这些规则便可以检测每个所述全局变量和每个局部变量是否存在错误。
本实施例提供的脚本程序检查方法,读取待检查脚本程序集中的每个待检查脚本程序,所述待检查脚本程序集包含至少一个所述待检查脚本程序;通过对所述待检查脚本程序进行语法分析,构造出所述待检查脚本程序集的全局变量表和局部变量表;检测每个所述全局变量和每个局部变量是否存在错误。能够在脚本程序集被执行之前进行变量的检测,减小脚本程序在运行时出错的可能性。
作为本实施例的一种改进,本发明实施例提供另一种脚本程序检查方法,如图2所示,包括以下步骤:
201、读取待检查脚本程序集中的每个待检查脚本程序,所述待检查脚本程序集包含至少一个所述待检查脚本程序。
待检查脚本程序集为被检测的对象,本实施例可以对被执行前的待检查脚本程序集进行检测。
202、通过对所述待检查脚本程序进行语法分析。
本实施例以对运行前的Lua文件进行变量和函数检测为例进行说明,Lua文件均由若干普通Lua函数的定义和顶级代码(函数定义外的代码)组成。使用本实施例提供的脚本程序检查方法对lua文件进行变量和函数的检测,先对lua代码进行语法分析,将每个所述待检查脚本程序拆分成函数。分析过程中如果发现是函数定义,则将该函数的定义部分保存下来,而将函数定义之外的代码全部保存到一起,作为语法分析完之后马上要执行的代码语句。
具体的,如图3所示,考虑到尽可能不违背lua文件的处理原理,通过分析lua的脚本代码,可将Lua文件分解成两部分:一部分是以function开头,以end结束的函数定义;另一部分为该lua文件的全局代码,目前将lua文件的全局代码部分作为该lua文件的主函数。这样对于每个Lua文件都可以分解成一个主函数和若干个普通函数组成,而每个函数都可认为是独立的,也就从分析Lua文件转变成了分析单个函数的过程,令程序的设计更简化,更合理。
进一步的,为了使检测结果准确,检测lua文件拆分成函数是否成功,主要看是否能准确提取到文件中的普通函数的定义。普通函数的定义有function标识符开始,以end标识符结束。但在函数体内可能出现以end标识符结束的语句,这些语句有“if。。。End”和“do。。。End”(包括“for。。。Do。。。End”和“while。。。Do。。。。End”)两种,考虑到lua语法中有闭包函数的功能,即在函数体内再定义一个函数,故需要把“function。。。End”也加进去。使用配对计数法可快速提取出普通函数的定义,如图4所示,代码执行过程如下:
依次对待检测脚本程序中的每个字符进行检测,从第一个字符开始,以S标识当前被检测的字符的编号,初始化S为0。
若S>0,则当前被检测字符为待检测脚本程序中的一个字符,因此当前检测的字符(用word表示),检测当前word是否为“if”或者“do”;
如果当前word是“if”或者“do”,则接着检测下一个字符是否为“end”,如果当前word不是“if”或者“do”,则检测当前word是否为“end”;
如word为“end”,则将S值减1,如S减1后等于0则当前函数配对结束,读取下一个word获取下一个函数定义。如S减1后不等于0,则当前函数未配对结束,继续读取下一个word,直至S等于0,当前函数定义结束。
通过将lua文件分解成函数的形式,可以把分析的重心从lua文件单位转移到函数单位,这更简化分析模型的建立。
进一步,可选的,可以加强lua文件的分析部分,从lua文件提取更多信息,例如还可以提取变量的类型、变量的值等信息,以进一步准确的对lua文件中的变量进行检测。对本实施例中对lua文件的分析部分可以制作成一个插件,对于不同项目,根据项目情况可以二次开发更多的规则,以尽可能保证脚本的正确性。还可以建立一个检测平台,每个项目定时自动对项目文件进行扫描,并把扫描结果上传到平台数据库管理,测试人员通过平台提供的网站,对扫描结果进行统一管理和监控。
203、构造出所述待检查脚本程序集的全局变量表和局部变量表。
脚本程序均使用约定的语法规则进行编写,因此,可以通过对所述待检查脚本程序进行语法分析的方式,构造出所述待检查脚本程序集的全局变量表和局部变量表。
整合所有待检查脚本程序的局部变量表,得到所述待检查脚本程序集的局部变量表,整合所有待检查脚本程序的全局变量定义表,得到所述待检查脚本程序集的全局变量表。通过步骤202,从待检查脚本程序的分析转变成对函数的分析,可以认为所有的变量都是在函数中定义的,如果其不是局部变量,就是全局变量,因此在每个函数中都可以构建一份局部变量表和“全局变量表”,当然这份全局变量表是不完整的,最后通过整合所有函数的“全局变量表”,即可得到一份真正的全局变量表了。
对于函数里面的每一个变量,要么是局部变量,要么是全局变量。局部变量因为跟函数自身相关,其作用域在本函数内,故可以使用堆栈分析法,在函数的分析过程中同时进行对局部变量的分析判断。而全局变量,因为其定义可能是在本文件的其它地方,也可能是在其它文件中,只有在分析完所有的函数后,才能对全局变量进行判断,故对全局变量才用延后分析法,当前函数只记录在当前所定义的全局变量和所使用过的全局变量,待所有函数分析完毕后,再整合每个函数中的全局变量,形成真正唯一的全局变量表,然后再对每个使用的地方进行检查。
具体的,首先,从读取待检查脚本程序集中的每个待检查脚本程序,然后,依次对每个待检查脚本程序进行分词操作,读取待检查脚本程序中的每个词,并根据每个词的含义构造出所述待检查脚本程序集的全局变量表和局部变量表。
再具体的,在一个函数内,如果变量以local,for开头的,说明其是一个局部变量,按照其在函数脚本中出现的顺序,依次加入到局部变量表中即可,因此局部变量表比较容易构建。但全局变量表却不一样,因为全局变量可以在任何地方定义,虽说其一般应该定义在文件的顶部,即函数定义的外面,但有时也可能定义在函数的内部,甚至定义在其他文件中。
从lua运行的原理来看,其全局变量是根据代码的执行顺序,边运行,边构建全局变量表,如果发现某个变量不在局部变量中,也不在全局变量表中,则报错。而Lua作为游戏的一种辅助脚本,一般是由游戏根据具体情况触发调用某个函数。因此在对代码进行静态分析时,无法预知代码的执行顺序,也就无法像局部变量表那样进行构建了。
因为lua语言中有模块的概念,也有文件级变量的概念,因此在定位一个变量的时候,除了变量名外,还需要模块名,文件名以及一个标志记号,表明是否属于文件间的局部变量。
局部变量的识别和提取
Lua中变量默认是全局变量,如需定义局部变量,需显示加上local标识符。另一个特殊情况,在“for。。。Do。。。End”语句中,标识符for与do之间定义的变量均属于局部变量,且其作用域只在for语句体内。以下是一些局部变量的例子:
对local定义的局部变量的提取流程为:读入单词,直至遇到local标识符,取其后的单词,则该单词为局部变量,再判断其后紧接的是不是一个逗号,如果是,则说明下一个单词仍然是局部变量,如此重复,直到其后紧接的符号不是一个逗号。则本次local定义的局部变量结束。
对for隐式定义的局部变量的提取流程为:读入单词,直至遇到for标识符,则依次取其后的单词作为局部变量,直到遇到“=”或“in”则局部变量提取结束。
构建全局变量表时,因为表变量可能在多处地方进行定义或修改,此时需要对该变量进行合并操作,为了尽可能保证在合并变量时,修改的能合并到最初定义的;需遵循两个规则:
1.先使用主函数的临时全局变量表,再使用普通函数的临时全局变量表。这是因为主函数的代码是在文件加载的时候就可以执行的,故很多全局变量的初始定义会在主函数中。而普通函数内多是对于全局变量的定义的修改或者补充,这时需要把补充的合并到初次已出现的。
2.先构建简单的全局变量,再构建表类型的全局变量。这是因为不管是普通变量还是表变量,其最初定义的时候一般是以简单的形式出现。这样做能使建立的全局变量表更合理。
基于上述两点,构建全局变量表的流程如下:
1.根据主函数创建全局变量表:
1)将主函数中定义的全局变量分为有点和无点两类,先添加无点的,再添加有点的(无点的很可能是单变量,而有点的,则是表变量)。
2)对于无点的,先判断该变量是否在全局变量表中存在,如果不存在,则直接添加;如果已经存在,则把变量的字段合并到该全局变量中。
3)对于有点的,先判断第一部分是否存在,如果不存在,则输出结构体不存在,如果已经存在,则进行字段合并,但在合并子字段时,需要进行修正层次处理。
2.把普通函数中定义的全局变量添加到全局变量表:
1)将普通函数中定义的全局变量分为有点和无点两类,先添加无点的,再添加有点的。
2)对于无点的,先判断该变量是否在全局变量表中存在,如果不存在,则直接添加;如果已经存在,则把变量的字段合并到该全局变量中
3)对于有点的,先判断第一部分是否存在,如果不存在,则输出结构体不存在,如果已经存在,则进行字段合并,但在合并子字段时,需要进行修正层次处理。
2.5检查所有的临时全局变量使用表
有了全局变量表后,只要依次将函数变量使用表的变量一一检查即可,检查流程如下:
将使用表的变量以“.”分割,取第一部分查找全局变量表。如果查不到,则说明使用了一个未定义过的变量,这时根据该变量是否存在“.”来判断该变量是普通变量还是结构体变量,然后输出该变量不存在的错误,结束。
如果变量的第一部分存在,则依次判断其余下的部分是否在该变量的字段中和对应的层次是否正确,不在则输出变量的字段不存在的信息;若存在但层次不正确,则输出层次不正确的提示信息。
在对一个函数进行分析完毕后,需要得出以下信息,局部变量表、部分全局变量表(本函数中定义的全局变量)、全局变量使用表(本函数使用过的全局变量)、以及函数调用表。各表的作用如下:
上述前三种表的建立,归根到底,主要是对每个变量的正确识别。将在函数中出现的变量可归纳为以下6种情况之一:
这样在函数分析过程中,对变量的处理如下:如果其是一个局部变量定义,则加入局部变量表;如果是一个变量定义(不能确定是否是局部变量),则判断是否在局部变量表,如是,则合并该变量;否则把该变量临时存在该函数的全局变量表中;以供后面检查用;如果是一个变量的使用,则判断是否在局部变量表中定义,如不是,则把该变量临时存在该函数的全局变量使用表中。即可得到一份局部变量表,本函数中的临时全局变量表;以及本函数中的临时全局变量使用表。
全局变量使用表的存储格式局部变量表和全局变量表的数据单元结构已有上述变量结构给出,而全局变量使用表的数据也应该尽可能简洁和高效。考虑到前面判断表变量时,只进行两方面的检查:字段的存在性和其在表结构的层次的正确性。故可直接将“[]”内的信息替换成“.0.”即可。例如“itme.mes[goods[3][4].num].length”可表示成item.mes.0.length和goods.0.0.num来存储。其中符号“.”是为了用来保留字段的层次,而符号“0”只作为占位符。
函数调用表的建立
函数调用表记录了本函数中曾经调用过的函数名称和该函数的参数个数(考虑到重载函数的可能,故需提高参数个数信息)。函数名和变量名的区别在于:函数名后面会紧急一个“(”。而函数的参数是以逗号为分隔符的,但仅仅判断逗号还是不够,因为可能出现函数嵌套的情况(如下图所示),针对这一情况,只需通过()的配对来识别,只有在最外层的逗号才认为是分隔符即可。
204、检测每个所述全局变量和每个局部变量是否存在错误。
变量在脚本程序中的定义和使用具有一定的规则,按照这些规则便可以检测每个所述全局变量和每个局部变量是否存在错误。
具体的,错误可以是以下情况中的至少一种,以下代码中的粗体字部分为存在错误的部分:
1.检测每个所述全局变量和每个所述局部变量是否未进行初始化就被使用,未进行初始化就被使用的变量存在错误。
2.检测函数中使用的每个变量是否已定义,若变量未定义,则该变量存在错误。
如果一个变量的右边不是一个赋值号,则该变量必须先被定义。这个规则可以检查如下的一些情况中的错误:
2-1、检测每个所述全局变量和每个所述局部变量是否拼写错误,拼写错误的变量存在错误;或者,检测在本函数中使用的变量,是否为在其他函数中定义的局部变量,在本函数中未定义就使用。
2-2、变量在其他函数作为参数传入,但在本函数中不作参数且被使用,则该函数错误。
2-3、变量先使用后定义。
检测函数中使用的每个变量是否已在本函数中定义,若变量未在本函数中定义,则该变量存在错误;
2-4.变量在使用前是否先被定义。
2-5、引用变量表时,出现预先定义的变量表不存在的字段。
但表变量作为Lua的主要---实际上是唯一---的数据结构,其定义灵活,使用简便,且能动态修改表的结构;这将使得我们对变量的判断难道加大。下面是一个表结构定义的例子:
首先定义一个变量表
虽然表中的字段可以动态添加或者删除,其结构扶着可以嵌套,但从对表变量的检查的目的来看,我们只需要考虑两个问题:一表是否存在该字段,二该字段对应的层次是否正确。例如当要检查表变量“item.msg[0].length”时,只需确认item是否已定义,item下是否存在字段msg,msg是否有子字段msg[0],子字段msg[0]下是否存在length字段。结合实际情况,可以再简化模型的建立,只需检查msg和length是否是item的字段,且msg与item的距离是否为1,length与item的距离是否为3即可。这样表变量的字段的存储就可以简化为{字段名,该字段与变量的距离},这样的设计既能简化程序设计,又能高效地判断变量的合法性,达到我们的检查的要求。
为了能更加准确对变量的合法性进行检查,至少还需要以下额外信息:
1)变量的所在层次:局部变量判断时需要的信息,局部变量与其作用域密切相关。例如在if语句里定义的变量,其作用域仅局限于该语句,出了if语句,其将被销毁。变量的层次用于表示其在该函数的作用范围。在函数的分析过程中,假设根的层次为0,则每进入一个if语句,while语句,for语句,repeat语句,do语句,其层次加入,退出该语句,层次减一。变量的所在层次表明局部变量在什么时候失效。
2)变量的引用:引用的表示,对能否正确识别变量尤其重要,特别是对于表变量。例如在下面的lua语句中,局部变量temp的定义中,本身并没有字段day的定义,但因为其是引用Date的,而Date中有字段day,故temp中也有字段day。通过记录其引用值,能够找到其真正定义的地方。
Date={day=3,year=4}
Var temp=Date
Print(temp.day)
3)变量的原始串:因为lua中有模块的概念,变量可以属于某个模块,故保留变量定义时的原始字符信息,有助于对变量进行修正处理。例如对lua语句“Quest.item.number=10”分析时,默认是把Quest作为变量名,而item作为该变量中的一个字段;但Quest也有可能是一个模块名,真正的变量名是item。究竟哪一个是对的,只有在分析完所有文件后,判断是否有Quest模块,如果有,则应该把item修正成变量名。
4)变量所属的模块和变量所在的文件名:lua中除了模块外,还存在文件间的局部变量,即只在当前文件有效的全局变量,故需要保持文件名信息。
以下应用变量表的引用过程中存在错误。
变量形式可概括为两种,一种是简单变量,一种是table变量;简单变量的判断比较容易,table变量的话,需要解决两个问题,一个是table对象的存储,考虑到判断table时,需要判断table中是否有该字段,并且该字段的存储结构是否一致。为了简化设计,目前把存储结构简化成一个字段的层次;这样,table中的每个字段可以用{字段名,层次}表示;字段的引用方式便可设计成“变量名.0.字段1.0.字段2”,其中0只是为了占位,这样可以得到{字段1,2}{字段2,4}这样的信息,从而在table变量中判断是否存在字段名,且其对应的层次是否正确。
2-6、本应是局部变量却定义成了全局变量。
本实施例还能够根据变量的规范性对变量进行检查,这个要结合项目的自身特点,例如如果一个项目中,其定义的全局变量都是以大写字母开头,那么就可以检查出那个本该是局部变量,却无意被定义成全局变量的情况;或者通过分析全局变量表,若发现一些如n,size这样的变量被定义成全局变量,显然是不规范的。
205、提取每个所述函数调用的子函数。
具体的,在对lua脚本分析时,如果变量后面紧急一个“(”,则认为是一个函数,接着需要对函数的参数进行提取,提取时,以逗号为分隔符即可判断参数个数。对于参数是另一个函数的情况(如下表所示),可以通过()的配对来识别,只有在最外层的逗号才认为是分隔符。
2.1单词标识分类
Lua脚本的词法单元组成可分为下面五种,列表如下:
Lua静态检查器主要分析变量名和函数名的合法性,但因其命名是任意的,故不好直接判定。而其它四种却是固定或者遵循一定规律的,故可以通过排除法,从而找出所有用户定义的变量和函数名。词法分析主要是实现上述功能,通过提取每一个单词,并判断其属于前面五种类型中的哪一种,为下面的分析做准备。
检查所有函数的调用
Lua的函数的定义包括使用lua的,和用其他语言编写,动态注册到lua环境中的。Lua本身的函数可以用“function”标识符识别,而动态注册的暂时无法自动识别,但可采用的手动配置的方法,在检查时,先将lua用到的函数,提前写到配置文件中即可。这样,在对lua函数的调用表进行检查时,先从在lua本身的定义表中去找,如果找到,且参数个数匹配,则说明函数存在;否则再在手动配置表中寻找,如果无匹配或者匹配参数个数不正确,则进行报错。
206、检测每个所述子函数是否存在错误。
1、检测每个所述子函数是否被重复定义,若被重复定义,则该子函数存在错误;
2、检测每个所述子函数是否存在拼写错误。
3、函数嵌套函数
AI_chg_state(ai_other,JLSFB.AIS_RENEW,AI.get(ai_other,AIP_RENEW_DELTA));
4、检测每个所述子函数是否存在于用户提供的函数集中,若不存在于用户提供的函数集中,则该子函数存在错误。
本实施例提供的脚本程序检查方法,读取待检查脚本程序集中的每个待检查脚本程序,所述待检查脚本程序集包含至少一个所述待检查脚本程序;通过对所述待检查脚本程序进行语法分析,构造出所述待检查脚本程序集的全局变量表和局部变量表;检测每个所述全局变量和每个局部变量是否存在错误。能够在脚本程序集被执行之前进行变量的检测,减小脚本程序在运行时出错的可能性。
本发明还提供了一种脚本程序检查装置,如图5所示,包括:读取单元51、构造单元52、第一检测单元53。
其中,读取单元51,用于读取待检查脚本程序集中的每个待检查脚本程序,所述待检查脚本程序集包含至少一个所述待检查脚本程序;
构造单元52,用于通过对所述待检查脚本程序进行语法分析,构造出所述待检查脚本程序集的全局变量表和局部变量表;
第一检测单元53,用于检测每个所述全局变量和每个局部变量是否存在错误。
本发明实施例提供的脚本程序检查装置,读取待检查脚本程序集中的每个待检查脚本程序,所述待检查脚本程序集包含至少一个所述待检查脚本程序;通过对所述待检查脚本程序进行语法分析,构造出所述待检查脚本程序集的全局变量表和局部变量表;检测每个所述全局变量和每个局部变量是否存在错误。能够在脚本程序集被执行之前进行变量的检测,减小脚本程序在运行时出错的可能性。
作为本实施例的一种改进,本发明实施例提供另一种脚本程序检查装置,如图6所示,包括:读取单元61、提取单元62、构造单元63、第一检测单元64、第二检测单元65。
其中,所述构造单元63包括:拆分子模块631、构造子模块632、整合子模块633;所述第一检测单元64包括:第一检测子模块641、第二检测子模块642、第三检测子模块643;所述第二检测单元65包括:第四检测子模块651、第五检测子模块652、第六检测子模块653。
读取单元61,用于读取待检查脚本程序集中的每个待检查脚本程序,所述待检查脚本程序集包含至少一个所述待检查脚本程序;
提取单元62,用于提取每个所述函数调用的子函数;
构造单元63,用于通过对所述待检查脚本程序进行语法分析,构造出所述待检查脚本程序集的全局变量表和局部变量表;
具体的,拆分子模块631,用于将每个所述待检查脚本程序拆分成函数;
构造子模块632,用于构造每个所述函数的局部变量表和全局变量定义表;
整合子模块633,用于整合所有待检查脚本程序的局部变量表,得到所述待检查脚本程序集的局部变量表,整合所有待检查脚本程序的全局变量定义表,得到所述待检查脚本程序集的全局变量表。
第一检测单元64,用于检测每个所述全局变量和每个局部变量是否存在错误。
具体的,第一检测子模块641,用于检测每个所述全局变量和每个所述局部变量是否未进行初始化就被使用,未进行初始化就被使用的变量存在错误;
第二检测子模块642,用于检测函数中使用的每个变量是否已定义,若变量未定义,则该变量存在错误;
第三检测子模块643,用于检测检测每个变量的引用是否存在错误。
第二检测单元65,用于检测每个所述子函数是否存在错误。
第四检测子模块651,用于检测每个所述子函数是否被重复定义,若被重复定义,则该子函数存在错误;
第五检测子模块652,用于检测每个所述子函数是否存在拼写错误;
第六检测子模块653,用于检测每个所述子函数是否存在于用户提供的函数集中,若不存在于用户提供的函数集中,则该子函数存在错误。
本发明实施例提供的脚本程序检查装置,读取待检查脚本程序集中的每个待检查脚本程序,所述待检查脚本程序集包含至少一个所述待检查脚本程序;通过对所述待检查脚本程序进行语法分析,构造出所述待检查脚本程序集的全局变量表和局部变量表;检测每个所述全局变量和每个局部变量是否存在错误。能够在脚本程序集被执行之前进行变量的检测,减小脚本程序在运行时出错的可能性。
综上所述,本发明实施例提供的脚本程序检查方法和装置,Lua检查工具是在不执行lua代码的情况下,通过分析lua的代码,模拟出lua的执行环境,从而找出变量在未初始化的情况下就被使用,或者函数拼写错误,调用不对等情况。从而及早发现一些bug(错误)。
通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在可读取的存储介质中,如计算机的软盘,硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。

Claims (12)

1.一种脚本程序检查方法,其特征在于,包括:
读取待检查脚本程序集中的每个待检查脚本程序,所述待检查脚本程序集包含至少一个所述待检查脚本程序;
通过对所述待检查脚本程序进行语法分析,构造出所述待检查脚本程序集的全局变量表和局部变量表;
检测每个所述全局变量和每个局部变量是否存在错误;
所述对所述待检查脚本程序进行语法分析的步骤,包括:
依次对每个待检查脚本程序进行分词操作,读取待检查脚本程序中的每个词,并根据每个词的含义构造出所述待检查脚本程序集的全局变量表和局部变量表。
2.根据权利要求1所述的脚本程序检查方法,其特征在于,所述对所述待检查脚本程序进行语法分析包括:
将每个所述待检查脚本程序拆分成函数。
3.根据权利要求2所述的脚本程序检查方法,其特征在于,所述构造出所述待检查脚本程序集的全局变量表和局部变量表包括:
构造每个所述函数的局部变量表和全局变量定义表;
整合所有待检查脚本程序的局部变量表,得到所述待检查脚本程序集的局部变量表,整合所有待检查脚本程序的全局变量定义表,得到所述待检查脚本程序集的全局变量表。
4.根据权利要求3所述的脚本程序检查方法,其特征在于,所述方法还包括:
提取每个所述函数调用的子函数;
检测每个所述子函数是否存在错误。
5.根据权利要求1所述的脚本程序检查方法,其特征在于,所述检测每个所述全局变量和每个局部变量是否存在错误包括:
检测每个所述全局变量和每个所述局部变量是否未进行初始化就被使用,未进行初始化就被使用的变量存在错误;
检测函数中使用的每个变量是否已定义,若变量未定义,则该变量存在错误;
检测每个变量的引用是否存在错误。
6.根据权利要求4所述的脚本程序检查方法,其特征在于,所述检测每个所述子函数是否存在错误包括:
检测每个所述子函数是否被重复定义,若被重复定义,则该子函数存在错误;
检测每个所述子函数是否存在拼写错误;
检测每个所述子函数是否存在于用户提供的函数集中,若不存在于用户提供的函数集中,则该子函数存在错误。
7.一种脚本程序检查装置,其特征在于,包括:
读取单元,用于读取待检查脚本程序集中的每个待检查脚本程序,所述待检查脚本程序集包含至少一个所述待检查脚本程序;
构造单元,用于通过对所述待检查脚本程序进行语法分析,构造出所述待检查脚本程序集的全局变量表和局部变量表;
第一检测单元,用于检测每个所述全局变量和每个局部变量是否存在错误;
所述构造单元还用于,依次对每个待检查脚本程序进行分词操作,读取待检查脚本程序中的每个词,并根据每个词的含义构造出所述待检查脚本程序集的全局变量表和局部变量表。
8.根据权利要求7所述的脚本程序检查装置,其特征在于,所述构造单元包括:
拆分子模块,用于将每个所述待检查脚本程序拆分成函数。
9.根据权利要求8所述的脚本程序检查装置,其特征在于,所述构造单元还包括:
构造子模块,用于构造每个所述函数的局部变量表和全局变量定义表;
整合子模块,用于整合所有待检查脚本程序的局部变量表,得到所述待检查脚本程序集的局部变量表,整合所有待检查脚本程序的全局变量定义表,得到所述待检查脚本程序集的全局变量表。
10.根据权利要求8所述的脚本程序检查装置,其特征在于,还包括:
提取单元,用于提取每个所述函数调用的子函数;
第二检测单元,用于检测每个所述子函数是否存在错误。
11.根据权利要求7所述的脚本程序检查装置,其特征在于,所述第一检测单元包括:
第一检测子模块,用于检测每个所述全局变量和每个所述局部变量是否未进行初始化就被使用,未进行初始化就被使用的变量存在错误;
第二检测子模块,用于检测函数中使用的每个变量是否已定义,若变量未定义,则该变量存在错误;
第三检测子模块,用于检测检测每个变量的引用是否存在错误。
12.根据权利要求10所述的脚本程序检查装置,其特征在于,所述第二检测单元包括:
第四检测子模块,用于检测每个所述子函数是否被重复定义,若被重复定义,则该子函数存在错误;
第五检测子模块,用于检测每个所述子函数是否存在拼写错误;
第六检测子模块,用于检测每个所述子函数是否存在于用户提供的函数集中,若不存在于用户提供的函数集中,则该子函数存在错误。
CN201210039605.2A 2012-02-21 2012-02-21 脚本程序检查方法和装置 Active CN103257919B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201210039605.2A CN103257919B (zh) 2012-02-21 2012-02-21 脚本程序检查方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201210039605.2A CN103257919B (zh) 2012-02-21 2012-02-21 脚本程序检查方法和装置

Publications (2)

Publication Number Publication Date
CN103257919A CN103257919A (zh) 2013-08-21
CN103257919B true CN103257919B (zh) 2015-05-13

Family

ID=48961853

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201210039605.2A Active CN103257919B (zh) 2012-02-21 2012-02-21 脚本程序检查方法和装置

Country Status (1)

Country Link
CN (1) CN103257919B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111158663A (zh) * 2019-12-26 2020-05-15 深圳逻辑汇科技有限公司 用于处理程序代码中的变量的引用的方法和***

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104424097B (zh) * 2013-08-27 2017-06-27 华为技术有限公司 一种程序日志检测方法、推荐方法及各自对应的装置
CN104461522B (zh) * 2014-11-26 2018-05-01 论客科技(广州)有限公司 基于脚本的辅助业务实现方法
CN105677559B (zh) * 2015-12-31 2018-05-11 杭州华为数字技术有限公司 一种检测方法及装置
CN107589940B (zh) * 2017-09-04 2020-08-18 祖龙(天津)科技股份有限公司 一种基于Lua脚本语言的软件开发辅助***
CN108376114B (zh) * 2018-01-25 2021-03-26 珠海金山网络游戏科技有限公司 一种提高游戏测试效率的***和方法
CN108710361B (zh) * 2018-05-30 2020-07-28 广州明珞软控信息技术有限公司 一种安全程序检查方法和***
CN109189663B (zh) * 2018-07-12 2021-10-29 武汉精测电子集团股份有限公司 一种插件调试方法、测试方法及微内核架构***
CN109213490B (zh) * 2018-09-05 2022-10-25 深圳市腾讯网络信息技术有限公司 一种程序处理方法、装置以及相关设备
CN110705715B (zh) * 2019-09-27 2023-04-18 北京迈格威科技有限公司 超参数管理方法、装置及电子设备
CN110688320B (zh) * 2019-09-30 2023-05-23 潍柴动力股份有限公司 全局变量的检测方法、装置及终端设备

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1841328A (zh) * 2005-04-02 2006-10-04 华为技术有限公司 脚本语言的自动机方法
CN101566968A (zh) * 2009-05-20 2009-10-28 阿里巴巴集团控股有限公司 一种检查源代码中空指针的方法和计算机***

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1841328A (zh) * 2005-04-02 2006-10-04 华为技术有限公司 脚本语言的自动机方法
CN101566968A (zh) * 2009-05-20 2009-10-28 阿里巴巴集团控股有限公司 一种检查源代码中空指针的方法和计算机***

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111158663A (zh) * 2019-12-26 2020-05-15 深圳逻辑汇科技有限公司 用于处理程序代码中的变量的引用的方法和***

Also Published As

Publication number Publication date
CN103257919A (zh) 2013-08-21

Similar Documents

Publication Publication Date Title
CN103257919B (zh) 脚本程序检查方法和装置
US11797298B2 (en) Automating identification of code snippets for library suggestion models
Schäfer et al. An empirical evaluation of using large language models for automated unit test generation
US11494181B2 (en) Automating generation of library suggestion engine models
US11875148B2 (en) Library model addition
WO2021098148A1 (zh) 一种软件编译方法、装置及电子设备和存储介质
US8875110B2 (en) Code inspection executing system for performing a code inspection of ABAP source codes
US9588871B1 (en) Method and system for dynamic business rule extraction
US20080256517A1 (en) Method and System for Automatically Generating Unit Test Cases Which Can Reproduce Runtime Problems
CN109857641B (zh) 对程序源文件进行缺陷检测的方法及装置
CN102339252A (zh) 基于xml中间模型以及缺陷模式匹配的静态检测***
CN113497809B (zh) 基于控制流和数据流分析的mips架构漏洞挖掘方法
CN112256271B (zh) 一种基于静态分析的区块链智能合约安全检测***
CN103914379A (zh) 故障自动注入与故障检测的方法及其***
CN112131120A (zh) 一种源代码缺陷检测方法及装置
KR101696694B1 (ko) 역추적을 이용한 소스 코드 취약점 분석 방법 및 장치
CN112131122A (zh) 一种源代码缺陷检测工具误报评估方法及装置
CN103365772B (zh) 软件测试自动评价装置以及方法
CN112631944A (zh) 基于抽象语法树的源码检测方法及装置、计算机存储介质
US8819645B2 (en) Application analysis device
CN113037521B (zh) 识别通讯设备状态的方法、通讯***及存储介质
CN114297664A (zh) 一种基于Gradle的开源组件漏洞检测方法
CN112162777B (zh) 一种源代码特征提取方法及装置
He et al. A coverage and slicing dependencies analysis for seeking software security defects
JP5343840B2 (ja) プログラムの解析装置及び解析方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant