CN106371997B - 一种代码检查方法及装置 - Google Patents

一种代码检查方法及装置 Download PDF

Info

Publication number
CN106371997B
CN106371997B CN201610808505.XA CN201610808505A CN106371997B CN 106371997 B CN106371997 B CN 106371997B CN 201610808505 A CN201610808505 A CN 201610808505A CN 106371997 B CN106371997 B CN 106371997B
Authority
CN
China
Prior art keywords
node
checked
code
program file
logic
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
CN201610808505.XA
Other languages
English (en)
Other versions
CN106371997A (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.)
Netease Hangzhou Network Co Ltd
Original Assignee
Netease Hangzhou Network 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 Netease Hangzhou Network Co Ltd filed Critical Netease Hangzhou Network Co Ltd
Priority to CN201610808505.XA priority Critical patent/CN106371997B/zh
Publication of CN106371997A publication Critical patent/CN106371997A/zh
Application granted granted Critical
Publication of CN106371997B publication Critical patent/CN106371997B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种代码检查方法,包括如下步骤:接收待检查的程序文件的抽象语法树;对所述抽象语法树中的节点进行枚举,查询得到与待检查的语法结构对应的节点;利用自定义逻辑对查询得到的对应的节点进行检查,并在检查到所述节点不符合所述自定义逻辑时,生成错误信息;其中,所述自定义逻辑为用户根据需求自定义的代码执行逻辑。本发明还公开了一种代码检查装置,可实现灵活、扩展性高的静态代码检查,可根据项目的实际需要添加对应的自定义逻辑,满足项目开发的实际需要。

Description

