CN116775483A - 代码评审方法及装置 - Google Patents

代码评审方法及装置 Download PDF

Info

Publication number
CN116775483A
CN116775483A CN202310746647.8A CN202310746647A CN116775483A CN 116775483 A CN116775483 A CN 116775483A CN 202310746647 A CN202310746647 A CN 202310746647A CN 116775483 A CN116775483 A CN 116775483A
Authority
CN
China
Prior art keywords
file
analyzed
data object
annotation
node
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.)
Pending
Application number
CN202310746647.8A
Other languages
English (en)
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.)
Shanghai Bilibili Technology Co Ltd
Original Assignee
Shanghai Bilibili Technology 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 Shanghai Bilibili Technology Co Ltd filed Critical Shanghai Bilibili Technology Co Ltd
Priority to CN202310746647.8A priority Critical patent/CN116775483A/zh
Publication of CN116775483A publication Critical patent/CN116775483A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Stored Programmes (AREA)

Abstract

本申请提供代码评审方法及装置,其中代码评审方法包括:获取项目源代码,并遍历项目源代码,查找设定文件类型的至少一个待分析文件;确定第一待分析文件是否为数据对象文件,其中,第一待分析文件为至少一个待分析文件中的任一个;若第一待分析文件为数据对象文件,则获取第一待分析文件的抽象语法树中的各个类节点;遍历各个类节点,提取各个类节点下基本类型的字段声明,根据提取到的字段声明是否为空,确定项目源代码中是否存在基本类型的类型变量。如此,自动化扫描项目源代码,根据项目源代码提取出抽象语法树,快速查找项目源代码中是否存在基本类型的类型变量,查找时间快,准确度高,减少了人工成本。

Description

