代码检查方法、装置和电子设备与流程

专利2023-09-11  106



1.本发明涉及代码检查领域,尤其是涉及一种代码检查方法、装置和电子设备。


背景技术:

2.代码检查是程序开发中一个重要的环节,在代码的编写过程中实时地对代码进行编写规范检查是提高程序开发效率、提高代码规范性的重点。
3.现有的代码检查技术通常是针对特定开发语言的语言风格或语法结构编写的特定代码检查脚本,可移植性差且迭代困难,检查脚本中的检查规则难以维护和扩展,可见,现有的代码检查技术存在耦合性过高的技术问题。


技术实现要素:

4.有鉴于此,本发明的目的在于提供一种代码检查方法、装置和电子设备,以降低代码检查规则与代码检查脚本的耦合性。
5.第一方面,本发明实施例提供了一种代码检查方法,方法包括:
6.响应针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树;
7.确定至少一个代码核查点,并通过所述原始语法树进行所述代码核查点的核心数据封装,得到所述代码核查点对应的目标核心数据;其中,每个所述代码核查点对应至少一个代码检查规则;
8.基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果。
9.上述确定至少一个代码核查点,并通过所述原始语法树进行所述代码核查点的核心数据封装,得到所述代码核查点对应的目标核心数据,包括:
10.获取所述待检查代码对应的依赖信息;
11.对所述原始语法树进行节点遍历,并在节点遍历的过程中,确定至少一个代码核查点;
12.在每个所述代码核查点处,从所述待检查代码对应的依赖信息中提取所述代码核查点对应的依赖信息,并基于所述代码核查点对应的依赖信息对所述代码核查点的核心数据进行封装,得到所述代码核查点对应的目标核心数据。
13.上述在获取所述待检查代码对应的依赖信息之前,包括:
14.读取所述待检测代码对应的依赖文件;
15.解析所述依赖文件中的依赖信息,并按照预置的缓存策略对所述依赖信息进行缓存;
16.所述获取所述待检查代码对应的依赖信息包括:
17.从缓存读取所述待检查代码对应的依赖信息。
18.上述在每个所述代码核查点处,从所述待检查代码对应的依赖信息中提取所述代码核查点对应的依赖信息,并基于所述代码核查点对应的依赖信息对所述代码核查点的核
心数据进行封装,得到所述代码核查点对应的目标核心数据,包括:
19.在每个所述代码核查点处,从所述待检查代码对应的依赖信息中提取所述代码核查点对应的依赖信息,并导入所述代码核查点对应的依赖信息,得到每个所述代码核查点对应的核查点信息;
20.对所述代码核查点对应的核查点信息进行核心数据封装,得到所述代码核查点对应的目标核心数据。
21.上述基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果,包括:
22.获取所述待检查代码对应的代码文件对象;
23.在每个所述代码核查点处,将所述代码文件对象和所述代码核查点对应的目标核心数据传递至所述代码核查点的每个所述代码检查规则对应的代码中,所述代码检查规则预先挂接在所述代码核查点,所述代码检查规则对应的代码包括预先封装的基类信息;
24.通过所述代码检查规则对每个所述代码核查点进行代码检查,得到代码检查结果。
25.上述通过所述代码检查规则对每个所述代码核查点进行代码检查,得到代码检查结果,包括:
26.分别判断每个所述代码核查点对应的目标核心数据中是否包含目标检查数据,所述目标检查数据用于指示所述代码检查规则所需的数据;
27.若所述代码核查点对应的目标核心数据中包含所述目标检查数据,则从所述代码核查点对应的目标核心数据中提取所述代码核查点对应的目标检查数据;
28.若所述代码核查点对应的目标核心数据中不包含所述目标检查数据,则通过所述代码核查点对应的目标核心数据确定目标索引,并通过所述目标索引从所述原始语法树中提取所述代码核查点对应的目标检查数据;
29.通过每个代码核查点对应的代码检查规则对所述目标检查数据进行代码检查,得到代码检查结果。
30.上述响应针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树,包括:
31.响应代码编辑器针对待检查代码的检查指令,并通过预置的语法解析器对所述待检查代码进行语法树解析,得到所述待检查代码对应的原始语法树,所述语法解析器运行在所述代码编辑器;
32.上述在基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果之后,还包括:
33.在所述代码编辑器中显示所述代码检查结果。
34.上述在所述代码编辑器中显示所述代码检查结果,包括:
35.在所述代码编辑器中显示所述代码检查结果,所述代码检查结果包括代码检查规则指示的错误提示信息。
36.上述在基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果之后,包括:
37.将所述待检查代码对应的全局数据存储至共享缓存区;
38.按照预置的缓存策略对缓存中的非全局过期数据进行清理。
39.上述响应针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树,包括:
40.创建服务进程,并通过所述服务进程响应多个终端同时针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树。
41.第二方面,本发明实施例提供了一种动态链接库文件的加载装置,应用于电子设备,电子设备上运行有目标应用程序,装置包括:响应模块,用于响应针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树;封装模块,用于确定至少一个代码核查点,并通过所述原始语法树进行所述代码核查点的核心数据封装,得到所述代码核查点对应的目标核心数据;其中,每个所述代码核查点对应至少一个代码检查规则;检查模块,用于基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果。
42.第三方面,本发明实施例提供了一种电子设备,包括处理器和存储器,存储器存储有能够被处理器执行的机器可执行指令,处理器执行机器可执行指令以实现上述代码检查方法。
43.第四方面,本发明实施例提供了一种机器可读存储介质,机器可读存储介质存储有机器可执行指令,机器可执行指令在被处理器调用和执行时,机器可执行指令促使处理器实现上述代码检查方法。
44.本发明实施例带来了以下有益效果:
45.上述代码检查方法、装置和电子设备,响应针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树;确定至少一个代码核查点,并通过所述原始语法树进行所述代码核查点的核心数据封装,得到所述代码核查点对应的目标核心数据;其中,每个所述代码核查点对应至少一个代码检查规则;基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果。该方式中,响应针对待检查代码的检查指令之后,获取待检查代码对应的原始语法树,由于原始语法树为抽象语法树,因此,在确定待检查代码的至少一个代码核查点之后,通过抽象语法树封装面向应用的核心数据,得到代码核查点的目标核心数据,再通过与代码核查点解耦的至少一个代码检查规则进行代码检查,得到代码检查结果。从而降低代码检查规则与代码检查脚本的耦合性。
46.本发明的其他特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。
47.为使本发明的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
48.为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
49.图1为本发明实施例中代码检查方法的其中之一实施例流程图;
50.图2为本发明实施例中代码检查方法的其中之一实施例流程图;
51.图3为本发明实施例中代码检查方法的其中之一实施例流程图;
52.图4为本发明实施例提供的一种代码检查装置的示意图;
53.图5为本发明实施例提供的一种电子设备的示意图。
具体实施方式
54.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
55.为便于理解,下面对本发明实施例的具体流程进行描述,请参阅图1,本发明实施例中代码检查方法的其中之一实施例包括:
56.步骤s10、响应针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树;
57.需要说明的是,本发明实施例提供的一种代码检查方法、装置和电子设备,可以运行于终端设备或者是服务器。其中,终端设备可以为本地终端设备。当代码检查方法运行于服务器时,该方法也可以基于云交互系统来实现与执行,其中,云交互系统包括服务器和客户端设备。在一种可行的实施方式中,本发明实施例提供的代码检查方法应用于电子设备,电子设备上运行有目标应用程序。
58.可以理解的是,待检查代码为待检查代码文件中的代码,其中,待检查代码可以是待检查代码文件中的全部代码,也可以是待检查代码文件中的部分代码,在一种实施方式中,响应针对待检查代码的检查指令包括:响应检查指令,将当前代码检查周期的待检查代码文件与上一代码检查周期的待检查代码文件进行比对,得到差异代码,并通过差异代码确定待检查代码,其中,上一代码检查周期的待检查代码文件存储于缓存中,步骤s10-步骤s30的执行过程指示一个代码检查周期。本实施方式能够通过部分差异代码避免重复对整个待检查代码文件的代码进行检查,并实现代码的局部检查,从而提高代码检查的效率和性能。
59.基于上述,通过差异代码确定待检查代码之后,从缓存获取待检查代码文件对应的目标语法树,并通过差异代码对目标语法树进行更新,得到待检查代码对应的原始语法树,其中,待检查代码对应的原始语法树可以为待检查代码文件的完整语法树,也可以为待检查代码的局部语法树。本实施方式能够通过对语法树进行缓存和局部更新,避免重复生成整个代码文件的语法树,从而实现代码的局部检查,提高代码检查的效率和性能。
60.为了提高代码检查的实时性,本发明提供的代码检查方法运行于代码编辑器,通过嵌入到代码编辑器的代码检查脚本运行本发明提供的代码检查方法,在一种实施方式中,代码编辑器为跨平台的代码编辑器,能够编辑任一开发语言的代码,而运行本发明提供的代码检查方法的跨平台代码编辑器的代码检查脚本,能够对任一开发语言的代码进行检查,使得代码检查脚本与具体的开发语言解耦。
61.在一种实施方式中,当终端或代码编辑器触发待检查代码文件的文件保存(包括
自动保存)指令时,或当终端或代码编辑器触发待检查代码文件的文件打开指令时,同时触发针对待检查代码的检查指令,以使得终端响应针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树。本实施方式能够在适当的时机触发代码检查程序,避免时间轮询的代码检查造成代码检查性能下降。
62.需要说明的是,原始语法树为抽象语法树(abstract syntax tree,ast),是代码的抽象语法结构的树状表示,树上的每个节点都表示代码的一种结构。在一种实施方式中,响应针对待检查代码的检查指令,通过预置的语法解析器生成待检查代码对应的原始语法树,其中,语法解析器包括词法分析器和语法分析器,具体的,通过预置的词法分析器对待检查代码进行文本符合转化,得到待检查代码对应的文本符号信息,再通过预置的语法分析器对文本符号信息进行语法结构解析,得到待检查代码对应的原始语法树。
63.进一步的,步骤s10包括:创建服务进程,并通过所述服务进程响应多个终端同时针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树。为了满足多个终端同时对待检查代码进行代码检查,通过创建同的同一个服务进程响应多个终端同时针对待检查代码的检查指令,以获得待检查代码对应的原始语法树,服务进程能够避免并发问题,满足团队协作项目的多终端同时请求的需求,使得代码检查程序的可协作性提高。
64.步骤s20、确定至少一个代码核查点,并通过所述原始语法树进行所述代码核查点的核心数据封装,得到所述代码核查点对应的目标核心数据;其中,每个所述代码核查点对应至少一个代码检查规则;
65.在一种实施方式中,为了将特定开发语言风格的代码检查规则与实际用于代码检查的代码检查脚本解耦,便于开发者自定义代码检查规则,在对原始语法树的节点遍历过程中,埋入至少一个代码核查点,例如,代码核查点可以在待检查代码的变量定义处、函数调用处、函数完成处、函数回调处等特定代码位置,以通过代码核查点,向解耦的代码检查规则传递核心数据,以及注册代码检查规则进行代码核查点的代码检查。具体的,代码核查点可以是待检查代码中特定代码位置的参数传递函数,用于将待检查代码中特定代码位置的目标核心数据传递至代码检查规则,如apply()函数、call()函数等具有参数传递功能的函数,以及其它自定义的参数传递函数。
66.需要说明的是,为了降低特定开发语言风格的代码检查规则与实际用于代码检查的代码检查脚本之间的耦合度,通过规则文件引入的方式使得代码检查规则可以独立于代码检查脚本,其中,规则文件包括代码检查规则对应的代码,代码检查规则用于指示代码检查规则代码,即规则文件中的代码。具体的,在每个代码核查点处,定义代码核查点的代码检查函数,并在规则文件中注册代码检查函数,通过在代码检查脚本中引入规则文件,以在代码核查点处执行代码检查函数,从而完成代码检查规则的代码检查,因此,每个代码核查点可以注册一个或一个以上的代码检查规则,具体此处不做限定。
67.可以理解的是,由于原始语法树为抽象语法树,偏向于编译风格,难以应用于实际的业务需求开发,因此,基于原始语法树指示的代码结构,对待检查代码的代码核查点进行核心数据封装,得到代码核查点对应的目标核心数据,其中,目标核心数据包括但不限于代码核查点的名称、数值、属性等核查点信息。在一种实施方式中,目标核心数据用于指示与代码核查点的节点类型对应的预设节点信息,具体的,根据代码核查点的节点类型提取代码核查点处对应节点类型的核心数据,得到代码核查点对应的目标核心数据,其中,节点类
型包括但不限于变量、宏、函数、代码块、对象等代码结构类型。例如,一个代码核查点为变量节点类型,那么,则按照变量节点类型提取该代码核查点处的核心数据,该核心数据可以为该变量节点类型的代码核查点的变量名称、数值和变量属性等变量节点信息。由于封装后的目标核心数据是偏向于业务应用的数据,使得代码检查规则能够直接应用这些数据进行规则编写和规则校验,使代码检查规则的编写更便捷和灵活。
68.步骤s30、基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果。
69.在一种实施方式中,为了尽可能详细且全面地向代码检查规则传递代码检查所需的数据,在得到每个代码核查点对应的目标核心数据之后,获取待检查代码文件对象,并将目标核心数据和待检查代码文件对象传递至代码检查规则,通过代码核查点执行代码检查规则,得到代码检查结果,其中,待检查代码文件对象用于指示以对象形式封装的待检查代码文件的文件级信息,如待检查代码文件的路径信息、文件名称、文件修改时刻等文件信息。在另一种实施方式中,在得到每个代码核查点对应的目标核心数据之后,还获取待检查代码文件对应的全局变量信息,并将目标核心数据、待检查代码文件对象和全局变量信息传递至代码检查规则,以通过代码核查点执行代码检查规则,得到代码检查结果,其中,全局变量信息存储于缓存中,全局变量信息用于指示待检查代码文件所在项目文件的全局类型变量信息。
70.在一种实施方式中,步骤s10包括:响应代码编辑器针对待检查代码的检查指令,并通过预置的语法解析器对所述待检查代码进行语法树解析,得到所述待检查代码对应的原始语法树,所述语法解析器运行在所述代码编辑器;步骤s30之后还包括:在所述代码编辑器中显示所述代码检查结果。本实施方式中,为了在代码的编辑过程中及时地对待检查代码进行无需运行的检查,针对待检查代码在代码编辑器中触发检查指令之后,通过嵌入代码编辑器的代码检查脚本响应代码编辑器针对待检查代码的检查指令,并调用预置的语法解析器对待检查代码进行语法树解析,得到待检查代码对应的原始语法树,其中,语法解析器也运行于代码编辑器中。当代码检查脚本完成对待检查代码的代码检查程序之后,在代码编辑器中显示代码检查结果,以使得在代码编辑过程中,能够及时地查看代码检查结果。进一步的,在所述代码编辑器中显示所述代码检查结果,包括:在所述代码编辑器中显示所述代码检查结果,所述代码检查结果包括代码检查规则指示的错误提示信息。错误提示信息包括但不限于代码错误文件、代码错误行号、代码错误类型、代码错误描述、代码错误等级等信息。其中,错误提示信息在代码检查规则中预先定义,即当待检查代码满足代码检查规则时,则输出代码检查规则中预先定义的错误提示信息。例如,其中一条代码检查规则中的代码错误描述为“调用未定义的函数”,那么,当待检查代码中存在“调用未定义的函数”这个代码错误时,即待检查代码满足该代码检查规则,则输出包含“调用未定义函数”这一代码错误描述的代码错误提示信息。
71.进一步的,在步骤s30之后,还包括:将所述待检查代码对应的全局数据存储至共享缓存区;按照预置的缓存策略对缓存中的非全局过期数据进行清理。本实施方式中,为了满足多个终端同时对待检查代码进行代码检查,将待检查代码对应的全局数据存储或更新至共享缓存区,以将当前版本的待检查代码的全局数据共享给其它终端,以使得团队协作的项目能够及时同步最新代码,避免由于同步不及时导致的代码检查错误,从而提高代码
检查程序的可协作性。
72.上述实施方式提供的代码检查方法,响应针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树;确定至少一个代码核查点,并通过所述原始语法树进行所述代码核查点的核心数据封装,得到所述代码核查点对应的目标核心数据;其中,每个所述代码核查点对应至少一个代码检查规则;基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果。该方式中,响应针对待检查代码的检查指令之后,获取待检查代码对应的原始语法树,由于原始语法树为抽象语法树,因此,在确定待检查代码的至少一个代码核查点之后,通过抽象语法树封装面向应用的核心数据,得到代码核查点的目标核心数据,再通过与代码核查点解耦的至少一个代码检查规则进行代码检查,得到代码检查结果。从而降低代码检查规则与代码检查脚本的耦合性。
73.请参阅图2,本发明实施例中代码检查方法的其中之一实施例包括:
74.步骤s201、获取所述待检查代码对应的依赖信息;
75.需要说明的是,由于待检查代码文件可以包括依赖文件,因此,在获取代码核查点对应的目标核心数据过程中,需要结合代码核查点的依赖信息,以使得封装的目标核心数据更加完善和详细。具体的,通过待检查代码文件中的头文件声明读取待检查代码文件对应的依赖文件,并获取依赖文件对应的依赖信息,其中,依赖文件对应的依赖信息用于指示依赖文件中的所有变量、宏、函数、代码块、对象等结构代码信息,依赖文件对应的依赖信息包括待检查代码对应的依赖信息,待检查代码对应的依赖信息包括待检查代码所依赖的变量、宏、函数、代码块、对象等结构代码信息。
76.在一种实施方式中,在步骤s201之前,还包括读取所述待检测代码对应的依赖文件;解析所述依赖文件中的依赖信息,并按照预置的缓存策略对所述依赖信息进行缓存;步骤s201包括:从缓存读取所述待检查代码对应的依赖信息。本实施方式中,为了避免在每次代码检查的过程中重新生成待检查代码对应的依赖信息,在获取所述待检查代码对应的依赖信息之前,检测缓存中是否存在待检查代码对应的依赖信息,若缓存中存在待检查代码对应的依赖信息,则直接从缓存中读取待检查代码对应的依赖信息,若缓存中不存在待检查代码对应的依赖信息,则读取待检查代码文件对应的依赖文件,并对依赖文件进行代码结构体封装,得到依赖文件对应的依赖信息,其中,依赖文件对应的依赖信息包括待检查代码对应的依赖信息,再按照预置的缓存策略对应依赖文件对应的依赖信息进行缓存,以使得在获取所述待检查代码对应的依赖信息时,直接从缓存中依赖文件对应的依赖信息中读取待检查代码对应的依赖信息。需要说明的是,当待检查代码为待检查代码文件中的全部代码时,待检查代码对应的依赖信息与待检查代码文件对应的依赖信息等价,当待检查代码为待检查代码文件中的部分代码,待检查代码对应的依赖信息也是待检查代码文件对应的依赖信息中的部分信息。本实施方式能够通过缓存机制和局部数据获取机制提高代码检查的性能和效率。
77.步骤s202、对所述原始语法树进行节点遍历,并在节点遍历的过程中,确定至少一个代码核查点;
78.在一种实施方式中,得到原始语法树之后,通过预置的语法解析器中的节点遍历脚本对原始语法树进行节点遍历,并在节点遍历的过程中,确定至少一个代码核查点。例如,anltr4语法解析器中的visitor节点遍历对象脚本,用于对原始语法数据进行节点遍
历。可以理解的是,通过语法解析器中的原生节点遍历脚本能够提高代码检查整体的性能和效率。
79.在一种实施方式中,为了确定每个代码核查点的节点类型,在节点遍历的过程中,确定至少一个代码核查点还包括:在节点遍历的过程中,确定至少一个代码核查点,并对每个代码核查点进行节点类型识别,得到每个代码核查点对应的节点类型,用于后续代码核查点核心数据的确定。
80.步骤s203、在每个所述代码核查点处,从所述待检查代码对应的依赖信息中提取所述代码核查点对应的依赖信息,并基于所述代码核查点对应的依赖信息对所述代码核查点的核心数据进行封装,得到所述代码核查点对应的目标核心数据。
81.需要说明的是,为了得到代码核查点处更完善和详细的核心数据,在每个代码核查点处,提取待检查代码对应的依赖信息中代码核查点对应的依赖信息,再对代码核查点处的节点信息和依赖信息进行核心数据封装,得到代码核查点对应的目标核心数据。例如,假设待检查代码对应的依赖信息包括待检查代码文件中的所有变量、宏、函数、代码块、对象等结构代码信息,而一个代码核查点仅依赖于其中的一个箭头函数,那么,则提取该箭头函数作为该代码核查点对应的依赖信息,在封装该代码核查点的核心数据时,对该箭头函数和该代码核查点的节点信息进行核心数据封装,从而得到该代码核查点对应的目标核心数据。
82.在一种实施方式中,步骤s203包括:在每个所述代码核查点处,从所述待检查代码对应的依赖信息中提取所述代码核查点对应的依赖信息,并导入所述代码核查点对应的依赖信息,得到每个所述代码核查点对应的核查点信息;对所述代码核查点对应的核查点信息进行核心数据封装,得到所述代码核查点对应的目标核心数据。本实施方式中,在每个所述代码核查点处,从所述待检查代码对应的依赖信息中提取所述代码核查点对应的依赖信息之后,将代码核查点对应的依赖信息补齐导入至对应的代码核查点,得到代码核查点对应的核查点信息,其中,核查点信息包括代码核查点的节点信息和依赖信息,再对代码核查点对应的核查点信息进行核心数据封装,得到代码核查点对应的目标核心数据。本实施方式能够获取更全面和详细的核心数据,从而提高代码检查规则的可扩展性。
83.请参阅图3,本发明实施例中代码检查方法的其中之一实施例包括:
84.步骤s301、获取所述待检查代码对应的代码文件对象;
85.需要说明的是,为了获取更完善和详细的核心数据,用以提高代码检查规则编写的可扩展性和灵活性,并支持一些更深层的代码校验规则,获取待检查代码对应的代码文件对象,其中,代码文件对象用于指示以对象形式封装的待检查代码文件的文件级信息,如待检查代码文件的路径信息、文件名称、文件修改时刻等文件信息。
86.步骤s302、在每个所述代码核查点处,将所述代码文件对象和所述代码核查点对应的目标核心数据传递至所述代码核查点的每个所述代码检查规则对应的代码中,所述代码检查规则预先挂接在所述代码核查点,所述代码检查规则对应的代码包括预先封装的基类信息;
87.在一种实施方式中,代码检查规则以预设函数名称的形式预先挂接在代码核查点处,具体的是,在代码核查点的参数传递函数中写入代码检查规则对应的预设函数名称,以通过代码核查点的参数传递函数调用代码核查规则对应的预设函数,其中,预设函数用于
执行代码检查规则的业务逻辑。另外,目标核心数据也以封装好的对象的形式写入代码核查点的参数传递函数中,以通过参数传递函数将目标核心数据传递至代码检查规则对应的预设函数中,并通过执行代码检查规则对应的预设函数进行代码检查。
88.在一种实施方式中,为了提高代码检查规则编写的便捷程度,代码检查规则对应的代码包括预先封装好的基类信息,即所有代码检查规则均继承于同一个基类,该基类用于代码检查规则的注册、执行和代码检查结果封装,以使得开发者仅需关注自身的代码检查业务逻辑,极大程度地提高代码检查规则开发的效率。
89.步骤s303、通过所述代码检查规则对每个所述代码核查点进行代码检查,得到代码检查结果。
90.在一种实施方式中,在对原始语法树进行节点遍历的过程中,在每个代码核查点处,通过代码核查点的参数传递函数将目标核心数据传递至代码检查规则对应的预设函数中之后,通过代码核查点的参数传递函数调用代码核查规则对应的预设函数,从而在对原始语法树进行节点遍历过程中,通过预设函数执行代码检查规则的业务逻辑。
91.具体的,步骤s303包括:分别判断每个所述代码核查点对应的目标核心数据中是否包含目标检查数据,所述目标检查数据用于指示所述代码检查规则所需的数据;若所述代码核查点对应的目标核心数据中包含所述目标检查数据,则从所述代码核查点对应的目标核心数据中提取所述代码核查点对应的目标检查数据;若所述代码核查点对应的目标核心数据中不包含所述目标检查数据,则通过所述代码核查点对应的目标核心数据确定目标索引,并通过所述目标索引从所述原始语法树中提取所述代码核查点对应的目标检查数据;通过每个代码核查点对应的代码检查规则对所述目标检查数据进行代码检查,得到代码检查结果。本实施方式中,为了完成更深层次、更全面的代码检查,使代码检查规则能够支持不同开发语言的特殊校验需求,当目标核心数据中不包含代码检查规则所需的目标检查数据时,通过目标检查数据确定代码核查点的目标索引,再通过目标索引从原始语法树中提取代码核查点的代码检查规则所需的目标检查数据,以通过目标检查数据进行代码核查点的代码检查规则执行,得到代码检查结果。而当目标核心数据中包含代码检查规则所需的目标检查数据时,则直接从目标核心数据中提取目标检查数据,用于后续通过目标检查数据进行代码核查点的代码检查规则执行,得到代码检查结果。本实施方式能够通过语法树索引的方式为代码检查规则兜底,使得代码检查规则能够操作所有的节点信息。
92.对应于上述方法实施例,参见图4所示的一种代码检查装置的示意图,应用于电子设备,电子设备上运行有目标应用程序,该装置包括:
93.响应模块40,用于响应针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树;
94.封装模块42,用于确定至少一个代码核查点,并通过所述原始语法树进行所述代码核查点的核心数据封装,得到所述代码核查点对应的目标核心数据;其中,每个所述代码核查点对应至少一个代码检查规则;
95.检查模块44,用于基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果。
96.上述代码检查装置,响应针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树;确定至少一个代码核查点,并通过所述原始语法树进行所述代码核查点的
核心数据封装,得到所述代码核查点对应的目标核心数据;其中,每个所述代码核查点对应至少一个代码检查规则;基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果。该方式中,响应针对待检查代码的检查指令之后,获取待检查代码对应的原始语法树,由于原始语法树为抽象语法树,因此,在确定待检查代码的至少一个代码核查点之后,通过抽象语法树封装面向应用的核心数据,得到代码核查点的目标核心数据,再通过与代码核查点解耦的至少一个代码检查规则进行代码检查,得到代码检查结果。从而降低代码检查规则与代码检查脚本的耦合性。
97.上述封装模块,还用于:获取所述待检查代码对应的依赖信息;对所述原始语法树进行节点遍历,并在节点遍历的过程中,确定至少一个代码核查点;在每个所述代码核查点处,从所述待检查代码对应的依赖信息中提取所述代码核查点对应的依赖信息,并基于所述代码核查点对应的依赖信息对所述代码核查点的核心数据进行封装,得到所述代码核查点对应的目标核心数据。
98.上述封装模块,还用于:读取所述待检测代码对应的依赖文件;解析所述依赖文件中的依赖信息,并按照预置的缓存策略对所述依赖信息进行缓存;所述获取所述待检查代码对应的依赖信息包括:从缓存读取所述待检查代码对应的依赖信息。
99.上述封装模块,还用于:在每个所述代码核查点处,从所述待检查代码对应的依赖信息中提取所述代码核查点对应的依赖信息,并导入所述代码核查点对应的依赖信息,得到每个所述代码核查点对应的核查点信息;对所述代码核查点对应的核查点信息进行核心数据封装,得到所述代码核查点对应的目标核心数据。
100.上述检查模块,还用于:获取所述待检查代码对应的代码文件对象;在每个所述代码核查点处,将所述代码文件对象和所述代码核查点对应的目标核心数据传递至所述代码核查点的每个所述代码检查规则对应的代码中,所述代码检查规则预先挂接在所述代码核查点,所述代码检查规则对应的代码包括预先封装的基类信息;通过所述代码检查规则对每个所述代码核查点进行代码检查,得到代码检查结果。
101.上述检查模块,还用于:分别判断每个所述代码核查点对应的目标核心数据中是否包含目标检查数据,所述目标检查数据用于指示所述代码检查规则所需的数据;若所述代码核查点对应的目标核心数据中包含所述目标检查数据,则从所述代码核查点对应的目标核心数据中提取所述代码核查点对应的目标检查数据;若所述代码核查点对应的目标核心数据中不包含所述目标检查数据,则通过所述代码核查点对应的目标核心数据确定目标索引,并通过所述目标索引从所述原始语法树中提取所述代码核查点对应的目标检查数据;通过每个代码核查点对应的代码检查规则对所述目标检查数据进行代码检查,得到代码检查结果。
102.上述响应模块,还用于:响应代码编辑器针对待检查代码的检查指令,并通过预置的语法解析器对所述待检查代码进行语法树解析,得到所述待检查代码对应的原始语法树,所述语法解析器运行在所述代码编辑器;在基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果之后,还包括:在所述代码编辑器中显示所述代码检查结果。
103.上述响应模块,还用于:在所述代码编辑器中显示所述代码检查结果,所述代码检查结果包括代码检查规则指示的错误提示信息。
104.上述代码检查装置,还用于:将所述待检查代码对应的全局数据存储至共享缓存区;按照预置的缓存策略对缓存中的非全局过期数据进行清理。
105.上述响应模块,还用于:创建服务进程,并通过所述服务进程响应多个终端同时针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树。
106.本实施例还提供一种电子设备,包括处理器和存储器,存储器存储有能够被处理器执行的机器可执行指令,处理器执行机器可执行指令以实现上述代码检查方法。该电子设备可以是服务器,也可以是终端设备。
107.参见图5所示,该电子设备包括处理器100和存储器101,该存储器101存储有能够被处理器100执行的机器可执行指令,该处理器100执行机器可执行指令以实现上述代码检查方法。
108.进一步地,图5所示的电子设备还包括总线102和通信接口103,处理器100、通信接口103和存储器101通过总线102连接。
109.其中,存储器101可能包含高速随机存取存储器(ram,random access memory),也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。通过至少一个通信接口103(可以是有线或者无线)实现该系统网元与至少一个其他网元之间的通信连接,可以使用互联网,广域网,本地网,城域网等。总线102可以是isa总线、pci总线或eisa总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图5中仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。
110.处理器100可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器100中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器100可以是通用处理器,包括中央处理器(central processing unit,简称cpu)、网络处理器(network processor,简称np)等;还可以是数字信号处理器(digital signal processor,简称dsp)、专用集成电路(application specific integrated circuit,简称asic)、现场可编程门阵列(field-programmable gate array,简称fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器101,处理器100读取存储器101中的信息,结合其硬件完成前述实施例的方法的步骤。
111.本实施例还提供一种机器可读存储介质,机器可读存储介质存储有机器可执行指令,机器可执行指令在被处理器调用和执行时,机器可执行指令促使处理器实现上述代码检查方法。
112.本发明实施例所提供的代码检查方法、装置、电子设备及存储介质的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令可用于执行前面方法实施例中所述的方法,具体实现可参见方法实施例,在此不再赘述。
113.所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
114.另外,在本发明实施例的描述中,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。
115.所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
116.在本发明的描述中,需要说明的是,术语“中心”、“上”、“下”、“左”、“右”、“竖直”、“水平”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”、“第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。
117.最后应说明的是:以上实施例,仅为本发明的具体实施方式,用以说明本发明的技术方案,而非对其限制,本发明的保护范围并不局限于此,尽管参照前述实施例对本发明进行了详细的说明,本领域技术人员应当理解:任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

技术特征:
1.一种代码检查方法,其特征在于,所述方法包括:响应针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树;确定至少一个代码核查点,并通过所述原始语法树进行所述代码核查点的核心数据封装,得到所述代码核查点对应的目标核心数据;其中,每个所述代码核查点对应至少一个代码检查规则;基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果。2.根据权利要求1所述的方法,其特征在于,确定至少一个代码核查点,并通过所述原始语法树进行所述代码核查点的核心数据封装,得到所述代码核查点对应的目标核心数据,包括:获取所述待检查代码对应的依赖信息;对所述原始语法树进行节点遍历,并在节点遍历的过程中,确定至少一个代码核查点;在每个所述代码核查点处,从所述待检查代码对应的依赖信息中提取所述代码核查点对应的依赖信息,并基于所述代码核查点对应的依赖信息对所述代码核查点的核心数据进行封装,得到所述代码核查点对应的目标核心数据。3.根据权利要求2所述的方法,其特征在于,在获取所述待检查代码对应的依赖信息之前,包括:读取所述待检测代码对应的依赖文件;解析所述依赖文件中的依赖信息,并按照预置的缓存策略对所述依赖信息进行缓存;所述获取所述待检查代码对应的依赖信息包括:从缓存读取所述待检查代码对应的依赖信息。4.根据权利要求2所述的方法,其特征在于,在每个所述代码核查点处,从所述待检查代码对应的依赖信息中提取所述代码核查点对应的依赖信息,并基于所述代码核查点对应的依赖信息对所述代码核查点的核心数据进行封装,得到所述代码核查点对应的目标核心数据,包括:在每个所述代码核查点处,从所述待检查代码对应的依赖信息中提取所述代码核查点对应的依赖信息,并导入所述代码核查点对应的依赖信息,得到每个所述代码核查点对应的核查点信息;对所述代码核查点对应的核查点信息进行核心数据封装,得到所述代码核查点对应的目标核心数据。5.根据权利要求1所述的方法,其特征在于,基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果,包括:获取所述待检查代码对应的代码文件对象;在每个所述代码核查点处,将所述代码文件对象和所述代码核查点对应的目标核心数据传递至所述代码核查点的每个所述代码检查规则对应的代码中,所述代码检查规则预先挂接在所述代码核查点,所述代码检查规则对应的代码包括预先封装的基类信息;通过所述代码检查规则对每个所述代码核查点进行代码检查,得到代码检查结果。6.根据权利要求5所述的方法,其特征在于,通过所述代码检查规则对每个所述代码核查点进行代码检查,得到代码检查结果,包括:
分别判断每个所述代码核查点对应的目标核心数据中是否包含目标检查数据,所述目标检查数据用于指示所述代码检查规则所需的数据;若所述代码核查点对应的目标核心数据中包含所述目标检查数据,则从所述代码核查点对应的目标核心数据中提取所述代码核查点对应的目标检查数据;若所述代码核查点对应的目标核心数据中不包含所述目标检查数据,则通过所述代码核查点对应的目标核心数据确定目标索引,并通过所述目标索引从所述原始语法树中提取所述代码核查点对应的目标检查数据;通过每个代码核查点对应的代码检查规则对所述目标检查数据进行代码检查,得到代码检查结果。7.根据权利要求1所述的方法,其特征在于,响应针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树,包括:响应代码编辑器针对待检查代码的检查指令,并通过预置的语法解析器对所述待检查代码进行语法树解析,得到所述待检查代码对应的原始语法树,所述语法解析器运行在所述代码编辑器;在基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果之后,还包括:在所述代码编辑器中显示所述代码检查结果。8.根据权利要求7所述的方法,其特征在于,在所述代码编辑器中显示所述代码检查结果,包括:在所述代码编辑器中显示所述代码检查结果,所述代码检查结果包括代码检查规则指示的错误提示信息。9.根据权利要求1所述的方法,其特征在于,在基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果之后,包括:将所述待检查代码对应的全局数据存储至共享缓存区;按照预置的缓存策略对缓存中的非全局过期数据进行清理。10.根据权利要求1所述的方法,其特征在于,响应针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树,包括:创建服务进程,并通过所述服务进程响应多个终端同时针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树。11.一种代码检查装置,其特征在于,所述装置包括:响应模块,用于响应针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树;封装模块,用于确定至少一个代码核查点,并通过所述原始语法树进行所述代码核查点的核心数据封装,得到所述代码核查点对应的目标核心数据;其中,每个所述代码核查点对应至少一个代码检查规则;检查模块,用于基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果。12.一种电子设备,其特征在于,包括处理器和存储器,所述存储器存储有能够被所述处理器执行的机器可执行指令,所述处理器执行所述机器可执行指令以实现权利要求1-10
任一项所述的代码检查方法。13.一种机器可读存储介质,其特征在于,所述机器可读存储介质存储有机器可执行指令,所述机器可执行指令在被处理器调用和执行时,所述机器可执行指令促使所述处理器实现权利要求1-10任一项所述的代码检查方法。

技术总结
本发明提供了一种代码检查方法、装置和电子设备;其中,该方法包括:响应针对待检查代码的检查指令,获取所述待检查代码对应的原始语法树;确定至少一个代码核查点,并通过所述原始语法树进行所述代码核查点的核心数据封装,得到所述代码核查点对应的目标核心数据;其中,每个所述代码核查点对应至少一个代码检查规则;基于每个所述代码核查点对应的目标核心数据进行所述代码检查规则的代码检查,得到代码检查结果。该方式中,通过在待检查代码中预设代码核查点,以及与代码核查点解耦的代码检查规则进行核心数据的代码检查,得到代码检查结果。从而降低代码检查规则与代码检查脚本的耦合性。耦合性。耦合性。


技术研发人员:张冬
受保护的技术使用者:广州博冠信息科技有限公司
技术研发日:2022.05.19
技术公布日:2022/11/1
转载请注明原文地址: https://tieba.8miu.com/read-5063.html

最新回复(0)