一种代码检查方法及装置
技术领域
本发明涉及静态代码检查领域,尤其涉及一种代码检查方法及装置。
背景技术
在进行程序文件的编写过程中或调试过程中,对程序文件中进行静态代码检查是很重要的一个步骤。其中,静态代码检查是指不运行被测程序文件本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序文件的正确性。对需求规格说明书、软件设计说明书、源程序做结构分析、流程图分析、符号执行来找错。静态方法通过程序静态特性的分析,找出欠缺和可疑之处,例如不匹配的参数、不适当的循环嵌套和分支嵌套、不允许的递归、未使用过的变量、空指针的引用和可疑的计算等。静态代码检查的结果可用于进一步的查错,并为测试用例选取提供指导。
一般的编程语言都配置有静态代码检查库,用户根据这些静态代码检查库即可方便的利用这些静态代码检查库定义的规范对程序文件进行检查。以Python为例,针对Python语言的静态代码检查,目前较通用的有Pyflakes,pep8,Pychecker,pylint和flake8等多种python的扩展库。其中pep8是目前最权威的规范之一,包括了代码排版,字符串规范,空格规范,注释规范,命名规范等。Pyflakes较简单,检查的错误种类相对较单一,主要通过检查源文件分析程序并且检查各种错误。Pychecker则能够查找Python代码的bug,对代码的复杂度和格式等提出警告。Pylint是目前使用较多的检查库之一,它的特点是具有可配置性,包括检查规则的配置和检查结果的配置,能够生成较直观友好的检查报告。flake8封装了PyFlakes和pep8,以及代码复杂度检查工具NedBatchelder’s McCabescript,它最大的优点是可扩展。
具体地,以Pylint为例。Pylint作为使用较广泛的一种扩展库,能够分析和查找不符合pep8代码风格标准和有潜在问题的代码。它的原理是在python代码编译执行过程中进行词法分析,具体步骤如下:
1.Tokenizer进行词法分析,把原字符代码分解为各个Token;
2.Parser根据Token构建具体语法树(concrete syntax tree,CST);
3.CST转换为抽象语法树(abstract syntax tree,AST);
4.AST编译成字节码;
5.执行字节码。
上述5步为python代码的编译和执行过程。具体语法树和语言强相关,而且许多实现细节跟分析无关,冗余数据多,所以语法分析器用得最多的还是抽象语法树,pylint使用的就是ast模块来进行分析和查错。
发明内容
从上述可知,基于现有的静态代码检查库可以实现对程序文件中的代码的静态检查和一些基本的自定义设置,但现有的静态代码检查库只能检查现有标准中已有的规范,然而在具体的项目中,有时需要根据项目的特点和类型进行一些自定义的规范的检查,此时,现有的静态代码检查库无法满足要求。
针对上述问题,本发明的目的在于提供一种代码检查方法,包括如下步骤:
接收待检查的程序文件的抽象语法树;
对所述抽象语法树中的节点进行枚举,查询得到与待检查的语法结构对应的节点;
利用自定义逻辑对查询得到的对应的节点进行检查,并在检查到所述节点不符合所述自定义逻辑时,生成错误信息;其中,所述自定义逻辑为用户根据需求自定义的代码执行逻辑;所述自定义逻辑包括抛出异常时是否进行了trace检查,其中trace用于追踪try-except抛出的异常;
则所述利用自定义逻辑对查询得到的对应的节点进行检查,并在检查到所述节点不符合所述自定义逻辑时,生成错误信息,具体为:
定义第一标记变量并对所述第一标记变量初始赋值为False;
在查询到的与第一规范检查规则对应的ast.TryExcept节点的node.handlers[0]中寻找ast.Expr节点;
利用getattr方法获取所述ast.Expr节点的value字段所对应的内容,以确定except时调用的方法的名称;
当调用的方法的名称包括portable时,将所述第一标记变量赋值为True;否则不改变所述第一标记变量的赋值;
当所述第一标记变量的值为False时,生成错误信息。
优选地,所述抽象语法树由静态代码检查库对所述待检查的程序文件进行解析生成。
优选地,在接收待检查的程序文件的抽象语法树之前,还包括:
将预先生成的安装入口安装到静态代码检查库上;其中,所述安装入口通过执行预定的安装程序生成。
优选地,所述自定义逻辑还包括定义的类是否包含有手动解引用方法。
优选地,所述错误信息至少包括以下其中之一:所述自定义逻辑预先配置的错误编号、错误提示信息及发生错误的节点在所述待检查的程序文件中的行号。
优选地,在利用自定义逻辑对查询得到的对应的节点进行检查,并在检查到所述节点不符合所述自定义逻辑时,生成错误信息之后,还包括:
获取所述待检查的程序文件的每行代码的作者,并根据所述发生错误的节点在所述待检查的程序文件中的行号查找出与所述行号对应的作者。
本发明还提供一种代码检查装置,包括:
抽象语法树接收单元,用于接收待检查的程序文件的抽象语法树;
节点查询单元,用于对所述抽象语法树中的节点进行枚举,查询得到与待检查的语法结构对应的节点;
节点检查单元,用于利用自定义逻辑对查询得到的对应的节点进行检查,并在检查到所述节点不符合所述自定义逻辑时,生成错误信息;其中,所述自定义逻辑为用户根据需求自定义的代码执行逻辑;所述自定义逻辑包括抛出异常时是否进行了trace检查,其中trace用于追踪try-except抛出的异常;
则所述节点检查单元具体包括:
第一标记变量定义模块,用于定义第一标记变量并对所述第一标记变量初始赋值为False;
节点寻找模块,用于在查询到的与第一规范检查规则对应的ast.TryExcept节点的node.handlers[0]中寻找ast.Expr节点;
内容获取模块,用于利用getattr方法获取所述ast.Expr节点的value字段所对应的内容,以确定except时调用的方法的名称;
第一标记变量赋值模块,用于当调用的方法的名称包括portable时,将所述第一标记变量赋值为True;否则不改变所述第一标记变量的赋值;
第一错误信息生成模块,用于当所述第一标记变量的值为False时,生成错误信息。
优选地,所述抽象语法树由静态代码检查库对所述待检查的程序文件进行解析生成。
优选地,还包括:
安装单元,用于将预先生成的安装入口安装到静态代码检查库上;其中,所述安装入口通过执行预定的安装程序生成。
优选地,所述自定义逻辑还包括定义的类是否包含有手动解引用方法。
优选地,所述错误信息至少包括以下其中之一:所述自定义逻辑预先配置的错误编号、错误提示信息及发生错误的节点在所述待检查的程序文件中的行号。
优选地,还包括:
作者查找单元,用于获取所述待检查的程序文件的每行代码的作者,并根据所述发生错误的节点在所述待检查的程序文件中的行号查找出与所述行号对应的作者。
本发明公开的代码检查方法及装置,通过接收抽象语法检查树,再根据自定义逻辑对抽象语法检查树中的与待检查的语法结构对应的节点进行检查,并对不符合所述自定义逻辑的节点显示相应的错误信息,从而实现灵活、扩展性高的静态代码检查,如此,可根据项目的实际需要添加对应的自定义逻辑,满足用户项目开发的实际需要。
附图说明
为了更清楚地说明本发明的技术方案,下面将对实施方式中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的代码检查装置的一种结构示意图。
图2是本发明实施例提供的代码检查方法的流程示意图。
图3是本发明实施例提供的代码检查装置的另一种结构示意图。
图4是本发明实施例提供代码检查装置的另一种结构示意图。
图5是图3所示的节点检查单元的一种结构示意图。
图6是图3所示的节点检查单元的一种结构示意图。
图7是本发明实施例提供代码检查装置的另一种结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明提供了一种代码检查方法及装置,用于利用自定义逻辑对待检查的程序文件进行静态的检查,以下分别进行描述。
请参阅图1,图1是本发明实施例提供的代码检查装置的一种结构示意图,用于执行本发明实施例提供的代码检查方法,所述代码检查装置包括:至少一个处理器11,例如CPU,至少一个网络接口14或者其他用户接口13,存储器15,至少一个通信总线12。通信总线12用于实现这些组件之间的连接通信。其中,用户接口13可选的可以包括USB接口以及其他标准接口、有线接口。网络接口14可选的可以包括Wi-Fi接口以及其他无线接口。存储器15可能包含高速RAM存储器,也可能还包括非不稳定的存储器(non-volatilememory),例如至少一个磁盘存储器。存储器15可选的可以包含至少一个位于远离前述处理器11的存储装置。
在一些实施方式中,存储器15存储了如下的元素,可执行模块或者数据结构,或者他们的子集,或者他们的扩展集:
操作系统151,包含各种系统程序,用于实现各种基础业务以及处理基于硬件的任务;
应用模块152,包含设备控制服务程序、设备识别服务程序等各种应用程序,用于实现各种应用业务。
具体地,处理器11用于调用存储器15中存储的程序,执行以下操作:
接收待检查的程序文件的抽象语法树;
对所述抽象语法树中的节点进行枚举,查询得到与待检查的语法结构对应的节点;
利用自定义逻辑对查询得到的对应的节点进行检查,并在检查到所述节点不符合所述自定义逻辑时,生成错误信息;其中,所述自定义逻辑为用户根据需求自定义的代码执行逻辑。
上述技术方案中,所述代码检查方法装置通过接收抽象语法检查树,再根据自定义逻辑对抽象语法检查树中的与待检查的语法结构对应的节点进行检查,从而实现灵活、扩展性高的静态代码检查,如此,可根据项目的实际需要添加对应的自定义逻辑,满足用户项目开发的实际需要。
为了更清楚的说明本发明实施例,下面将详细介绍所述代码检查装置执行上述实施例的操作过程。
请参阅图2,图2是本发明实施例提供的一种代码检查方法的流程示意图,其至少包括如下步骤:
S101,接收待检查的程序文件的抽象语法树。
在本发明实施例中,所述抽象语法检查树(abstract syntax tree,AST)可由已有的静态代码检查库对待检查的程序文件进行解析生成。例如,假设所述待检查的程序文件是由Python语言编写,则可使用flake8作为静态代码检查库对所述待检查的程序进行解析来生成AST。
在本发明实施例中,所述代码检查装置可通过一个预先生成的安装入口获取所述静态代码检查库检查生成的AST,所述安装入口可通过执行预先编写的安装程序生成。如此,当flake8对所述待检查的程序文件进行解析的时候会生成AST结构,所述flake8将所述AST结构及待检查的程序文件的文件名通过所述安装入口传递给所述代码检查装置。
在本发明实施例中,所述安装入口定义了若干用于标识个人信息的字段,如名字字段、版本字段、描述字段及作者字段等。
S102,对所述抽象语法树中的节点进行枚举,查询得到与待检查的语法结构对应的节点。
在本发明实施例中,所述代码检查装置在接收到由flake8传递过来的AST后,对AST中所有的节点进行枚举。此处AST的节点表示该程序文件中有意义的一些特殊语法结构,例如python中的try-except(异常控制对),class(类),function(函数)等。所述代码检查装置可执行Python的AST库中自带的枚举函数ast.walk进行最外层(节点是递归存在的,意思是每个语法结构内部可能包含更多的语法结构,例如class内定义了很多方法)节点的扫描,来获得与待检查的语法结构对应的节点。
例如,假设要检查的是try-expect和class的规范,那么则首先需要在AST中找到ast.TryExcept节点和ast.ClassDef节点,表示try-except对和class的定义结构。此时,所述代码检查装置可通过执行isinstance函数来查找AST中的相应节点,其中,在查找时,向所述isinstance函数传入node,type两个参数,即可利用isinstance(node,type)来检查当前的node(节点)的类型是否是后一个参数type的函数,如执行isinstance(node,ast.TryExcept)可在AST中找到ast.TryExcept节点,执行isinstance(node,ast.ClassDef)可在AST中找到ast.ClassDef节点。
S103,利用自定义逻辑对查询得到的对应的节点进行检查,并在检查到所述节点不符合所述自定义逻辑时,生成错误信息;其中,所述自定义逻辑为用户根据需求自定义的代码执行逻辑。
在本发明实施例中,所述代码检查装置在定位到对应的节点后,即可根据自定义逻辑对对应的所述节点进行检查,判断这些节点是否符合所述自定义逻辑。
在一个实施例中,所述自定义逻辑包括抛出异常时是否进行了trace检查,其中trace用于追踪try-except抛出的异常。
则步骤S103具体为:
S1031,定义第一标记变量并对所述第一标记变量初始赋值为False。
S1032,在查询到的与第一规范检查规则对应的ast.TryExcept节点的node.handlers[0]中寻找ast.Expr节点。
S1033,利用getattr方法获取所述ast.Expr节点的value字段所对应的内容,以确定except时调用的方法的名称。
S1034,当调用的方法的名称包括portable时,将所述第一标记变量赋值为True;否则不改变所述第一标记变量的赋值。
S1035,当所述第一标记变量的值为False时,生成错误信息。
其中,所述错误信息至少包括以下其中之一:所述自定义逻辑预先配置的错误编号、错误提示信息及发生错误的节点在所述待检查的程序文件中的行号。
例如,假设检查到所述节点不符合所述自定义逻辑,则可输出错误编号(如CT00,由所述自定义逻辑预先配置并唯一标识)和错误提示信息(如输出“没有trace收集”),发生错误的节点对应的行号(即try-except入口处的行号)。
在一个实施例中,所述自定义逻辑包括定义的类是否包含有手动解引用方法,其是为了防止忘记手动解引用而导致内存泄漏,因此要检查每个class是否定义了destroy方法来处理相关对象的引用解除。
则步骤S103具体为:
S1036,定义第二标记变量并初始赋值为False。
S1037,在查询到的与所述第二规范检查规则对应的ast.ClassDef节点的node.body中搜索子节点childnode。
S1038,当所述子节点childnode的类型为ast.FunctionDef时,利用getattr方法获取所述子节点childnode的name字段的值。
S1039,当所述name字段的值为destroy_object时,将所述第二标记变量赋值为True;否则不改变所述第一标记变量的赋值。
S10310,当所述第二标记变量的值为False时,生成错误信息。
其中,所述错误信息至少包括以下其中之一:所述自定义逻辑预先配置的错误编号、错误提示信息及发生错误的节点在所述待检查的程序文件中的行号。
需要说明的是,在本发明的其他实施例中,还可根据项目的实际需要自定义其他的代码执行逻辑,以上所述的两个代码执行逻辑仅是本发明的两个实际例子,不能理解为本发明的全部代码执行逻辑。
此外,在本发明实施例中,举例使用的编程语言为Python,对应的静态代码检查库为flake8。应当理解的是,本发明还可应用到其他的编程语言,如C,C++,Lisp、Java、Perl、Ruby等,这些方案均在本发明的保护范围之内,在此不做赘述。
综上所述,本发明公开的代码检查方法,通过接收抽象语法检查树,再根据自定义逻辑对抽象语法检查树中的与待检查的语法结构对应的节点进行检查,从而实现灵活、扩展性高的静态代码检查,如此,可根据项目的实际需要添加对应的自定义逻辑,满足用户项目开发的实际需要。
为了便于对本发明的理解,下面将对本发明的一些优选实施例做进一步的描述。
优选地,在步骤S103之后,所述错误信息包括发生错误的节点在所述待检查的程序文件中的行号,则所述方法还包括:
S104,获取所述待检查的程序文件的每行代码的作者,并根据所述发生错误的节点在所述待检查的程序文件中的行号查找出与所述行号对应的作者。
在本优选实施例中,如果待检查的程序文件在开发过程中使用了版本控制软件svn(Subversion),则所述代码检查装置可通过执行svn blame命令,查看待检查的程序文件的每行代码的作者,再与错误信息中的发生错误的节点在所述待检查的程序文件中的行号进行对比,就可以快速地找出不符合所述自定义逻辑的代码对应的作者,进而及时做出修改,提升了项目的开发和维护进度。
请一并参阅图3,本发明实施例还提供了一种代码检查装置100,包括:
抽象语法树接收单元10,用于接收待检查的程序文件的抽象语法树。
其中,述抽象语法树由静态代码检查库对所述待检查的程序文件进行解析生成。
节点查询单元20,用于对所述抽象语法树中的节点进行枚举,查询得到与待检查的语法结构对应的节点。
节点检查单元30,用于利用自定义逻辑对查询得到的对应的节点进行检查,并在检查到所述节点不符合所述自定义逻辑时,生成错误信息;其中,所述自定义逻辑为用户根据需求自定义的代码执行逻辑。
其中,所述自定义逻辑至少包括以下其中之一:抛出异常时是否进行了trace检查、定义的类是否包含有手动解引用方法。
本发明实施提供的代码检查装置100,通过所述抽象语法树接收单元10接收AST,再利用节点检查单元30根据自定义逻辑对AST中的预定的节点进行检查,从而实现灵活、扩展性高的静态代码检查,如此,可根据项目的实际需要添加对应的规范检查规则,满足项目开发的实际需要。
优选地,请一并参阅图4,所述代码检查装置100还包括:
安装单元40,用于将预先生成的安装入口安装到静态代码检查库上;其中,所述安装入口通过执行预定的安装程序生成。
优选地,请一并参阅图5,在一个实施例中,所述自定义逻辑包括抛出异常时是否进行了trace检查,其中trace用于追踪try-except抛出的异常。
则所述节点检查单元30具体包括:
第一标记变量定义模块31,用于定义第一标记变量并对所述第一标记变量初始赋值为False;
节点寻找模块32,用于在查询到的与第一规范检查规则对应的ast.TryExcept节点的node.handlers[0]中寻找ast.Expr节点;
内容获取模块33,用于利用getattr方法获取所述ast.Expr节点的value字段所对应的内容,以确定except时调用的方法的名称;
第一标记变量赋值模块34,用于当调用的方法的名称包括portable时,将所述第一标记变量赋值为True;否则不改变所述第一标记变量的赋值;
第一错误信息生成模块35,用于当所述第一标记变量的值为False时,生成错误信息。
其中,所述错误信息至少包括以下其中之一:所述自定义逻辑预先配置的错误编号、错误提示信息及发生错误的节点在所述待检查的程序文件中的行号。
优选地,请一并参阅图6,在一个实施例中,所述自定义逻辑包括定义的类是否包含有手动解引用方法,其是为了防止忘记手动解引用而导致内存泄漏,因此要检查每个class是否定义了destroy方法来处理相关对象的引用解除。
则所述节点检查单元30具体包括:
第二标记变量定义模块36,用于定义第二标记变量并对所述第二标记变量初始赋值为False。
子节点寻找模块37,用于在查询到的与所述第二规范检查规则对应的ast.ClassDef节点的node.body中搜索子节点childnode。
字段值获取模块38,用于当所述子节点childnode的类型为ast.FunctionDef时,利用getattr方法获取所述子节点childnode的name字段的值。
第二标记变量赋值模块39,用于当所述name字段的值为destroy_object时,将所述第二标记变量赋值为True;否则不改变所述第一标记变量的赋值。
第二错误信息生成模块310,用于当所述第二标记变量的值为False时,生成错误信息。
其中,所述错误信息至少包括以下其中之一:所述自定义逻辑预先配置的错误编号、错误提示信息及发生错误的节点在所述待检查的程序文件中的行号。
优选地,请一并参阅图7,所述错误信息包括发生错误的节点在所述待检查的程序文件中的行号;
则所述代码检查装置100还包括:
作者查找单元50,用于获取所述待检查的程序文件的每行代码的作者,并根据所述发生错误的节点在所述待检查的程序文件中的行号查找出与所述行号对应的作者。
在本优选实施例中,如果待检查的程序文件在开发过程中使用了版本控制软件svn,可以使用svn blame命令查看待检查的程序文件的每行代码的作者,所述作者查找单元50再与发生错误的节点在所述待检查的程序文件中的行号相对比,就可以快速地找出不符合规范检查规则的代码对应的作者,进而快速做出修改,提升了项目的开发速度。
以上所揭露的仅为本发明一种较佳实施例而已,当然不能以此来限定本发明之权利范围,本领域普通技术人员可以理解实现上述实施例的全部或部分流程,并依本发明权利要求所作的等同变化,仍属于发明所涵盖的范围。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random AccessMemory,RAM)等。