代码评审方法及装置
技术领域
本申请涉及计算机技术领域,特别涉及一种代码评审方法。本申请同时涉及一种代码评审装置,一种计算设备,以及一种计算机可读存储介质。
背景技术
随着计算机技术和互联网技术的快速发展,互联网行业已然发展成为炙手可热的行业,工作和生活的角落都充斥着各种互联网产品,而每个互联网产品都需要基于开发人员编写的代码实现。开发人员在开发互联网产品时,往往需要对数据变量进行定义,由于开发人员的开发经验及对代码理解不同,在代码的开发过程中,对数据传输组件内部的变量进行定义时,有时会使用一些基本类型(Primitive)对变量进行定义,这种写法并不会触发语法错误,代码编译也不会发生异常,但是由于基本类型(Primitive)在面向对象的编程模式下缺乏对空值(NULL)的处理,在一些对外的接口中,若调用者传入空值(NULL)的时候,可能会导致程序异常,造成严重的线上问题。
由于这种写法并不会引起编译错误,很难通过编译器发现此类问题,同时也很难通过测试发现该类问题,现有技术中,为了避免出现类似问题,往往是通过人工进行代码评审,查找代码中是否使用基本类型(Primitive)的类型变量,以解决该类问题。然而,上述方法中,人工进行代码评审这种方式往往可能存在遗漏、误判等问题,且一个项目的代码可能上万行,完全通过人工进行代码评审的方式,需要耗费大量的时间,影响项目进度。
发明内容
有鉴于此,本申请实施例提供了一种代码评审方法。本申请同时涉及一种代码评审装置,一种计算设备,以及一种计算机可读存储介质,以解决现有技术中存在的遗漏、误判等技术问题,以及需要耗费大量的时间,影响项目进度等技术问题。
根据本申请实施例的第一方面,提供了一种代码评审方法,包括:
获取项目源代码,并遍历项目源代码,查找设定文件类型的至少一个待分析文件;
确定第一待分析文件是否为数据对象文件,其中,第一待分析文件为至少一个待分析文件中的任一个;
若第一待分析文件为数据对象文件,则获取第一待分析文件的抽象语法树中的各个类节点;
遍历各个类节点,提取各个类节点下基本类型的字段声明,根据提取到的字段声明是否为空,确定项目源代码中是否存在基本类型的类型变量。
根据本申请实施例的第二方面,提供了一种代码评审装置,包括:
查找模块,被配置为获取项目源代码,并遍历项目源代码,查找设定文件类型的至少一个待分析文件;
第一确定模块,被配置为确定第一待分析文件是否为数据对象文件,其中,第一待分析文件为至少一个待分析文件中的任一个;
获取模块,被配置为若第一待分析文件为数据对象文件,则获取第一待分析文件的抽象语法树中的各个类节点;
第二确定模块,被配置为遍历各个类节点,提取各个类节点下基本类型的字段声明,根据提取到的字段声明是否为空,确定项目源代码中是否存在基本类型的类型变量。
根据本申请实施例的第三方面,提供了一种计算设备,包括:
存储器和处理器;
存储器用于存储计算机可执行指令,处理器用于执行计算机可执行指令,以实现上述的代码评审方法的步骤。
根据本申请实施例的第四方面,提供了一种计算机可读存储介质,其存储有计算机可执行指令,该计算机可执行指令被处理器执行时实现上述的代码评审方法的步骤。
本申请实施例提供的代码评审方法,获取项目源代码,并遍历项目源代码,查找设定文件类型的至少一个待分析文件;确定第一待分析文件是否为数据对象文件,其中,第一待分析文件为至少一个待分析文件中的任一个;若第一待分析文件为数据对象文件,则获取第一待分析文件的抽象语法树中的各个类节点;遍历各个类节点,提取各个类节点下基本类型的字段声明,根据提取到的字段声明是否为空,确定项目源代码中是否存在基本类型的类型变量。
这种情况下,获取到项目源代码后,可以遍历项目源代码的整个文件夹,筛选出设定文件类型的待分析文件,然后进一步筛选待分析文件是否为数据对象文件,针对数据对象文件,再基于其抽象语法树中的各个类节点,提取各个类节点下基本类型的字段声明,根据提取到的字段声明是否空,确定项目源代码中是否存在基本类型的类型变量。如此,自动化扫描项目源代码,根据项目源代码提取出抽象语法树,快速查找项目源代码中是否存在基本类型的类型变量,查找时间快,且通过自动化扫描的方式,避免了人工查找的漏查、误判等问题,查找准确度高,再者查询过程不再依赖人工,完全通过自动化脚本实现,减少了人工成本。
附图说明
图1是本申请一实施例提供的一种代码评审方法的流程图;
图2是本申请一实施例提供的一种应用于java编程语言下的代码评审方法的处理流程图;
图3是本申请一实施例提供的一种代码评审装置的结构示意图;
图4是本申请一实施例提供的一种计算设备的结构框图。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。
在本申请一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请一个或多个实施例。在本申请一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本申请一个或多个实施例中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本申请一个或多个实施例中可能采用术语第一、第二等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请一个或多个实施例范围的情况下,第一也可以被称为第二,类似地,第二也可以被称为第一。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
首先,对本申请一个或多个实施例涉及的名词术语进行解释。
POJO(PlainOrdinaryjavaObject)类:是不包含业务逻辑的透明组件,有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection(连接)之类的方法,就像其命名那样,它的确简单只用作单纯的DTO(DataTransportObject,数据传输对象)或者VO(ValueObject,值对象),它通常的构成形式为一个包含私有变量作为属性以及访问其属性的getter和setter方法的类,根据需要可以为其添加constructor(构造函数)。POJO是一种简单的java对象,实际就是普通的java类,是为了避免和EJB(EnterprisejavaBeans,企业级java类)混淆所创造的简称,实质上可以理解为简单的实体类,顾名思义POJO类的作用是方便开发人员使用数据库中的数据表,对于广大的开发人员,可以很方便的将POJO类当做对象来进行使用。
Primitive类型:即基本类型,主要用来存储原始的数据,包含boolean、char、byte、short、int、long、float等。所谓的基本类型是相对于引用类型(Reference)来说的,在java中,每个变量(variable)都代表一个存储值的内存位置,我们可以声明一个基本类型变量,也可以声明一个引用类型变量。对于基本类型变量来说,对应内存所存储的值是原始类型值;对于引用类型变量来说,对应内存所存储的值是一个引用(Reference),可以理解为是对象的存储地址。
抽象语法树:在计算机科学中,抽象语法树是源代码语法结构的一种抽象表示,它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。之所以说是抽象的,是因为抽象语法树并不会表示出真实语法出现的每一个细节,比如说,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现,抽象语法树并不依赖于源语言的语法。
需要说明的是,在软件项目开发过程中,由于开发者开发经验及对代码理解不同,在代码的开发过程中,在对POo(数据传输组件)内部的变量进行定义时,有时会使用一些Primitive类型对变量进行定义,这种写法并不会触发语法错误,代码编译也不会发生异常,但是由于Primitive(基本类型)在面向对象的编程模式下缺乏对NULL(空值)的处理,在一些对外的接口中,调用者传入NULL(空值)的时候,可能会导致程序异常,造成严重的线上问题。
由于这种写法并不会引起编译错误,因而很难通过编译器发现此类问题,同时也很难通过测试发现该类问题,通常情况下,为了避免出现类似问题,往往是通过向开发人员宣导编码规范及代码开发人员自身代码能力和对业务场景判断,以及通过人工代码评审(codereview)解决该类问题。
上述方法中,通过人工代码评审(codereview)这种方式,往往存在遗漏、误判等问题,且一个项目的代码可能上万行,完全通过人工代码评审(codereview)的方式,需要耗费大量的时间,影响项目进度。
因而本申请实施例中,提供了一种自动化的代码评审方法,通过自动化脚本扫描项目源代码,根据java源代码提取出抽象语法树,快速查找项目源代码中POJO类中是否存在使用Primitive类型变量的情况,通过遍历项目源代码抽象语法树,采用自动化脚本的方式实现项目源代码中POJO类中Primitive类型变量查找,相比较人工查找,查找时间大大减少,且由于通过脚本的方式自动查找,避免了人工查找的漏查、误差等问题,查找准确度高,再者查询过程不再依赖人工,完全通过自动化脚本方法,大大降低了研发人工成本。
在本申请中,提供了一种代码评审方法,本申请同时涉及一种代码评审装置,一种计算设备,以及一种计算机可读存储介质,在下面的实施例中逐一进行详细说明。
图1示出了根据本申请一实施例提供的一种代码评审方法的流程图,具体包括以下步骤:
步骤102:获取项目源代码,并遍历项目源代码,查找设定文件类型的至少一个待分析文件。
具体的,设定文件类型是指需要进行遍历,查找是否存在使用基本类型的类型变量对应的文件类型,也即是项目源代码中的编程语言文件,即实际的代码文件。例如,java编程语言场景下,设定文件类型可以为文件后缀为“.java”类型。
实际应用中,可以从项目源码管理仓库中通过获取命令获取项目源代码。需要说明的是,获取到项目源代码后,可以深度遍历项目源码整个文件夹、子文件夹等,查找所有的后缀为“.java”的文件,作为待分析文件,该待分析文件即为可能使用到基本类型的类型变量的文件,后续需要进行分析确认。另外,还可以将查找出的各个待分析文件保存到java文件列表,便于后续可以对该java文件列表中的各个待分析文件逐一遍历,确定是否使用基本类型的类型变量。
本实施例一个可选的实施方式中,由于不同的开发人员在对文件命名时,习惯不同,所以同一类型的文件其命名格式可能并不相同,为了便于后续的查找分析,还可以对各个待分析文件的文件名进行统一化处理,也即遍历项目源代码,查找设定文件类型的至少一个待分析文件之后,还可以包括:
确定至少一个待分析文件中与设定格式不同的目标文件;
将目标文件的文件名转换为设定格式。
需要说明的是,设定格式是预先设定的统一格式,如小写、大写等。实际应用中,将java文件列表中各个待分析文件的文件名转换为设定格式时,可以先确定java文件列表中各个待分析文件的文件名是否为设定格式,若是,则无需再进行转换;若否,则将其文件名转换为设定格式。
示例的,假设设定格式为小写,java文件列表中包括5个待分析文件,分别为XXXDTO.java、XXXYYY.java、XXXPo.java、xxxvo.java、XXXZZz.java等。xxxvo.java的文件名为“xxxvo.java”,本身就是小写,无需转换;XXXDTO.java的文件名为“XXXDTO”,均为大写,需要转换为小写,转换后的待分析文件的文件名为“xxxdto.java”;XXXYYY.java的文件名为“XXXYYY”,也均为大写,需要转换为小写,转换后的待分析文件的文件名为“xxxyyy.java”;XXXPo.java的文件名为“XXXPo”,为大小写混合,需要将其中的大写字符转换为小写,转换后的待分析文件的文件名为“xxxpo.java”;XXXZZz.java的文件名为“XXXZZz”,为大小写混合,需要将其中的大写字符转换为小写,转换后的待分析文件的文件名为“xxxzzz.java”。
本申请实施例中,遍历项目源代码,查找设定文件类型的至少一个待分析文件之后,可以将各个待分析文件的文件名均转换为设定格式,统一各个待分析文件的文件名,便于后续自动对各个待分析文件的文件名进行查找分析,提高查找效率。
步骤104:确定第一待分析文件是否为数据对象文件,其中,第一待分析文件为至少一个待分析文件中的任一个。
需要说明的是,由于需要查找的是基本类型的类型变量,只有数据对象的文件中有可能使用到基本类型的类型变量,因而针对java文件列表中的各个待分析文件,可以确定其是否为数据对象文件,后续仅针对数据对象文件进行进一步分析,缩小查找分析的文件范围,节省处理资源,提高查找效率。
本实施例一个可选的实施方式中,可以基于第一待分析文件的文件命名、抽象语法树等,确定第一待分析文件是否为数据对象文件,也即确定第一待分析文件是否为数据对象文件,具体实现过程可以如下:
确定第一待分析文件的文件命名是否以设定标识结尾,其中,设定标识为编程语言中数据对象文件对应的标识;
若不以设定标识结尾,则确定第一待分析文件不是数据对象文件,跳过第一待分析文件;
若以设定标识结尾,则将第一待分析文件解析成抽象语法树,根据抽象语法树确定第一待分析文件是否为数据对象文件。
需要说明的是,初步筛选出的待分析文件为设定类型的文件,是源代码中的编程语言文件,也即实际的代码文件,但是该待分析文件不一定是数据对象文件,由于数据对象文件一般以设定标识结尾,因而可以确定第一待分析文件的文件命名是否以设定标识结尾,若不以设定标识结尾,则确定该第一待分析文件不是数据对象文件,该文件中不会使用基本类型的类型变量,无需再进行后续分析,直接跳过该第一待分析文件,继续分析java文件列表中的下一个待分析文件即可。其中,设定标识为编程语言中数据对象文件对应的标识,如设定标识可以为dto、po或者vo。
另外,若以设定标识结尾,则可以进一步将第一待分析文件解析成抽象语法树,然后根据该抽象语法树确定第一待分析文件是否为数据对象文件。其中,抽象语法树是程序源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构。
需要说明的是,在脚本检测领域,对代码文件直接进行分析匹配,容易导致匹配结果不够精准,所以通常会将代码文件转换成抽象语法树,然后在抽象语法树的基础上进行分析匹配或其他手段的检测操作等。
实际应用中,一个抽象语法树是通过分析一个代码文件的源代码而生成的。一般地,可以扫描第一待分析文件,将第一待分析文件读取为文本,对该文本进行词法解析。具体的,首先可以将第一待分析文件以字符形式按行读取到基本编译单元对象中,然后截止读取文件最后一行,该第一待分析文件代码读取完毕,基本编译单元对象准备完成,通过对基本编译单元对象数据解析,基于编程语言语法规定,对基本编译单元中的符号、语法关键字完成规则校验,最终将基本编译单元中的数据解析成各种节点,至此词法分析结束,基本编译单元输出并导入至一个空的语法树,从而生成第一待分析文件的抽象语法树。
沿用上例,可以遍历循环java文件列表的各个待分析文件,判断待分析文件是否以dto、po、vo结尾,如果不是,则循环分析判断下一个待分析文件;如果判断待分析文件是以dto、po、vo结尾,则将该待分析文件解析成抽象语法树进行进一步分析。也就是说,上述java列表中待分析文件“xxxyyy.java”和“xxxzzz.java”不以dto、po、vo结尾,不是数据对象文件,直接跳过;待分析文件“xxxdto.java”以dto结尾、待分析文件“xxxpo.java”以po结尾、待分析文件“xxxvo.java”以vo结尾,均需要解析成抽象语法树进行进一步分析。
本申请实施例中,可以基于各个待分析文件的文件命名,筛选出以设定标识结尾的文件,针对筛选出的文件再解析成抽象语法树,进行进一步的分析,缩小了查找分析的文件范围,节省了处理资源,提高了查找效率。
本实施例一个可选的实施方式中,可以基于抽象语法树中是否存在注解节点,确定第一待分析文件是否为数据对象文件,也即根据抽象语法树确定第一待分析文件是否为数据对象文件,具体实现过程可以如下:
确定抽象语法树中是否存在注解节点;
若不存在注解节点,则确定第一待分析文件不是数据对象文件,跳过第一待分析文件;
若存在注解节点,则获取注解节点下的待确认注解信息,根据待确认注解信息,确定第一待分析文件是否为数据对象文件。
需要说明的是,java增加了对元数据的支持,也就是注解,注解与注释是有一定区别的,注解所代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理,通过注解,开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。
实际应用中,由于数据对象一般都对应有注解信息,因而可以确定第一待分析文件的抽象语法树中是否存在注解节点,即Annotation节点,若不存在注解节点,则说明第一待分析文件中不存在注解说明,不是数据对象文件,可以直接跳过第一待分析文件,继续分析java文件列表中的下一个待分析文件。若存在注解节点,则还需要进一步判断该注解节点是否为数据对象的注解节点,因而可以获取注解节点下的待确认注解信息,根据待确认注解信息确定第一待分析文件是否为数据对象文件。
具体实现时,由于抽象语法树中各个节点都有节点标识,如名称,不同的名称标识不同的节点,可以遍历抽象语法树中各个节点的节点标识,若查找到为注解标识(也即节点名称为Annotation)的节点,则说明抽象语法树中存在注解节点。若确定出抽象语法树中存在注解节点(即Annotation节点),则可以进一步分析注解节点(也即Annotation节点)下的makerannotaion/name属性,该makerannotaion/name属性即为该注解节点下的注解信息。
本申请实施例中,可以确定第一待分析文件的抽象语法树中是否存在注解节点,对于不存在注解节点的文件直接跳过,不进行后续分析,对于存在注解节点的文件,再进行后续分析,进一步缩小了查找分析的文件范围,节省了处理资源,提高了查找效率。
本实施例一个可选的实施方式中,由于数据对象有对应的注解信息,因而可以将第一待分析文件的抽象语法树中的注解节点下的注解信息,与数据对象对应的注解信息进行匹配,以确定该注解节点是否为数据对象的注解节点,进而确定第一待分析文件是否为数据对象文件,也即根据待确认注解信息,确定第一待分析文件是否为数据对象文件,具体实现过程可以如下:
确定待确认注解信息是否为数据对象对应的注解信息;
若各个注解节点下的待确认注解信息均不是数据对象对应的注解信息,则确定第一待分析文件不是数据对象文件,跳过第一待分析文件;
若任一注解节点下的待确认注解信息是数据对象对应的注解信息,则确定第一待分析文件是数据对象文件。
需要说明的是,第一待分析文件的抽象语法树中存在的注解节点可能为多个,可以确定各个注解节点下的待确认注解信息是否为数据对象对应的注解信息,若各个注解节点下的待确认注解信息均不是数据对象对应的注解信息,则说明抽象语法树中的各个注解节点均不是数据对象的注解节点,此时可以确定第一待分析文件中不包括数据对象,也即第一待分析文件不是数据对象文件,跳过第一待分析文件,继续分析java列表中的下一个待分析文件。
另外,若任一注解节点下的待确认注解信息是数据对象对应的注解信息,则说明抽象语法树中至少存在一个注解节点是数据对象的注解节点,此时可以确定第一待分析文件中包括数据对象,也即第一待分析文件是数据对象文件。
实际应用中,在遍历抽象语法树中存在的各个注解节点时,若确定出某注解节点下的待确认注解信息是数据对象对应的注解信息,则说明抽象语法树中至少存在一个注解节点是数据对象的注解节点,可以无需再遍历其余注解节点,直接将该第一待分析文件确定为数据对象文件。若遍历至最后一个注解节点,也不是数据对象对应的注解信息,则确定第一待分析文件不为数据对象文件。
本申请实施例中,可以通过将第一待分析文件的抽象语法树中的注解节点下的注解信息,与数据对象对应的注解信息进行匹配,确定第一待分析文件的抽象语法树中存在的各个注解节点是否为数据对象的注解,从而分析第一待分析文件中是否包括数据对象,确定第一待分析文件是否为数据对象文件,便于后续仅对数据对象文件进行分析,查找其是否使用了基本类型的类型变量,缩小了查找分析的文件范围,节省了处理资源,提高了查找效率。
本实施例一个可选的实施方式中,数据对象对应的注解信息可以为多个,如数据对象对应的注解信息包括第一注解、第二注解和第三注解,此时确定待确认注解信息是否为数据对象对应的注解信息,具体实现过程可以如下:
确定待确认注解信息是否为第一注解、第二注解和第三注解中的任一个;
若是,则确定待确认注解信息为数据对象对应的注解信息;
若否,则确定待确认注解信息不为数据对象对应的注解信息。
需要说明的是,数据对象对应的注解信息可以为多个,如第一注解、第二注解和第三注解。具体实现时,第一注解、第二注解和第三注解可以分别为@data、@getter、@setter。
实际应用中,针对任一注解节点(也即Annotation节点),可以获取该节点下的makerannotaion/name属性,判断makerannotaion/name的属性值(也即待确认注解信息)是否为@data、@getter、@setter6中的任一个。如果遍历抽象语法树下的各个注解节点(也即Annotation节点)的makerannotaion/name,其属性值都不是@data、@getter、@setter其中的任一个,则确定第一待分析文件不是数据对象文件,跳过第一待分析文件,继续分析java列表中的下一个待分析文件。若任一个注解节点的makerannotaion/name的属性值为@data、@getter、@setter其中的任一个,则确定第一待分析文件是数据对象文件。
本申请实施例中,通过设定标识结尾,抽象语法树中是否存在注解节点,注解节点下的待确认注解信息是否为数据对象对应的注解信息,层层筛选确定待分析文件是否为数据对象文件,筛选准确率高,且滤除了不是数据对象的文件,缩小了查找分析的文件范围,节省了处理资源,提高了查找效率。
步骤106:若第一待分析文件为数据对象文件,则获取第一待分析文件的抽象语法树中的各个类节点。
需要说明的是,数据对象需要进行变量声明,因而对于数据对象文件,可以获取其抽象语法树中的各个类节点,从而便于后续可以对各个类节点的声明内容进行分析,自动识别出其中是否使用基础类型的类型变量,提高识别效率,节省代码评审的时间。
实际应用中,可以提取数据对象文件的抽象语法树下所有ClassOrInterfacesBodyDeclaration节点,即变量/接口声明节点,也即需要提取的类节点。
步骤108:遍历各个类节点,提取各个类节点下基本类型的字段声明,根据提取到的字段声明是否为空,确定项目源代码中是否存在基本类型的类型变量。
需要说明的是,可以遍历数据对象文件的抽象语法树下各个类节点,提取各个类节点下基本类型的字段声明,然后根据提取到的字段声明是否为空,识别确定出项目源代码中是否存在基本类型的类型变量,从而通过自动化扫描的方式,快速查找项目源代码中是否存在基本类型的类型变量,避免了人工查找的漏查、误判等问题,查找准确度高,再者查询过程不再依赖人工,完全通过自动化脚本实现,减少了人工成本。
本实施例一个可选的实施方式中,遍历各个类节点,提取各个类节点下基本类型的字段声明,根据提取到的字段声明是否为空,确定项目源代码中是否存在基本类型的类型变量,具体实现过程可以如下:
将各个类节点添加至待遍历列表中;
从待遍历列表中选择待校验类节点,通过设定路径语言提取待校验类节点下基本类型的字段声明;
若提取到的字段声明为空,则获取待遍历列表中的下一个类节点,作为待校验类节点,返回执行通过设定路径语言提取待校验类节点下基本类型的字段声明的步骤,直至待遍历列表遍历完成,确定项目源代码中不存在基本类型的类型变量;
若提取到的字段声明不为空,则结束遍历,确定项目源代码中存在基本类型的类型变量。
需要说明的是,可以将数据对象文件(如第一待分析文件)的抽象语法树下各个类节点添加至待遍历列表中,然后遍历该待遍历列表中的各个类节点。具体的,可以从待遍历列表中任意选择一个类节点作为待校验类节点,通过设定路径语言提取该待校验类节点下基本类型的字段声明。其中,该设定路径语言可以为xpath,xpath称之为xml路径语言,是一种基于xml的树状结构,来提取特定元素的语言。
实际应用中,针对待校验类节点,通过xpath语法可以提取该待校验类节点下的FieldDeclaration/type/primitive的信息,即基本类型的字段声明。然后,可以确定提取到的信息是否为空,如果为空,则继续遍历待遍历列表中的下一个节点,直至待遍历列表遍历完成,待遍历列表中的各个类节点下基本类型的字段声明均为空,则确定项目源代码中不存在基本类型的类型变量。如果遍历至某一个待校验类节点时,其基本类型的字段声明不为空,则表示该待校验类节点中存在基本类型(primitive)的类型变量,结束遍历,确定该数据对象文件中存在基本类型(primitive)的类型变量,需要提示相关代码开发人员修改代码中的变量类型。
本申请实施例提供的代码评审方法,获取到项目源代码后,可以遍历项目源代码的整个文件夹,筛选出设定文件类型的待分析文件,然后进一步筛选待分析文件是否为数据对象文件,针对数据对象文件,再基于其抽象语法树中的各个类节点,提取各个类节点下基本类型的字段声明,根据提取到的字段声明是否空,确定项目源代码中是否存在基本类型的类型变量。如此,自动化扫描项目源代码,根据项目源代码提取出抽象语法树,快速查找项目源代码中是否存在基本类型的类型变量,查找时间快,且通过自动化扫描的方式,避免了人工查找的漏查、误判等问题,查找准确度高,再者查询过程不再依赖人工,完全通过自动化脚本实现,减少了人工成本。
下述结合附图2,以本申请提供的代码评审方法在java编程语言下的应用为例,对代码评审方法进行进一步说明。其中,图2示出了本申请一实施例提供的一种应用于java编程语言下的代码评审方法的处理流程图,具体包括以下步骤:
从项目源码管理仓库中通过获取命令获取项目源代码。
深度遍历项目源代码的整个文件夹、子文件夹,查找所有后缀为.java的java文件,保存到java文件列表,并依次将java文件列表中各个java文件的文件名统一转换为小写宇符。
遍历循环java文件列表的各个java文件。具体的,从java文件列表中选择一个java文件作为目标文件,判断目标文件是否以dto、po或者vo结尾,如果不是,则返回执行从java文件列表中选择一个java文件作为目标文件的步骤,已经选择过的java文件不再选择,继续循环分析判断java文件列表中的下一个java文件。
如果判断目标文件是以dto、po或者vo结尾,则将该目标文件解析成抽象语法树。检查解析的抽象语法树中是否存在Annotation节点,如果不存在,则说明该目标文件不存在Po注解说明,该文件不是Po文件,返回执行从java文件列表中选择一个java文件作为目标文件的步骤,已经选择过的不再选择,继续循环分析判断java文件列表中的下一个java文件。
如果解析的抽象语法树中存在Annotation节点,则进一步分析Annotation节点下的makerannotaion/name属性值,判断是否存在任一个Annotation节点下makerannotaion/name属性值为@data、@getter、@setter中的任一个。若否,则说明遍历抽象语法树下的所有Annotation节点的makerannotaion/name属性值都不是@data、@getter、@setter中的任一个,则返回执行从java文件列表中选择一个java文件作为目标文件的步骤,已经选择过的不再选择,继续循环分析判断java文件列表中的下一个java文件。
若是,则说明存在Annotation节点的makerannotaion/name属性值是@data、@getterd、@setter其中的一个,则继续该文件的分析。分析提取该目标文件的抽象语法树下的所有ClassOrInterfacesBodyDeclaration,将相关的节点信息添加到待遍历列表。
遍历循环分析待遍历列表中的每一个节点信息。具体的,可以从待遍历列表中选择一个节点作为目标节点,通过xpath语法提取该目标节点下FieldDeclaration/type/primitive的信息,判断提取到的信息为是否为空,如果为空,则返回执行从待遍历列表中选择一个节点作为目标节点的步骤,已经选择过的不再选择。如果提取到的信息不为空,则表示该目标节点中存在primitive(基本类型)的类型变量,进而确定对应的java文件中存在primitive(基本类型)的类型变量,提示相关代码开发言修改修改代码中的变量类型。
本申请实施例提供的代码评审方法,可以自动化扫描项目源代码,根据项目源代码提取出抽象语法树,快速查找项目源代码中是否存在primitive(基本类型)的类型变量,查找时间快,且通过自动化扫描的方式,避免了人工查找的漏查、误判等问题,查找准确度高,再者查询过程不再依赖人工,完全通过自动化脚本实现,减少了人工成本。
与上述方法实施例相对应,本申请还提供了代码评审装置实施例,图3示出了本申请一实施例提供的一种代码评审装置的结构示意图。如图3所示,该装置包括:
查找模块302,被配置为获取项目源代码,并遍历项目源代码,查找设定文件类型的至少一个待分析文件;
第一确定模块304,被配置为确定第一待分析文件是否为数据对象文件,其中,第一待分析文件为至少一个待分析文件中的任一个;
获取模块306,被配置为若第一待分析文件为数据对象文件,则获取第一待分析文件的抽象语法树中的各个类节点;
第二确定模块308,被配置为遍历各个类节点,提取各个类节点下基本类型的字段声明,根据提取到的字段声明是否为空,确定项目源代码中是否存在基本类型的类型变量。
可选地,第一确定模块304,进一步被配置为:
确定第一待分析文件的文件命名是否以设定标识结尾,其中,设定标识为编程语言中数据对象文件对应的标识;
若不以设定标识结尾,则确定第一待分析文件不是数据对象文件,跳过第一待分析文件;
若以设定标识结尾,则将第一待分析文件解析成抽象语法树,根据抽象语法树确定第一待分析文件是否为数据对象文件。
可选地,第一确定模块304,进一步被配置为:
确定抽象语法树中是否存在注解节点;
若不存在注解节点,则确定第一待分析文件不是数据对象文件,跳过第一待分析文件;
若存在注解节点,则获取注解节点下的待确认注解信息,根据待确认注解信息,确定第一待分析文件是否为数据对象文件。
可选地,第一确定模块304,进一步被配置为:
确定待确认注解信息是否为数据对象对应的注解信息;
若各个注解节点下的待确认注解信息均不是数据对象对应的注解信息,则确定第一待分析文件不是数据对象文件,跳过第一待分析文件;
若任一注解节点下的待确认注解信息是数据对象对应的注解信息,则确定第一待分析文件是数据对象文件。
可选地,数据对象对应的注解信息包括第一注解、第二注解和第三注解;第一确定模块304,进一步被配置为:
确定待确认注解信息是否为第一注解、第二注解和第三注解中的任一个;
若是,则确定待确认注解信息为数据对象对应的注解信息;
若否,则确定待确认注解信息不为数据对象对应的注解信息。
可选地,该装置还包括转换模块,被配置为:
确定至少一个待分析文件中与设定格式不同的目标文件;
将目标文件的文件名转换为设定格式。
可选地,第二确定模块308,进一步被配置为:
将各个类节点添加至待遍历列表中;
从待遍历列表中选择待校验类节点,通过设定路径语言提取待校验类节点下基本类型的字段声明;
若提取到的字段声明为空,则获取待遍历列表中的下一个类节点,作为待校验类节点,返回执行通过设定路径语言提取待校验类节点下基本类型的字段声明的步骤,直至待遍历列表遍历完成,确定项目源代码中不存在基本类型的类型变量;
若提取到的字段声明不为空,则结束遍历,确定项目源代码中存在基本类型的类型变量。
本申请实施例提供的代码评审装置,获取到项目源代码后,可以遍历项目源代码的整个文件夹,筛选出设定文件类型的待分析文件,然后进一步筛选待分析文件是否为数据对象文件,针对数据对象文件,再基于其抽象语法树中的各个类节点,提取各个类节点下基本类型的字段声明,根据提取到的字段声明是否空,确定项目源代码中是否存在基本类型的类型变量。如此,自动化扫描项目源代码,根据项目源代码提取出抽象语法树,快速查找项目源代码中是否存在基本类型的类型变量,查找时间快,且通过自动化扫描的方式,避免了人工查找的漏查、误判等问题,查找准确度高,再者查询过程不再依赖人工,完全通过自动化脚本实现,减少了人工成本。
上述为本实施例的一种代码评审装置的示意性方案。需要说明的是,该代码评审装置的技术方案与上述的代码评审方法的技术方案属于同一构思,代码评审装置的技术方案未详细描述的细节内容,均可以参见上述代码评审方法的技术方案的描述。
图4示出了根据本申请一实施例提供的一种计算设备的结构框图。该计算设备400的部件包括但不限于存储器410和处理器420。处理器420与存储器410通过总线430相连接,数据库450用于保存数据。
计算设备400还包括接入设备440,接入设备440使得计算设备400能够经由一个或多个网络460通信。这些网络的示例包括公用交换电话网(PSTN,PublicSwitchedTelephoneNetwork)、局域网(LAN,LocalAreaNetwork)、广域网(WAN,WideAreaNetwork)、个域网(PAN,PersonalAreaNetwork)或诸如因特网的通信网络的组合。接入设备440可以包括有线或无线的任何类型的网络接口(例如,网络接口卡(NIC,NetworkInterfaceController))中的一个或多个,诸如IEEE802.11无线局域网(WLAN,WirelessLocalAreaNetworks)无线接口、全球微波互联接入(Wi-MAX,WorldwideInteroperabilityforMicrowave Access)接口、以太网接口、通用串行总线(USB,UniversalSerialBus)接口、蜂窝网络接口、蓝牙接口、近场通信(NFC,NearFieldCommunication)接口,等等。
在本申请的一个实施例中,计算设备400的上述部件以及图4中未示出的其他部件也可以彼此相连接,例如通过总线。应当理解,图4所示的计算设备结构框图仅仅是出于示例的目的,而不是对本申请范围的限制。本领域技术人员可以根据需要,增添或替换其他部件。
计算设备400可以是任何类型的静止或移动计算设备,包括移动计算机或移动计算设备(例如,平板计算机、个人数字助理、膝上型计算机、笔记本计算机、上网本等)、移动电话(例如,智能手机)、可佩戴的计算设备(例如,智能手表、智能眼镜等)或其他类型的移动设备,或者诸如台式计算机或PC的静止计算设备。计算设备400还可以是移动式或静止式的服务器。
其中,处理器420用于执行如下计算机可执行指令,以实现上述的代码评审方法的步骤。
上述为本实施例的一种计算设备的示意性方案。需要说明的是,该计算设备的技术方案与上述的代码评审方法的技术方案属于同一构思,计算设备的技术方案未详细描述的细节内容,均可以参见上述代码评审方法的技术方案的描述。
本申请一实施例还提供一种计算机可读存储介质,其存储有计算机可执行指令,该计算机可执行指令被处理器执行时以用于实现上述的代码评审方法的步骤。
上述为本实施例的一种计算机可读存储介质的示意性方案。需要说明的是,该存储介质的技术方案与上述的代码评审方法的技术方案属于同一构思,存储介质的技术方案未详细描述的细节内容,均可以参见上述代码评审方法的技术方案的描述。
上述对本申请特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
计算机指令包括计算机程序代码,计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。计算机可读介质可以包括:能够携带计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,RandomAccessMemory)、电载波信号、电信信号以及软件分发介质等。
需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本申请所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
以上公开的本申请优选实施例只是用于帮助阐述本申请。可选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本申请的内容,可作很多的修改和变化。本申请选取并具体描述这些实施例,是为了更好地解释本申请的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本申请。本申请仅受权利要求书及其全部范围和等效物的限制。

Claims (10)

1.一种代码评审方法,其特征在于,所述方法包括:
获取项目源代码,并遍历所述项目源代码,查找设定文件类型的至少一个待分析文件;
确定第一待分析文件是否为数据对象文件,其中,所述第一待分析文件为所述至少一个待分析文件中的任一个;
若所述第一待分析文件为数据对象文件,则获取所述第一待分析文件的抽象语法树中的各个类节点;
遍历所述各个类节点,提取所述各个类节点下基本类型的字段声明,根据提取到的字段声明是否为空,确定所述项目源代码中是否存在基本类型的类型变量。
2.根据权利要求1所述的代码评审方法,其特征在于,所述确定第一待分析文件是否为数据对象文件,包括:
确定所述第一待分析文件的文件命名是否以设定标识结尾,其中,所述设定标识为编程语言中数据对象文件对应的标识;
若不以设定标识结尾,则确定所述第一待分析文件不是数据对象文件,跳过所述第一待分析文件;
若以设定标识结尾,则将所述第一待分析文件解析成抽象语法树,根据所述抽象语法树确定所述第一待分析文件是否为数据对象文件。
3.根据权利要求2所述的代码评审方法,其特征在于,所述根据所述抽象语法树确定所述第一待分析文件是否为数据对象文件,包括:
确定所述抽象语法树中是否存在注解节点;
若不存在注解节点,则确定所述第一待分析文件不是数据对象文件,跳过所述第一待分析文件;
若存在注解节点,则获取所述注解节点下的待确认注解信息,根据所述待确认注解信息,确定所述第一待分析文件是否为数据对象文件。
4.根据权利要求3所述的代码评审方法,其特征在于,所述根据所述待确认注解信息,确定所述第一待分析文件是否为数据对象文件,包括:
确定所述待确认注解信息是否为数据对象对应的注解信息;
若各个注解节点下的待确认注解信息均不是数据对象对应的注解信息,则确定所述第一待分析文件不是数据对象文件,跳过所述第一待分析文件;
若任一注解节点下的待确认注解信息是数据对象对应的注解信息,则确定所述第一待分析文件是数据对象文件。
5.根据权利要求4所述的代码评审方法,其特征在于,所述数据对象对应的注解信息包括第一注解、第二注解和第三注解;所述确定所述待确认注解信息是否为数据对象对应的注解信息,包括:
确定所述待确认注解信息是否为所述第一注解、第二注解和第三注解中的任一个;
若是,则确定所述待确认注解信息为数据对象对应的注解信息;
若否,则确定所述待确认注解信息不为数据对象对应的注解信息。
6.根据权利要求1-5任一项所述的代码评审方法,其特征在于,所述遍历所述项目源代码,查找设定文件类型的至少一个待分析文件之后,还包括:
确定所述至少一个待分析文件中与设定格式不同的目标文件;
将所述目标文件的文件名转换为设定格式。
7.根据权利要求1-5任一项所述的代码评审方法,其特征在于,所述遍历所述各个类节点,提取所述各个类节点下基本类型的字段声明,根据提取到的字段声明是否为空,确定所述项目源代码中是否存在基本类型的类型变量,包括:
将所述各个类节点添加至待遍历列表中;
从所述待遍历列表中选择待校验类节点,通过设定路径语言提取所述待校验类节点下基本类型的字段声明;
若提取到的字段声明为空,则获取所述待遍历列表中的下一个类节点,作为所述待校验类节点,返回执行所述通过设定路径语言提取所述待校验类节点下基本类型的字段声明的步骤,直至所述待遍历列表遍历完成,确定所述项目源代码中不存在基本类型的类型变量;
若提取到的字段声明不为空,则结束遍历,确定所述项目源代码中存在基本类型的类型变量。
8.一种代码评审装置,其特征在于,所述装置包括:
查找模块,被配置为获取项目源代码,并遍历所述项目源代码,查找设定文件类型的至少一个待分析文件;
第一确定模块,被配置为确定第一待分析文件是否为数据对象文件,其中,所述第一待分析文件为所述至少一个待分析文件中的任一个;
获取模块,被配置为若所述第一待分析文件为数据对象文件,则获取所述第一待分析文件的抽象语法树中的各个类节点;
第二确定模块,被配置为遍历所述各个类节点,提取所述各个类节点下基本类型的字段声明,根据提取到的字段声明是否为空,确定所述项目源代码中是否存在基本类型的类型变量。
9.一种计算设备,其特征在于,包括:
存储器和处理器;
所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令,以实现上述权利要求1-7任一项所述的代码评审方法的步骤。
10.一种计算机可读存储介质,其特征在于,其存储有计算机可执行指令,该计算机可执行指令被处理器执行时实现上述权利要求1-7任一项所述的代码评审方法的步骤。
CN202310746647.8A 2023-06-21 2023-06-21 代码评审方法及装置 Pending CN116775483A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310746647.8A CN116775483A (zh) 2023-06-21 2023-06-21 代码评审方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310746647.8A CN116775483A (zh) 2023-06-21 2023-06-21 代码评审方法及装置

Publications (1)

Publication Number Publication Date
CN116775483A true CN116775483A (zh) 2023-09-19

Family

ID=88012948

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310746647.8A Pending CN116775483A (zh) 2023-06-21 2023-06-21 代码评审方法及装置

Country Status (1)

Country Link
CN (1) CN116775483A (zh)

Similar Documents

Publication Publication Date Title
US8307010B2 (en) Data feature tracking through hierarchical node sets
US9122540B2 (en) Transformation of computer programs and eliminating errors
CN112394942B (zh) 基于云计算的分布式软件开发编译方法及软件开发平台
US8364696B2 (en) Efficient incremental parsing of context sensitive programming languages
CN114579969B (zh) 漏洞检测方法、装置、电子设备及存储介质
US11327722B1 (en) Programming language corpus generation
CN106776266B (zh) 测试工具的配置方法及终端设备
CN112799718A (zh) 一种枚举文档的生成方法、装置、电子设备及存储介质
US11422917B2 (en) Deriving software application dependency trees for white-box testing
CN111488155A (zh) 着色语言翻译方法
CN107729015B (zh) 一种确定工程代码中的无用函数的方法和装置
CN113821496B (zh) 数据库迁移方法、系统、设备及计算机可读存储介质
CN116775483A (zh) 代码评审方法及装置
CN115951916A (zh) 一种组件的处理方法、装置、电子设备及存储介质
US20230315442A1 (en) Enriching code for code explainability
CN116048481A (zh) 业务信息处理系统及方法
US11861389B2 (en) Compiling a specified instruction from a first virtual application to a second virtual application
CN112799697B (zh) 一种基于标准框架的配置文件版本迁移方法
CN115129598A (zh) 一种sql语句的风险检测方法、装置、系统及介质
CN112115125B (zh) 数据库访问对象名称解析方法、装置及电子设备
CN113342749A (zh) 文件路径匹配方法、装置、设备及计算机可读存储介质
Tukaram Design and development of software tool for code clone search, detection, and analysis
CN112130860A (zh) Json对象解析方法、装置、电子设备及存储介质
CN113408250B (zh) 一种项目文件的处理方法和装置
CN114780109B (zh) Python项目第三方库依赖自动化解析与安装方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination