代码修复的方法、装置及电子设备与流程

文档序号:11620393阅读:203来源:国知局
代码修复的方法、装置及电子设备与流程

本申请涉及软件自动化测试技术领域,具体而言,涉及代码修复的方法、装置及电子设备。



背景技术:

相关技术中,针对特定编程语言的静态代码检查,通常用于实现某种代码规范的检查。例如,对于采用python语言编写的代码文件来说,通常采用flake8进行语言的静态代码检查。

然而,在检查出一些自定义的错误之后,往往还需要开发者去按照出错的文件、行号、以及错误内容,进行手动的查找和修改,然后再次提交并再次检查是否有错。该步骤一来耗时耗力,二来在代码错误较多的情况下,极容易出现未修改或者修改出错的情况,严重降低了开发效率。

举例来说,在游戏开发中,对于游戏的日志(log)记录格式都有严格的规定,例如每个日志需要标明日志的级别(例如critical、info、以及debug等)、时间、作者(可选)、以及内容等,然而在实际的开发中,程序为了方便调试,往往会在python脚本里使用简单的打印(print)方法来打印一些日志,这就造成了提交后的代码里面,有可能包含不规范的打印方法,因此需要程序一行一行地去寻找和删除,给每次代码提交增添了额外的工作,并带来了修改出错的进一步隐患。



技术实现要素:

本申请公开代码修复的方法,能够避免人工修复引起的效率低、容易出错等问题。

本发明的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本发明的实践而习得。

根据本发明的一方面,提供一种代码修复的方法,包括:

解析待修复的代码文件,获取所述待修复的代码文件的抽象语法树;

对所述抽象语法树中的节点进行递归枚举,查询并获取与待检查的语法结构对应的节点;

利用自定义逻辑对所述查询并获取到的所述节点进行扫描,并在扫描到不符合所述自定义逻辑的所述节点,生成错误信息,其中,所述自定义逻辑是根据具体需求进行自定义的代码执行逻辑;

修复所述不符合所述自定义逻辑的节点。

根据一些实施例,所述待检查的语法结构包括以下一种或多种:异常控制对、类、函数。

根据一些实施例,所述修复所述不符合所述自定义逻辑的节点包括:对所述节点中不符合所述自定义逻辑的节点进行删除和/或修改。

根据一些实施例,获取所述待修复的代码文件的抽象语法树包括:通过flake8获取所述待修复的代码文件的抽象语法树。

根据本发明的另一方面,提供一种代码修复的装置,其包括抽象语法树获取单元、节点获取单元、节点扫描单元、以及节点修复单元,其中:

抽象语法树获取单元,用于解析待修复的代码文件,获取所述待修复的代码文件的抽象语法树;

节点获取单元,用于对所述抽象语法树中的节点进行递归枚举,查询并获取与待检查的语法结构对应的节点;

节点扫描单元,用于利用自定义逻辑对所述查询并获取到的所述节点进行扫描,并在扫描到不符合所述自定义逻辑的所述节点,生成错误信息,其中,所述自定义逻辑是根据具体需求进行自定义的代码执行逻辑;

节点修复单元,用于修复所述不符合所述自定义逻辑的节点。

根据一些实施例,所述待检查的语法结构包括以下一种或多种:异常控制对、类、函数。

根据一些实施例,所述节点修复单元用于:对所述节点中不符合所述自定义逻辑的节点进行删除和/或修改。

根据一些实施例,所述抽象语法树获取单元用于:通过flake8获取所述待修复的代码文件的抽象语法树。

根据本发明的又一方面,提供一种电子设备,包括:处理器;存储器,存储用于所述处理器控制如上述第一方面任一项所述的操作的指令。

根据本发明的又一方面,提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现步骤:

解析待修复的代码文件,获取所述待修复的代码文件的抽象语法树;

对所述抽象语法树中的节点进行递归枚举,查询并获取与待检查的语法结构对应的节点;

利用自定义逻辑对所述查询并获取到的所述节点进行扫描,并在扫描到不符合所述自定义逻辑的所述节点,生成错误信息,其中,所述自定义逻辑是根据具体需求进行自定义的代码执行逻辑;

修复所述不符合所述自定义逻辑的节点。

本申请的实施例提供的技术方案可以包括以下有益效果:

本申请的实施例提供的技术方案对代码文件中的自定义代码规范错误,进行自动的修改,避免了人工修复的效率低、容易错误等问题。

应当理解的是,以上的一般描述和后文的细节描述仅是示例性的,并不能限制本发明。

附图说明

通过参照附图详细描述其示例实施例,本发明的上述和其它特征及优点将变得更加明显。

图1示出了根据本发明一实施例的代码修复的方法;

图2示出了根据本发明另一实施例的代码修复的方法;

图3示出了根据本发明另一实施例的用于帮助安装自定义flake8扩展插件的代码示意图;

图4示出了根据本发明另一实施例的代码修复的方法示意流程;

图5示出了根据本发明一实施例的代码修复的装置的框图;

图6示出了根据本发明一实施例的电子设备。

具体实施方式

现在将参考附图更全面地描述示例实施例。然而,示例实施例能够以多种形式实施,且不应被理解为限于在此阐述的实施例;相反,提供这些实施例使得本发明将全面和完整,并将示例实施例的构思全面地传达给本领域的技术人员。在图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。

此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本发明的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本发明的技术方案而没有特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知方法、装置、实现或者操作以避免模糊本发明的各方面。

附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。

附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。

图1示出了根据本发明一实施例的代码修复的方法,本实施例可适用于根据设定规则对代码文件进行自动修复的情况,如图1所示,本实施例所述的代码修复的方法包括:

在步骤s110中,解析待修复的代码文件,获取所述待修复的代码文件的抽象语法树。

需要说明的是,本实施例所述的代码文件是指用编程语言所编写的源代码文件,本实施例的技术方案适用于多种语言的代码文件,只要能够实现在代码文件和抽象语法树之间相互转换即可,本实施例对代码文件所采用的具体的语言并不作限定。

抽象语法树(abstractsyntaxtree或者缩写为ast),是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构。具体地,获取所述待修复的代码文件的抽象语法树可具体通过flake8获取。

在步骤s120中,对所述抽象语法树中的节点进行递归枚举,查询并获取与待检查的语法结构对应的节点。

所述待检查的语法结构包括多种,例如异常控制对、类、以及函数等。

在步骤s130中,利用自定义逻辑对所述查询并获取到的所述节点进行扫描,并在扫描到不符合所述自定义逻辑的所述节点,生成错误信息,其中,所述自定义逻辑是根据具体需求进行自定义的代码执行逻辑。

在步骤s140中,修复所述不符合所述自定义逻辑的节点。

例如对所述节点中不符合所述自定义逻辑的节点进行删除和/或修改。

本实施例所述的修复所涉及的范围涵盖多种,包括节点的删除、节点的修改等。例如,将抽象语法树中如使用了设定函数的节点中的该设定函数对应的子节点删除,将抽象语法树中无用的引用库删除、将抽象语法树中a函数全局替换为b函数等。

例如,游戏日志格式都有严格的规定,一般不允许使用print,需要开发者在提交代码文件前,删除自己调试中添加的print方法,而提交代码文件的操作一般频率很高,因此可以对代码文件对应的抽象语法树中含有例如ast.print的对象进行删除。

对代码文件中的抽象语法树进行了解析、搜索和处理,不符合设定的代码规范的错误,都得到了自动的修复,从而得到了新的抽象语法树。在此基础上,本步骤用于根据新的抽象语法树生成新的修复后的代码文件。

本实施例通过对被修复的代码文件的抽象语法树中不符合设定规范的节点根据设定方法进行修复,根据修复后生成的新的抽象语法树生成代码文件。避免了人工修复引起的效率低、容易出错等问题。

本实施例的技术方案适用于多种语言的代码文件,只要能够实现在代码文件和抽象语法树之间相互转换即可,本实施例对代码文件所采用的具体的语言并不作限定。

图2示出了根据本发明另一实施例的代码修复的方法,本实施例以被修复的代码文件为python代码文件为例,说明本实施例的技术方案。如图2所示,本实施例所述的代码修复的方法包括:

在步骤s210中,解析待修复的代码文件,通过flake8获取所述待修复的python代码文件的抽象语法树。

python是一种面向对象的解释型计算机程序设计语言。可利用python的抽象语法树模块(ast模块)根据python代码文件生成抽象语法树。对于代码文件的为python语言编写的代码文件来说,可直接通过python语言对应的ast模块,即可根据代码文件得到对应的抽象语法树。

现有技术中,针对python语言的静态代码检查,以flake8最为常用,它最大的优点是可扩展,可以自由编写插件来实现某种代码规范的检查。因此,本实施例的技术方案,可以设置成flake8插件的形式来进行代码自动修复,以期对代码文件既通过flake8进行静态检查,又采用本实施例自定义的flake8插件进行自动修复。

若采用这种方式,首先通过windows控制台或者linuxshell运行pipinstallflake8安装python的flake8依赖库。接下来编写setup.py,添加基于flake8的代码规范检查插件安装入口,然后利用ast(抽象语法树)编写检查脚本,并通过pythonsetup.pyinstall命令安装到flake8的扩展中,然后启动代码检查,最后对检查出的错误(本申请以print方法为例)进行自动修复,并生成修复后的代码文件。具体地,对于安装flake8,在windows或者linux下,都可以通过python的pip工具安装,即通过执行pipinstallflake8命令安装。对于编写setup.py来说,为了在flake8的基础上扩展检查规范的功能,在编写检查脚本之前,需要编写setup.py,该文件是为了帮助安装该脚本为flake8的扩展插件。具体编写示例可采用如图3所示的代码实现。

代码中,name(名称),version(版本),description(描述),author(作者)都是本实施例自定义的字段,用于标识一些个人信息,对于检查本身没有影响。py_module字段表示该扩展插件的名称,可定义为flake8_custom,entry_points字段以及它的flake8.extentsion字段的内容,表示该插件是flake8的一个扩展插件,后续的ct00等信息中的ct00/ct01/ct02表示扩展的检查规范在出错时的错误编号,“=”号后面的信息表示该错误是由flake8_custom模块中的custom_checker类产生的。

当调用flake8进行检查的时候,也会调用本实施例所编写的规范脚本对自定义的规范进行检查。flake8调用自定义的脚本时,会传入两个参数,抽象语法树tree和代码文件的文件名filename。

在步骤s220中,对所述抽象语法树中的节点进行递归枚举,查询并获取与待检查的语法结构对应的节点。

利用flake8传递过来的当前文件的抽象语法树,首先对该抽象语法树中所有的节点(node)进行枚举。此处抽象语法树的节点表示该文件中有意义的一些特殊语法结构,例如python中的try-except(异常控制对),class(类),function(函数)等。可利用python的ast库中自带的枚举函数ast.walk进行最外层节点的扫描。需要说明的是,抽象语法树中的节点是递归嵌套的,即每个语法结构内部可能包含更多的语法结构,例如class内定义了很多方法。

在步骤s230中,利用自定义逻辑对所述查询并获取到的所述节点进行扫描,并在扫描到不符合所述自定义逻辑的所述节点,生成错误信息。

完成对所有节点进行扫描之后,接下来就可以根据自定义规范进行语法检查,例如,查找哪些行使用了print,那么只需要在node.body语句中,查找是否含有ast.print对象即可。

在步骤s240中,对所述节点中不符合所述自定义逻辑的节点进行删除和/或修改。

检查到自定义的错误后,使用抽象语法树来进行规范的修复,同样以print为例:在某个node搜索到print节点后,直接将node.body语句中所有的ast.print对象删除,从而得到新的抽象语法树。

在步骤s230中,在步骤s250中,使用codegen库的to_source方法生成代码文件。

经过对原代码的抽象语法树进行解析、搜索和处理,对应的代码规范错误,都得到了自动的修复。接下来本步骤需要根据新的抽象语法树,生成新的修复后的代码:codegen.to_source(new_ast)

该步骤调用了codegen库的to_source方法,该方法传入值new_ast是上一步骤所获得的新的抽象语法树,该方法的输出,就是新的python源代码文件,此时将其写回对应的代码文件即可。

例如,以代码文件为python代码文件为例,可以使用codegen库的to_source方法根据所述新的抽象语法树生成代码文件。

图4示出了根据本发明另一实施例的代码修复的方法示意流程,如图4所示,本示例中用于删除使用了ast.print的对象的方法包括:

在步骤s410中,获取抽象语法树。

在步骤s420中,对所述抽象语法树中的节点进行递归枚举。

在步骤s430中,判断所述节点中是否含有错误对象,若是,则执行步骤s440,否则执行步骤s450。

在步骤s440中,删除检测到的所述错误对象。

在步骤s450中,修复完毕。

具体地,可以通过以下代码来表示:

def_init_(self,tree,filename=’(none)’,built-ins=none):

self.tree=tree

self.filename=filename

例如,通过flake8调用脚本时,通常会传入两个参数。如上述代码所表示,定义的类初始化时,传入的两个参数tree和filename。其中,参数tree表示flake8传递给脚本的ast结构,参数filename表示正在检查的文件名称。

节点递归枚举:

将ast结构中的所有节点进行枚举。例如,利用python的ast库中自带的枚举函数ast.walk进行最外层节点的扫描,因为节点是递归存在的,每个语法结构内部可能包含更多的语法结构,如class内定义了很多方法。

fornodeinast.walk(tree):

ifisinstance(node,ast.tryexcept):

haslog=false

在上一步骤中,可以对所有的节点进行扫描。然后针对可能出现的错误进行语法检查。举例说明,想要查找代码中哪些行使用了print,那么只需要在中查找是否含有ast.print语句的对象即可。

forsubnodeinnode.body:

ifisinstance(subnode,ast.print):

检查到所有的自定义错误后,通过ast树来进行规范的修复。例如,将该错误所在的文件名、行号等信息输出,然后找到所有错误对应的文件和行号进行逐个修改,再次提交代码和检查。具体为:

node.body=[xforxincontent.bodyifnotisinstance(x,ast.print)]

即将node.body中所有的ast.print对象删除。

最后通过上述步骤,对应的代码规范错误都得到了修复,从而根据新的ast生成新的修复后的代码。代码示例如下:

codegen.to_source(new_ast)

此处调用了codegen库的to_source方法,其中的传入值是上一步骤中修复完成后的ast树,从而得到新的python源代码,将其写入对应的代码文件中即可。

此外,在本发明实施例中,举例实用的编程语言为python,对应的静态代码检查库为flake8。应当理解的是,本发明还可应用到其他的编程语言,如c,c++,lisp、java、perl、ruby等,这些方案均在本发明的保护范围之内,在此不做赘述。

本实施例以将python代码文件中的ast.print对象为例,通过对被修复的python代码文件的抽象语法树中不符合设定规范的节点根据设定方法进行修复,根据修复后生成的新的抽象语法树生成代码文件。避免了人工修复引起的效率低、容易出错等问题。

图5示出了根据本发明一实施例的代码修复的装置的框图,如图5所示,本实施例所述的代码修复的装置包括抽象语法树获取单元510、节点获取单元520、节点扫描单元530、以及节点修复单元540。

该抽象语法树获取单元510被配置为,用于解析待修复的代码文件,获取所述待修复的代码文件的抽象语法树;

该节点获取单元520被配置为,用于对所述抽象语法树中的节点进行递归枚举,查询并获取与待检查的语法结构对应的节点;

该节点扫描单元530被配置为,用于利用自定义逻辑对所述查询并获取到的所述节点进行扫描,并在扫描到不符合所述自定义逻辑的所述节点,生成错误信息,其中,所述自定义逻辑是根据具体需求进行自定义的代码执行逻辑;

该节点修复单元540被配置为,用于修复所述不符合所述自定义逻辑的节点。

根据本发明的一些实施例,所述待检查的语法结构包括以下一种或多种:异常控制对、类、函数。

根据本发明的一些实施例,所述节点修复单元540用于:对所述节点中不符合所述自定义逻辑的节点进行删除和/或修改。

根据本发明的一些实施例,所述抽象语法树获取单元510用于:通过flake8获取所述待修复的代码文件的抽象语法树。

关于上述实施例中的装置,其中各个单元执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。

本实施例提供的代码修复的装置可执行本发明方法实施例所提供的代码修复的方法,具备执行方法相应的功能模块和有益效果。

图6示出了根据本发明一实施例的电子设备,适于运行包括脚本模块和原生应用模块的混合应用。

如图6所示,电子设备600可包括处理器610、存储器620、发射器630及接收器640。

存储器620可存储用于处理器610控制操作处理的指令。存储器620可包括易失性或非易失性存储器,如静态随机存取存储器(sram)、电可擦除可编程只读存储器(eeprom)、可擦除可编程只读存储器(eprom)、可编程只读存储器(prom)、只读存储器(rom)等,本发明对此没有限制。

处理器610可调用存储器620中存储的指令控制相关操作。根据一实施例,存储器620存储用于处理器610控制以下操作的指令:

解析待修复的代码文件,获取所述待修复的代码文件的抽象语法树;

对所述抽象语法树中的节点进行递归枚举,查询并获取与待检查的语法结构对应的节点;

利用自定义逻辑对所述查询并获取到的所述节点进行扫描,并在扫描到不符合所述自定义逻辑的所述节点,生成错误信息,其中,所述自定义逻辑是根据具体需求进行自定义的代码执行逻辑;

修复所述不符合所述自定义逻辑的节点。

易于理解,存储器620还可存储用于处理器610控制根据本发明实施例的其他操作的指令,这里不再赘述。

处理器610还可控制发射器630和接收器640进行信号收发等。

根据一些实施例,本发明还提供一种非临时性计算机可读存储介质,例如包括指令的存储器,上述指令可由装置的处理器执行以完成上述方法。例如,非临时性计算机可读存储介质可以是rom、随机存取存储器(ram)、cd-rom、磁带、软盘和光数据存储设备等。当存储介质中的指令由终端的处理器执行时,使得终端能够执行下述方法:解析待修复的代码文件,获取所述待修复的代码文件的抽象语法树;对所述抽象语法树中的节点进行递归枚举,查询并获取与待检查的语法结构对应的节点;利用自定义逻辑对所述查询并获取到的所述节点进行扫描,并在扫描到不符合所述自定义逻辑的所述节点,生成错误信息,其中,所述自定义逻辑是根据具体需求进行自定义的代码执行逻辑;修复所述不符合所述自定义逻辑的节点。

本领域技术人员可以理解,附图只是示例实施例的示意图,附图中的模块或流程并不一定是实施本发明所必须的,因此不能用于限制本发明的保护范围。

本领域技术人员可以理解上述各模块可以按照实施例的描述分布于装置中,也可以进行相应变化唯一不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。

以上具体地示出和描述了本发明的示例性实施例。应该理解,本发明不限于所公开的实施例,相反,本发明意图涵盖包含在所附权利要求的精神和范围内的各种修改和等效布置。

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