Claims (12)

1.一种代码检查方法,其特征在于,包括如下步骤:
接收待检查的程序文件的抽象语法树;
对所述抽象语法树中的节点进行枚举,查询得到与待检查的语法结构对应的节点;
利用自定义逻辑对查询得到的对应的节点进行检查,并在检查到所述节点不符合所述自定义逻辑时,生成错误信息;其中,所述自定义逻辑为用户根据需求自定义的代码执行逻辑;所述自定义逻辑包括抛出异常时是否进行了trace检查,其中trace用于追踪try-except抛出的异常;
则所述利用自定义逻辑对查询得到的对应的节点进行检查,并在检查到所述节点不符合所述自定义逻辑时,生成错误信息,具体为:
定义第一标记变量并对所述第一标记变量初始赋值为False;
在查询到的与第一规范检查规则对应的ast.TryExcept节点的node.handlers[0]中寻找ast.Expr节点;
利用getattr方法获取所述ast.Expr节点的value字段所对应的内容,以确定except时调用的方法的名称;
当调用的方法的名称包括portable时,将所述第一标记变量赋值为True;否则不改变所述第一标记变量的赋值;
当所述第一标记变量的值为False时,生成错误信息。
2.根据权利要求1所述的代码检查方法,其特征在于,所述抽象语法树由静态代码检查库对所述待检查的程序文件进行解析生成。
3.根据权利要求1所述的代码检查方法,其特征在于,在接收待检查的程序文件的抽象语法树之前,还包括:
将预先生成的安装入口安装到静态代码检查库上;其中,所述安装入口通过执行预定的安装程序生成。
4.根据权利要求1所述的代码检查方法,其特征在于,所述自定义逻辑还包括定义的类是否包含有手动解引用方法。
5.根据权利要求1至4任意一项所述的代码检查方法,其特征在于,所述错误信息至少包括以下其中之一:所述自定义逻辑预先配置的错误编号、错误提示信息及发生错误的节点在所述待检查的程序文件中的行号。
6.根据权利要求1所述的代码检查方法,其特征在于,所述错误信息包括发生错误的节点在所述待检查的程序文件中的行号;
则在利用自定义逻辑对查询得到的对应的节点进行检查,并在检查到所述节点不符合所述自定义逻辑时,生成错误信息之后,还包括:
获取所述待检查的程序文件的每行代码的作者,并根据所述发生错误的节点在所述待检查的程序文件中的行号查找出与所述行号对应的作者。
7.一种代码检查装置,其特征在于,包括:
抽象语法树接收单元,用于接收待检查的程序文件的抽象语法树;
节点查询单元,用于对所述抽象语法树中的节点进行枚举,查询得到与待检查的语法结构对应的节点;
节点检查单元,用于利用自定义逻辑对查询得到的对应的节点进行检查,并在检查到所述节点不符合所述自定义逻辑时,生成错误信息;其中,所述自定义逻辑为用户根据需求自定义的代码执行逻辑;所述自定义逻辑包括抛出异常时是否进行了trace检查,其中trace用于追踪try-except抛出的异常;
则所述节点检查单元具体包括:
第一标记变量定义模块,用于定义第一标记变量并对所述第一标记变量初始赋值为False;
节点寻找模块,用于在查询到的与第一规范检查规则对应的ast.TryExcept节点的node.handlers[0]中寻找ast.Expr节点;
内容获取模块,用于利用getattr方法获取所述ast.Expr节点的value字段所对应的内容,以确定except时调用的方法的名称;
第一标记变量赋值模块,用于当调用的方法的名称包括portable时,将所述第一标记变量赋值为True;否则不改变所述第一标记变量的赋值;
第一错误信息生成模块,用于当所述第一标记变量的值为False时,生成错误信息。
8.根据权利要求7所述的代码检查装置,其特征在于,所述抽象语法树由静态代码检查库对所述待检查的程序文件进行解析生成。
9.根据权利要求7所述的代码检查装置,其特征在于,还包括:
安装单元,用于将预先生成的安装入口安装到静态代码检查库上;其中,所述安装入口通过执行预定的安装程序生成。
10.根据权利要求7所述的代码检查装置,其特征在于,所述自定义逻辑还包括定义的类是否包含有手动解引用方法。
11.根据权利要求7至10任意一项所述的代码检查装置,其特征在于,所述错误信息至少包括以下其中之一:所述自定义逻辑预先配置的错误编号、错误提示信息及发生错误的节点在所述待检查的程序文件中的行号。
12.根据权利要求7所述的代码检查装置,其特征在于,所述错误信息包括发生错误的节点在所述待检查的程序文件中的行号;
则所述代码检查装置还包括:
作者查找单元,用于获取所述待检查的程序文件的每行代码的作者,并根据所述发生错误的节点在所述待检查的程序文件中的行号查找出与所述行号对应的作者。
CN201610808505.XA 2016-09-07 2016-09-07 一种代码检查方法及装置 Active CN106371997B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610808505.XA CN106371997B (zh) 2016-09-07 2016-09-07 一种代码检查方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610808505.XA CN106371997B (zh) 2016-09-07 2016-09-07 一种代码检查方法及装置

Publications (2)

Publication Number Publication Date
CN106371997A CN106371997A (zh) 2017-02-01
CN106371997B true CN106371997B (zh) 2020-01-10

Family

ID=57899334

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610808505.XA Active CN106371997B (zh) 2016-09-07 2016-09-07 一种代码检查方法及装置

Country Status (1)

Country Link
CN (1) CN106371997B (zh)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107015813A (zh) * 2017-04-19 2017-08-04 网易(杭州)网络有限公司 代码修复的方法、装置及电子设备
CN107678957A (zh) * 2017-09-25 2018-02-09 中国银行股份有限公司 一种网银代码自动化检查方法及装置
CN109117633B (zh) * 2018-08-13 2022-11-04 百度在线网络技术(北京)有限公司 静态源码扫描方法、装置、计算机设备及存储介质
CN110309050A (zh) * 2019-05-22 2019-10-08 深圳壹账通智能科技有限公司 代码规范性的检测方法、装置、服务器及存储介质
CN110659204B (zh) * 2019-08-20 2021-04-20 腾讯科技(深圳)有限公司 一种代码检测方法、设备及介质
CN111625224B (zh) * 2020-05-28 2023-11-24 北京百度网讯科技有限公司 代码生成方法、装置、设备及存储介质
CN114579203B (zh) * 2022-03-07 2024-03-15 网易(杭州)网络有限公司 脚本文件检查方法、装置、电子设备及存储介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101017458A (zh) * 2007-03-02 2007-08-15 北京邮电大学 基于源代码静态分析的软件安全代码分析器及其检测方法
CN101482847A (zh) * 2009-01-19 2009-07-15 北京邮电大学 一种基于安全漏洞缺陷模式的检测方法
CN103778061A (zh) * 2014-01-17 2014-05-07 南京航空航天大学 数组越界错误的自动检测和校正方法
CN105404584A (zh) * 2015-11-25 2016-03-16 广州博冠信息科技有限公司 Lpc静态代码检查方法、装置和系统

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010504572A (ja) * 2006-09-20 2010-02-12 ナショナル アイシーティー オーストラリア リミテッド モデル検査で用いられる遷移システムの生成

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101017458A (zh) * 2007-03-02 2007-08-15 北京邮电大学 基于源代码静态分析的软件安全代码分析器及其检测方法
CN101482847A (zh) * 2009-01-19 2009-07-15 北京邮电大学 一种基于安全漏洞缺陷模式的检测方法
CN103778061A (zh) * 2014-01-17 2014-05-07 南京航空航天大学 数组越界错误的自动检测和校正方法
CN105404584A (zh) * 2015-11-25 2016-03-16 广州博冠信息科技有限公司 Lpc静态代码检查方法、装置和系统

Also Published As

Publication number Publication date
CN106371997A (zh) 2017-02-01

Similar Documents

Publication Publication Date Title
CN106371997B (zh) 一种代码检查方法及装置
CN109918294B (zh) 一种混源软件自主可控性检测方法及系统
US9122540B2 (en) Transformation of computer programs and eliminating errors
JP4693044B2 (ja) ソースコード脆弱性検査装置
CN109033843B (zh) 用于分布式静态检测系统的Java文件依赖性分析方法及模块
CN106843840B (zh) 一种基于相似度分析的源代码版本演化注释复用方法
CN112394942B (zh) 基于云计算的分布式软件开发编译方法及软件开发平台
Zhang et al. Analyzing and supporting adaptation of online code examples
US8954940B2 (en) Integrating preprocessor behavior into parsing
CN110059006B (zh) 代码审计方法及装置
WO2011101206A1 (en) A method and a system for searching for parts of a computer program which affects a given symbol
CN115016793A (zh) 基于语法树的代码生成方法和装置、电子设备、存储介质
US10789154B2 (en) Client server computer code mapping and visualization
US20210089284A1 (en) Method and system for using subroutine graphs for formal language processing
Gulabovska et al. Survey on Static Analysis Tools of Python Programs.
JP2010140407A (ja) ソースコード検査装置
CN109359055B (zh) 一种数据测试的方法和设备
Agarwal et al. Copilot Evaluation Harness: Evaluating LLM-Guided Software Programming
Khatoon et al. An evaluation of source code mining techniques
CN112631944A (zh) 基于抽象语法树的源码检测方法及装置、计算机存储介质
CN114691197A (zh) 代码分析方法、装置、电子设备和存储介质
CN115221047A (zh) 测试用例自动生成方法及电子设备
CN114895914A (zh) 日志输出代码的生成方法、装置、电子设备及存储介质
CN112286784B (zh) 一种测试用例生成方法、装置、服务器及存储介质
CN112433943A (zh) 基于抽象语法树的环境变量检测方法、装置、设备及介质

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant