CN108549538A - 一种代码检测方法、装置、存储介质及测试终端 - Google Patents

一种代码检测方法、装置、存储介质及测试终端 Download PDF

Info

Publication number
CN108549538A
CN108549538A CN201810321498.XA CN201810321498A CN108549538A CN 108549538 A CN108549538 A CN 108549538A CN 201810321498 A CN201810321498 A CN 201810321498A CN 108549538 A CN108549538 A CN 108549538A
Authority
CN
China
Prior art keywords
file
code
lexical unit
unit sequence
subcode
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.)
Granted
Application number
CN201810321498.XA
Other languages
English (en)
Other versions
CN108549538B (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.)
Shenzhen Tencent Network Information Technology Co Ltd
Original Assignee
Shenzhen Tencent Network Information 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 Shenzhen Tencent Network Information Technology Co Ltd filed Critical Shenzhen Tencent Network Information Technology Co Ltd
Priority to CN201810321498.XA priority Critical patent/CN108549538B/zh
Publication of CN108549538A publication Critical patent/CN108549538A/zh
Application granted granted Critical
Publication of CN108549538B publication Critical patent/CN108549538B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Software Systems (AREA)
  • Stored Programmes (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明实施例公开了一种代码检测方法、装置、存储介质及测试终端,本发明实施例获取待检测的代码文件;构建所述待检测的代码文件对应的全局符号表;获取所述待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表;根据所述局部符号表和所述全局符号表,对所述词法单元序列表进行更新,得到更新后的词法单元序列表;根据所述局部符号表、所述全局符号表及所述更新后的词法单元序列表,确定所述待检测的代码文件的检测结果。该方案实现了对待检测的代码文件的全局检测,而不仅仅局限于单独对子代码文件进行局部检测,提高了代码检测的准确性。

Description

一种代码检测方法、装置、存储介质及测试终端
技术领域
本发明涉及计算机技术领域,具体涉及一种代码检测方法、装置、存储介质及测试终端。
背景技术
在软件项目开发中,为确保代码的可用性及准确性等,在代码开发出来后,通常需要对代码进行各种检测,得到代码检测结果,然后可以利用代码检测结果帮助开发人员定位代码中隐藏的问题,以便对代码进行相应的修复。
现有技术中,一个项目的代码文件中一般包括多个子代码文件,在对代码进行检测的过程中,需要单独对代码文件中的各个子代码文件进行检测,例如,先对一个子代码文件中的代码进行分析,获取该子代码文件的局部信息,根据该子代码文件的局部信息进行局部检测,得到该子代码文件的局部检测结果。然后,对另一个子代码文件中的代码按照该方法进行局部检测,得到另一个子代码文件的局部检测结果,依次类推,直至完成对代码文件中所有子代码文件的检测。
在对现有技术的研究和实践过程中,本发明的发明人发现,由于现有代码检测方案中对代码文件中的各个子代码文件的检测是独立,其检测的过程比较简单,得出的检测结果仅仅是代码文件中的各个子代码文件对应的局部检测结果,因此导致得到的局部检测结果准确性低。
发明内容
本发明实施例提供一种代码检测方法、装置、存储介质及测试终端,旨在提高代码检测的准确性。
为解决上述技术问题,本发明实施例提供以下技术方案:
一种代码检测方法,包括:
获取待检测的代码文件;
构建所述待检测的代码文件对应的全局符号表;
获取所述待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表;
根据所述局部符号表和所述全局符号表,对所述词法单元序列表进行更新,得到更新后的词法单元序列表;
根据所述局部符号表、所述全局符号表及所述更新后的词法单元序列表,确定所述待检测的代码文件的检测结果。
一种代码检测装置,包括:
第一获取单元,用于获取待检测的代码文件;
构建单元,用于构建所述待检测的代码文件对应的全局符号表;
第二获取单元,用于获取所述待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表;
更新单元,用于根据所述局部符号表和所述全局符号表,对所述词法单元序列表进行更新,得到更新后的词法单元序列表;
确定单元,用于根据所述局部符号表、所述全局符号表及所述更新后的词法单元序列表,确定所述待检测的代码文件的检测结果。
一种存储介质,所述存储介质存储有多条指令,所述指令适于处理器进行加载,以执行本发明实施例所提供的任一种代码检测方法中的步骤。
一种测试终端,所述测试终端包括:至少一个存储器和至少一个处理器;所述存储器存储有程序,所述处理器调用所述程序,以执行本发明实施例所提供的任一种代码检测方法中的步骤。
本发明实施例可以构建与待检测的代码文件对应的全局符号表,该全局符号表可以包括待检测的代码文件的全局信息,以及获取待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表,该局部符号表可以包括子代码文件的局部信息;然后根据局部符号表和全局符号表,对词法单元序列表进行更新,得到更新后的词法单元序列表;根据局部符号表、全局符号表及更新后的词法单元序列表,确定待检测的代码文件的检测结果。该方案由于可以通过全局符号表和局部符号表对词法单元序列表进行更新,并根据更新后的词法单元序列表,以及局部符号表和全局符号表得到整个待检测的代码文件的全局检测结果,实现了对待检测的代码文件的全局检测,而不仅仅局限于单独对子代码文件进行局部检测,因此,提高了代码检测的准确性。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的代码检测***的场景示意图;
图2是本发明实施例提供的代码检测方法的流程示意图;
图3是本发明实施例提供的词法单元序列表的局部示意图;
图4是本发明实施例提供的抽象语法树的局部示意图;
图5是本发明实施例提供的一子代码文件的局部符号表所形成结构树的局部示意图;
图6是本发明实施例提供的另一子代码文件的局部符号表所形成结构树的局部示意图;
图7是本发明实施例提供的全局符号表对应的结构树的局部示意图;
图8是本发明实施例提供的代码检测的示意图;
图9是本发明实施例提供的代码检测方法的另一流程示意图;
图10是本发明实施例提供的更新词法单元序列表的流程示意图;
图11是本发明实施例提供的代码检测装置的结构示意图;
图12是本发明实施例提供的代码检测装置的另一结构示意图;
图13是本发明实施例提供的代码检测装置的另一结构示意图;
图14是本发明实施例提供的代码检测装置的另一结构示意图;
图15是本发明实施例提供的终端的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供一种代码检测方法、装置、存储介质及测试终端。
请参阅图1,图1为本发明实施例所提供的代码检测***的场景示意图,该代码检测***可以包括代码检测装置,该代码检测装置具体可以集成在平板电脑、笔记本电脑、及台式电脑等具备储存单元并安装有微处理器而具有运算能力的终端中,主要用于获取待检测的代码文件,该代码文件可以是通过代码编程软开发工具件生成的,例如,可以向服务器发送关于代码文件的获取请求,并接收服务器基于该获取请求返回的代码文件等,还可以将代码文件中的无效代码内容进行过滤,得到待检测的代码文件,该无效代码内容可以是多余字符或注释内容等。然后,构建待检测的代码文件对应的全局符号表,该全局符号表中可以包括待检测的代码文件中所有子代码文件的类、函数及变量等信息,例如,可以先获取与待检测的代码文件中每个子代码文件对应的词法单元序列表,得到词法单元序列表集;再根据词法单元序列表集中每个词法单元序列表,构建与待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集,并根据局部符号表集构建全局符号表。其中,词法单元序列表可以包括词法单元的字符串值及属性信息等,局部符号表可以是包括子代码文件的类、函数及变量等信息,一个局部符号表对应一个子代码文件。以及可以获取待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表,例如,可以从词法单元序列表集中获取每个子代码文件对应的词法单元序列表,以及从局部符号表集中获取每个子代码文件对应的局部符号表;或者,对待检测的代码文件中每个子代码文件进行词法分析,得到每个子代码文件对应的词法单元序列表,并根据词法单元序列表构建与每个子代码文件对应的局部符号表等。在得到词法单元序列表、局部符号表和全局符号表后,可以根据局部符号表和全局符号表,对词法单元序列表进行更新,得到更新后的词法单元序列表。最后可以根据局部符号表、全局符号表及更新后的词法单元序列表,确定待检测的代码文件的检测结果;等等。
此外,代码检测***还可以包括服务器,该服务器可以用于存储终端上传的代码文件、词法单元序列表、局部符号表及全部局符号表等,该服务器还可以接收终端发送的关于代码文件的获取请求,并基于该获取请求将代码文件发送给终端;或者是,接收终端发送的关于局部符号表的获取请求,并基于该获取请求将局部符号表发送给终端等。
需要说明的是,图1所示的代码检测***的场景示意图仅仅是一个示例,本发明实施例描述的代码检测***以及场景是为了更加清楚的说明本发明实施例的技术方案,并不构成对于本发明实施例提供的技术方案的限定,本领域普通技术人员可知,随着代码检测***的演变和新业务场景的出现,本发明实施例提供的技术方案对于类似的技术问题,同样适用。
以下分别进行详细说明。
在本实施例中,将从代码检测装置的角度进行描述,该代码检测装置具体可以集成在平板电脑、笔记本电脑、及台式电脑等具备储存单元并安装有微处理器而具有运算能力的终端中。
一种代码检测方法,包括:获取待检测的代码文件;构建待检测的代码文件对应的全局符号表;获取待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表;根据局部符号表和全局符号表,对词法单元序列表进行更新,得到更新后的词法单元序列表;根据局部符号表、全局符号表及更新后的词法单元序列表,确定待检测的代码文件的检测结果。
请参阅图2,图2是本发明一实施例提供的代码检测方法的流程示意图。该代码检测方法可以包括:
在步骤S101中,获取待检测的代码文件。
其中,代码可以是开发人员利用开发工具所支持的语言编写出来的源文件,可以是一组由字符、符号或信号码元等以离散形式表示信息的明确的规则体系。该代码可以是C++语言、C语言、或Java语言等编写出来的源文件,还可以是其他语言编写出来的源文件,具体内容在此处不作限定。
代码检测装置首先获取待检测的代码文件,该待检测的代码文件可以是一个软件项目的代码文件,可以包括一个或多个子代码文件。
在某些实施方式中,获取待检测的代码文件的步骤可以包括:
(1)获取代码文件,并根据代码规则从代码文件中提取出无效代码内容。
(2)将无效代码内容进行过滤,得到待检测的代码文件。
具体地,代码检测装置可以获取代码文件,例如,可以从本地预先存储的代码库中获取代码文件,该代码文件可以是代码检测装置预先通过代码编程开发工具生成;或者是,可以向服务器发送代码文件获取请求,并接收服务器基于代码文件获取请求返回的代码文件,该代码文件可以是代码检测装置或者其他终端上传至服务器,由服务器存储该代码文件。可以理解的是,代码文件的获取方式还可以其他获取方式,具体内容在此处不作限定。
在得到代码文件后,代码检测装置可以对代码文件进行预处理,以过滤掉后续处理不需要的内容,例如,可以过滤与有效代码无关的部分,为后续的词法分析提供规范的字符流。该预处理可以包括根据代码规则从代码文件中提取出无效代码内容,其中,当代码文件是利用C++语言编写的源文件时,该代码规则可以是关于C++语言的编写规则;当代码文件是利用C语言编写的源文件时,该代码规则可以是关于C语言的编写规则;当代码文件是利用Java语言编写的源文件时,该代码规则可以是关于Java语言的编写规则等。该无效代码内容可以包括注释内容或预处理指令等,还可以包括其他内容,具体内容在此处不作限定。
在得到无效代码内容后,代码检测装置可以将无效代码内容进行过滤,即将无效代码内容从代码文件中删除,得到待检测的代码文件。当代码文件中包括多个子代码文件时,可以遍历多个子代码文件,从每个子代码文件中提取出无效代码内容,并将无效代码内容进行过滤。
可选地,根据代码规则从代码文件中提取出无效代码内容的步骤可以包括:
(a)根据代码规则从代码文件中提取出多余字符;
(b)根据代码规则中的注释标识从代码文件中提取出注释内容;
(c)根据代码规则中的预处理标识从代码文件中提取出预处理指令;
(d)将多余字符、注释内容及预处理指令设置为无效代码内容。
具体地,代码检测装置可以根据代码规则从代码文件中提取出多余字符,该多余字符可以包括多余空格、多余空格分号或多余括号等。例如,当代码文件是利用C++语言编写的源文件时,可以根据关于C++语言的代码规则,从代码文件中提取出三行多余空格。又例如,当代码文件是利用Java语言编写的源文件时,可以根据关于Java语言的代码规则,从代码文件中存在的连续六个空格中提取出其中的五个多余空格;等等。
代码检测装置可以根据代码规则中的注释标识从代码文件中提取出注释内容,其中,注释标识可以是双斜杠“//”,或者是“/*”和“*/”等。例如,当代码文件是利用C++语言编写的源文件时,可以根据关于C++语言的代码规则,从代码文件中查找注释标识“//”,并根据注释标识“//”从代码文件中“//”所在行提取出注释内容,该注释内容包括“//”及其后面的内容。
又例如,当代码文件是利用C++语言编写的源文件时,可以根据关于C++语言的代码规则,从代码文件中查找起始的注释标识“/*”,以及从代码文件中查找终止的注释标识“*/”,并根据起始的注释标识“/*”和终止的注释标识“*/”提取出“/*”与“*/”之间(包括/*和*/)的注释内容。
代码检测装置可以根据代码规则中的预处理标识从代码文件中提取出预处理指令,该预处理标识可以包括“#”等,该预处理指令可以包括#define、#if、及#pragma等。例如,当代码文件是利用C++语言编写的源文件时,可以根据关于C++语言的代码规则,从代码文件中查找预处理标识“#”,并根据预处理标识“#”从代码文件中“#”所在行提取出预处理指令,该预处理指令包括“#”及其后面的内容。
在得到多余字符、注释内容、及预处理指令后,代码检测装置可以将多余字符、注释内容及预处理指令设置为无效代码内容,实现了根据代码规则从代码文件中提取出无效代码内容。
在步骤S102中,构建待检测的代码文件对应的全局符号表。
在得到待检测的代码文件后,代码检测装置可以构建待检测的代码文件对应的全局符号表,其中,全局符号表可以包括待检测的代码文件中每个子代码文件包含的类及其相关信息、函数及其相关信息、变量及其相关信息等符号的数据结构。
在某些实施方式中,构建待检测的代码文件对应的全局符号表的步骤可以包括:
(一)获取与待检测的代码文件中每个子代码文件对应的词法单元序列表,得到词法单元序列表集。
(二)根据词法单元序列表集中每个词法单元序列表,构建与待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集。
(三)根据局部符号表集构建全局符号表。
具体地,代码检测装置可以先获取与待检测的代码文件中每个子代码文件对应的词法单元序列表,得到词法单元序列表集,例如,可以通过词法分析获取每个子代码文件对应的词法单元序列表。其中,词法单元序列表中可以包括多个词法单元(可以称为词素,也可以称为Token),例如,if或for等均为一个词法单元,一个子代码文件经过词法分析后可以生成的所有词法单元的集合,即为该子代码文件的词法单元序列表(可以称为TokenList),子代码文件中一段代码可以对应得到一个词法单元段(即一个Token段,也可以称为TokenSection),包括一个或者多个Token组成的序列。
需要说明的是,为了提高词法单元序列表的获取效率,代码检测装置可以调用多个线程,并通过各个线程并行获取各个子代码文件的词法单元序列表,从而可以快速获取到多个词法单元序列表。当然,代码检测装置可以串行获取词法单元序列表,具体内容在此处不作限定。
在某些实施方式中,获取与待检测的代码文件中每个子代码文件对应的词法单元序列表,得到词法单元序列表集的步骤可以包括:
(1)对待检测的代码文件中每个子代码文件进行词法分析,得到每个子代码文件对应的词法单元序列表。
(2)根据每个子代码文件对应的词法单元序列表,对待检测的代码文件中每个子代码文件进行标准化处理,得到每个标准子代码文件组成的标准代码文件集。
(3)获取标准代码文件集中每个标准子代码文件对应的词法单元序列表,得到词法单元序列表集。
具体地,在获取词法单元序列表集的过程中,首先,代码检测装置可以对待检测的代码文件中每个子代码文件进行词法分析,得到每个子代码文件对应的词法单元序列表,各个子代码文件对应的词法单元序列表可以组成词法单元序列表集,该词法单元序列表集中可以包括一个或多个子代码文件对应的词法单元序列表。
其中,词法分析可以是将子代码文件中的字符序列转换为词法单元序列的过程,该词法分析的主要用于读入预处理输出的字符流,将该字符流组成词素,生成并输出一个词法单元序列,每个词法单元对应一个词素,整个词法单元序列即为词法单元序列表,词法单元序列表是后续处理和上层检查项遍历代码的基本数据结构。
例如,对某个代码段:for(int index=0;index<42;++index)进行词法分析,可以得到“for”、“(”、“int”、“index”、“=”、“0”、“;”、“index”、“<”、“42”、“;”、“++”、“index”、及“)”等14个词法单元组成的词法单元序列。
在某些实施方式中,对待检测的代码文件中每个子代码文件进行词法分析,得到每个子代码文件对应的词法单元序列表的步骤可以包括:
(a)获取待检测的代码文件中每个子代码文件内每个词法单元的字符串值。
(b)获取与每个词法单元相关联的属性信息。
(c)根据每个词法单元的字符串值及属性信息生成双向链表,得到每个子代码文件对应的词法单元序列表组成的词法单元序列表集。
在获取词法单元序列表的过程中,代码检测装置可以获取待检测的代码文件中每个子代码文件内每个词法单元的字符串值,例如,对于词法单元“for”是由“f”、“o”、“r”等三个字符串值组成的,对于词法单元“int”是由“i”、“n”、“t”等三个字符串值组成的。
词法单元序列表是进行代码检测最基本的单位,除了包括词法单元的字符串值以外,还可以包括与词法单元相关联的属性信息,因此,可以获取与每个词法单元相关联的属性信息,其中,该属性信息可以包括指向下一个词法单元的指针、指向上一个词法单元的指针、词法单元的类型、及词法单元的行号等。
在得到子代码文件中每个词法单元的字符串值及属性信息后,可以根据每个词法单元的字符串值及属性信息生成双向链表,得到每个子代码文件对应的词法单元序列表,各个子代码文件对应的词法单元序列表可以组成词法单元序列表集。词法单元序列表本质上是一个双向链表,维护词法单元序列表中所有的词法单元。
例如,如图3所示,某段代码:“if(i>0)”的词法单元序列表可以表示为图3所示的双向链表,其中,箭头可以表示指向当前词法单元的下一个词法单元的指针,例如,指向词法单元“i”的下一个词法单元“>”的指针;或者箭头可以表示指向当前词法单元的上一个词法单元的指针,例如,指向词法单元“(”的上一个词法单元“if”的指针;或者箭头可以表示当前词法单元指向与其配对的词法单元的指针,例如,词法单元“(”指向与其配对的词法单元“)”的指针;等等。
可选地,获取与每个词法单元相关联的属性信息的步骤可以包括:
获取每个词法单元在待检测的代码文件中每个子代码文件内指向各类信息的指针,得到指针信息;获取每个词法单元的特征信息;将指针信息及每个词法单元的特征信息设置为与每个词法单元相关联的属性信息。
具体地,代码检测装置可以获取每个词法单元在待检测的代码文件中每个子代码文件内指向各类信息的指针,其中,各类信息可以包括当前的词法单元的下一个词法单元、与当前的词法单元配对的词法单元、及词法单元的数据流结构等。
例如,可以获取指向当前词法单元的下一个词法单元的指针、指向当前词法单元的上一个词法单元的指针、指向与当前词法单元配对的词法单元的指针(例如,对于左括号来说,即指向右括号的指针)、指向词法单元的符号表的指针(例如,对于变量指向的是全局符号表或局部符号表中的变量对象,对于函数指向的是全局符号表或局部符号表中的函数对象等)、词法单元的语法树结构指针(可以用于维护词法单元的抽象语法树结构)、及词法单元的数据流结构指针等,这些均为指针信息。
此时,还需要获取每个词法单元的特征信息,其中,特征信息可以包括词法单元所在代码文件中的行号、及词法单元的类型等,词法单元的类型可以包括数字、字符串、变量、函数、及关键字等类型,例如,“1”和“2”等可以为数字类型,“main”可以为函数类型,“index”和“i”等可以为变量类型,等等。这些指针信息及词法单元的特征信息即为与词法单元相关联的属性信息。
在某些实施方式中,根据每个子代码文件对应的词法单元序列表,对待检测的代码文件中每个子代码文件进行标准化处理,得到每个标准子代码文件组成的标准代码文件集的步骤可以包括:
(a)根据每个子代码文件对应的词法单元序列表及代码标准逻辑格式,获取标准的代码格式。
(b)从待检测的代码文件中每个子代码文件内查找与代码格式不匹配的目标代码格式。
(c)根据代码格式对目标代码格式进行修改,得到每个标准子代码文件组成的标准代码文件集。
由于不同项目代码可能是由不同的开发人员编写的,对于不同开发人员的代码风格可能是不同的,客观上形成了代码多样性的现状,因此,为了提高构建全局符号表的效率,以及提高代码检测的准确性,在获取到词法单元序列表后,可以对代码文件进行标准化处理,例如,可以通过一些简化步骤来统一代码风格,以实现标准化及规范化。其中,该标准化处理的过程中,对于所有简化步骤都不能改变代码逻辑,而只是进行逻辑上的等价替换。
具体地,在得到每个子代码文件对应的词法单元序列表后,代码检测装置可以根据每个子代码文件对应的词法单元序列表,以及代码标准逻辑格式,获取标准的代码格式,例如,一个函数实现的逻辑格式可以是以左大括号为起始,并以右大括号结束。其中,当代码文件是利用C++语言编写的源文件时,该代码标准逻辑格式可以是关于C++语言的逻辑格式;当代码文件是利用Java语言编写的源文件时,该代码标准逻辑格式可以是关于Java语言的逻辑格式。
然后,从待检测的代码文件中每个子代码文件内查找与标准的代码格式不匹配的目标代码格式,根据标准的代码格式对目标代码格式进行修改,得到每个标准子代码文件,例如,可以利用标准的代码格式替换目标代码格式,各个标准子代码文件可以组成标准代码文件集。从而实现对代码文件进行等价的代码逻辑替换,以规范代码格式。
例如,以规范化条件表达式为例,在进行标准化处理之前,对于某个子代码文件中的条件表达式省略了大括号的语句,具体子代码文件可以如下:
代码检测装置根据子代码文件对应的词法单元序列表可以分析出条件表达式if(i>0)所在的位置,以及根据代码标准逻辑格式确定标准的代码格式为条件表达式后面需要设置大括号,此时,可以从子代码文件中查找与代码格式不匹配的目标代码格式:条件表达式if(i>0)后面没有设置大括号,然后可以根据代码格式对目标代码格式进行修改,即在条件表达式if(i>0)后面添加大括号,实现对子代码文件进行标准化处理,得到标准子代码文件,具体可以如下:
在得到标准代码文件集后,代码检测装置可以获取标准代码文件集中每个标准子代码文件对应的词法单元序列表,例如,可以将添加的字符(例如大括号)***标准化处理之前子代码文件对应的词法单元序列表,得到标准子代码文件对应的词法单元序列表;或者是,可以将删除的字符从标准化处理之前子代码文件对应的词法单元序列表中删除,得到标准子代码文件对应的词法单元序列表;各个标准子代码文件对应的词法单元序列表可以组成词法单元序列表集。
在上述得到词法单元序列表集后,代码检测装置可以根据词法单元序列表集中每个词法单元序列表,构建与待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集。例如,可以遍历词法单元序列表,从词法单元序列表提取出子代码文件对应的类、函数和变量等信息,以及与类、函数和变量等相关的关键特性等信息,根据这些信息可以构建类列表、函数列表和变量列表等,可以根据每个子代码文件对应的类列表、函数列表和变量列表构建与每个子代码文件对应的局部符号表,各个子代码文件对应的局部符号表可以组成局部符号表集。
在某些实施方式中,根据词法单元序列表集中每个词法单元序列表,构建与待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集的步骤可以包括:
(1)根据词法单元序列表集中每个词法单元序列表,构建与待检测的代码文件中每个子代码文件对应的抽象语法树。
(2)根据抽象语法树构建与待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集。
具体地,代码检测装置可以根据词法单元序列表集中每个词法单元序列表,构建与待检测的代码文件中每个子代码文件对应的抽象语法树(Abstract Syntax Tree,AST)。其中,抽象语法树可以是代码的抽象语法结构的树状表现形式,抽象语法树可以是一个二叉树,每一个非叶子节点代表一个运算符,运算符所在非叶子节点的两个子节点分别代表该运算符的两个运算分量。抽象语法树结构包含了表达式的逻辑结构和运算符的优先级关系,这个特性能够提高代码场景匹配的准确性以及实现该代码场景的效率。
需要说明的是,本发明实施例中的抽象语法树,不会建立代码表达式之间的逻辑关系,例如,不会建立if-else语句段中if语句和else语句之间的逻辑关系,而只针对单个代码表达式中建立抽象语法结构,并不建立表达式和表达式之间的结构关系。由于如果建立表达式和表达式之间的结构关系,则一旦输入的代码文件存在语法错误,那么构建出来的全局抽象语法树结构将会是错误,且没有参考意义的,因此本发明支持不完整的或者不能通过编译的代码文件作为输入,并且构建单表达式的抽象语法树结构,如果某个表达式出现错误,那也只是局部的抽象语法树结构出现错误,而不会影响其他表达式的抽象语法树结构。
例如,如下一段代码:
String::Format("demo:%d%s%d",Func(1,2),"AST",1+2*3);
对于该段代码最终构建出来的抽象语法树的结构,可以如图4所示,包括了参数1:"demo:%d%s%d"、参数2:Func(1,2)、参数3:"AST"、及参数4:1+2*3等,例如,非叶子节点“*”代表一个运算符,该运算符所在非叶子节点的两个子节点“2”和“3”分别代表该运算符的两个运算分量,即2*3;运算符“+”对应的两个子节点为“1”和“*”,可以得到1+2*3。
在得到抽象语法树后,可以根据抽象语法树构建与待检测的代码文件中每个子代码文件对应的局部符号表,各个子代码文件对应的局部符号表可以组成局部符号表集。
在某些实施方式中,根据抽象语法树构建与待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集的步骤可以包括:
(a)根据抽象语法树获取待检测的代码文件中每个子代码文件对应的类列表、函数列表和变量列表。
(b)根据每个子代码文件对应的类列表、函数列表和变量列表构建与每个子代码文件对应的局部符号表,得到局部符号表集。
具体地,代码检测装置可以根据抽象语法树中树状结构快速提取出子代码文件对应的类、函数和变量等信息,以及与类、函数和变量等相关的关键特性等信息,根据这些信息可以构建待检测的代码文件中每个子代码文件对应的类列表、函数列表和变量列表等,可以根据每个子代码文件对应的类列表、函数列表和变量列表构建与每个子代码文件对应的局部符号表,各个子代码文件对应的局部符号表可以组成局部符号表集。其中,局部符号表也可以称为SymbolDatabase,该局部符号表可以是子代码文件对应的符号化结果对象。
例如,在C++语言编写的源文件中,在获取到每一个.cpp文件(包含对应展开的.h文件)对应的词法单元序列表后,可以根据该词法单元序列表构建一个对应的局部符号表,其中,每一个局部符号表可以包含以下三种类型的数据:(1)类型列表(也可以称为TypeList),可以用于记录代码文件中所有的类型,例如,class、struct或namespace等类型,该类型列表中可以包括各个类型名称、以及各个类型对应的关键特征等;(2)函数列表(也可以称为Function List),可以用于记录代码文件中所有的函数,该函数列表中可以包括各个函数名称、以及各个函数对应的关键特征(例如,函数的返回值等)等;(3)变量列表(也可以称为Variable List),可以用于记录代码文件中所有的变量,该变量列表中可以包括各个变量名称、以及各个变量对应的关键特征等。
以下将进行举例说明,例如,demo.cpp代码文件中可以包括demo1.cpp、demo.h及demo2.cpp等子代码文件,demo1.cpp子代码文件中的代码内容可以如下所示:
demo1.cpp子代码文件中可以包括demo.h子代码文件,demo.h子代码文件中的代码内容可以如下所示:
在扫描检测demo1.cpp子代码文件时,可以得到有类似如下的局部符号表:
由demo1.cpp子代码文件的局部符号表可知,demo1.cpp子代码文件中存在符号缺失:CDemo2::Func的定义没有找到,而实际上,CDemo2::Func的定义在demo2.cpp子代码文件中,该demo2.cpp子代码文件中的代码内容可以如下所示:
在扫描检测demo2.cpp子代码文件时,可以得到有类似如下的局部符号表:
由demo2.cpp子代码文件的局部符号表可知,demo2.cpp子代码文件的局部符号表相比demo1.cpp子代码文件的局部符号表较为简单,其中最重要的信息就是CDemo2::Func函数的定义,这个在demo1.cpp子代码文件对应的局部符号表中是缺失的,这个也是单独获取各个子代码文件所出现的比较重要的问题,这时候跨文件符号查找能力是缺失的。
因此,在得到各个子代码文件对应的局部符号表所组成的局部符号表集后,可以根据局部符号表集构建全局符号表,从而可以在全局符号表中查找到某个子代码文件中缺失的类、函数或变量等符号(即类型参数),实现跨文件符号查找能力。
在某些实施方式中,根据局部符号表集构建全局符号表的步骤可以包括:
(1)将局部符号表集中每个局部符号表进行合并,得到合并后的符号表。
(2)将合并后的符号表中相同的符号参数保留其中一个,并对相同的符号参数中的其他参数进行删除,得到全局符号表。
具体地,代码检测装置可以将局部符号表集中每个局部符号表进行合并,得到合并后的符号表,由于合并后的符号表中可能会存在相同的符号参数,该符号参数可以包括类、函数及变量等,因此可以将合并后的符号表中相同的符号参数保留其中一个,并对相同的符号参数中的其他参数进行删除,得到全局符号表。或者是,当合并后的符号表中存在两个相同的符号参数时,其中一个符号参数未定义,而另一个符号参数定义时,在合并的过程中可以保留已定义的符号参数,而删除未定义的符号参数。
例如,对于demo1.cpp子代码文件和demo2.cpp子代码文件分别构造了局部符号表,但是在demo1.cpp子代码文件中CDemo2::Func函数的定义是缺失的,该函数的定义是在demo2.cpp子代码文件的局部符号表中。因此,为了很好地解决符号缺失的问题,可以根据各个局部符号表构建全局符号表,构建全局符号表的关键是,解决类、函数和变量等符号的查找和符号冲突时的合并逻辑。
例如,为了形象地说明全局符号表的构建,以符号结构树的形式进行说明,demo1.cpp子代码文件的局部符号表对应的符号结构树可以如图5所示,由图5可知,demo1.cpp子代码文件的局部符号表中可以包括CObject、CDemo1、CDemo2等类,以及包括Func函数及global_var1变量等,其中,CDemo1类中定义有Func,而CDemo2类中Func定义缺失。
demo2.cpp子代码文件的局部符号表对应的符号结构树可以如图6所示,由图6可知,demo1.cpp子代码文件的局部符号表中可以包括CObject和CDemo2等类、及global_var2变量等,其中,CDemo2类中定义有Func。
根据demo1.cpp子代码文件的局部符号表,以及demo2.cpp子代码文件的局部符号表,构建得到的全局符号表可以如图7所示,由图7可知,全局符号表中可以包括CObject、CDemo1、及CDemo2等类,以及包括Func函数,还包括global_var1和global_var2等变量,其中,CDemo1及CDemo2类中均定义有Func。即将demo1.cpp子代码文件和demo2.cpp子代码文件的符号结构树进行合并后,demo2.cpp子代码文件中的CDemo2::Func函数的定义,以及global_var2变量合并到了demo1.cpp子代码文件的符号结构树中。
在步骤S103中,获取待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表。
为了方便对代码进行检测,代码检测装置还需要获取待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表。
在某些实施方式中,获取待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表的步骤可以包括:
(1)当存储有词法单元序列表集和局部符号表集时,从词法单元序列表集中获取待检测的代码文件中每个子代码文件对应的词法单元序列表。
(2)从局部符号表集中获取待检测的代码文件中每个子代码文件对应的局部符号表。
具体地,代码检测装置在上述获取全局符号表的过程中,由于需要获取与待检测的代码文件中每个子代码文件对应的词法单元序列表,以及与待检测的代码文件中每个子代码文件对应的局部符号表等,因此,代码检测装置在上述获取到词法单元序列表集和局部符号表集后,可以将词法单元序列表集和局部符号表集存储至本地硬盘中;或者,将词法单元序列表集和局部符号表集上传至服务器,由服务器对词法单元序列表集和局部符号表集进行存储;等等。
此时,代码检测装置在获取每个子代码文件对应的词法单元序列表及局部符号表的过程中,可以判断本地硬盘或服务器等是否存储有词法单元序列表集,当存储有词法单元序列表集时,可以直接从词法单元序列表集中获取待检测的代码文件中每个子代码文件对应的词法单元序列表。以及,判断本地硬盘或服务器等是否存储有局部符号表集,当存储有局部符号表集时,可以直接从局部符号表集中获取待检测的代码文件中每个子代码文件对应的局部符号表。
在某些实施方式中,获取待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表的步骤可以包括:
(1)当未存储词法单元序列表集和局部符号表集时,对待检测的代码文件中每个子代码文件进行词法分析,得到每个子代码文件对应的词法单元序列表。
(2)根据词法单元序列表,构建与每个子代码文件对应的抽象语法树。
(3)根据抽象语法树构建与每个子代码文件对应的局部符号表。
代码检测装置在上述获取全局符号表的过程中,可以不存储获取到的词法单元序列表集和局部符号表集等,此时,代码检测装置在获取每个子代码文件对应的词法单元序列表及局部符号表的过程中,可以判断本地硬盘或服务器等是否存储有词法单元序列表集,当未存储有词法单元序列表集时,代码检测装置需要重新获取每个子代码文件对应的词法单元序列表和局部符号表。
具体地,代码检测装置可以对待检测的代码文件中每个子代码文件进行词法分析,得到每个子代码文件对应的词法单元序列表。例如,可以获取待检测的代码文件中每个子代码文件内每个词法单元的字符串值,以及获取与每个词法单元相关联的属性信息;根据每个词法单元的字符串值及属性信息生成双向链表,得到每个子代码文件对应的词法单元序列表。
代码检测装置还可以根据每个子代码文件对应的词法单元序列表,对待检测的代码文件中每个子代码文件进行标准化处理,得到每个标准子代码文件。例如,可以根据每个子代码文件对应的词法单元序列表及代码标准逻辑格式,获取标准的代码格式;从待检测的代码文件中每个子代码文件内查找与代码格式不匹配的目标代码格式;根据代码格式对目标代码格式进行修改,得到每个子代码文件对应的标准子代码文件。
然后,获取每个标准子代码文件对应的词法单元序列表,最终将每个标准子代码文件对应的词法单元序列表设置为每个子代码文件对应的词法单元序列表。此时,可以根据词法单元序列表,构建与每个子代码文件对应的抽象语法树,以及根据抽象语法树构建与每个子代码文件对应的局部符号表。例如,可以根据抽象语法树获取待检测的代码文件中每个子代码文件对应的类列表、函数列表和变量列表,并根据每个子代码文件对应的类列表、函数列表和变量列表构建与每个子代码文件对应的局部符号表。
在步骤S104中,根据局部符号表和全局符号表,对词法单元序列表进行更新,得到更新后的词法单元序列表。
在步骤S105中,根据局部符号表、全局符号表及更新后的词法单元序列表,确定待检测的代码文件的检测结果。
在得到全局符号表,以及待检测的代码文件中每个子代码文件对应的局部符号表和词法单元序列表,代码检测装置可以根据局部符号表和全局符号表,对词法单元序列表进行更新,得到更新后的词法单元序列表。例如,代码检测装置可以遍历词法单元序列表,对词法单元序列表中的类、函数及变量进行查找和链接,基于上述构建好的全局符号表,使用上下文敏感的符号查找算法,实现跨文件或跨模块的符号查找能力,达到获取更准确的代码检测结果。
其中,类、函数及变量等符号的查找和链接的作用在于是将遍历词法单元序列表中的类、函数及变量等与其所在局部符号表或全局符号表的进行关联,以便在遍历词法单元序列表时,能够获知类、函数或变量等的相关信息,从而能够显著提高代码检查项扫描的效率。
在某些实施方式中,根据局部符号表和全局符号表,对词法单元序列表进行更新,得到更新后的词法单元序列表,根据局部符号表、全局符号表及更新后的词法单元序列表,确定待检测的代码文件的检测结果的步骤可以包括:
(1)从待检测的代码文件中获取子代码文件,作为当前子代码文件。
(2)获取当前子代码文件对应的词法单元序列表及局部符号表。
(3)根据局部符号表和全局符号表,对当前子代码文件对应的词法单元序列表进行更新,得到更新后的词法单元序列表。
(4)根据局部符号表、全局符号表及更新后的词法单元序列表,确定当前子代码文件的检测结果。
(5)返回执行从待检测的代码文件中获取子代码文件,作为当前子代码文件的步骤,直至待检测的代码文件中的子代码文件检测完毕,得到待检测的代码文件的检测结果。
代码检测装置可以通过上下文敏感的符号查找算法对词法单元序列表进行更新,通过该上下文敏感的符号查找算法可以遍历待检测的代码文件中各个子代码文件词法单元序列表,获取词法单元序列表中的类、函数及变量等类型参数,将类型参数与局部符号表或全局符号表中的类型参数进行指针链接,以更新词法单元序列表。从而使得基于上述获取到的全局符号表,实现了上下文敏感的符号查找算法,是对代码检测结果正确性的一个重要的保障。
具体地,代码检测装置可以从待检测的代码文件中获取子代码文件,作为当前子代码文件,然后,从词法单元序列表集中获取当前子代码文件对应的词法单元序列表,以及,从局部符号表集中获取当前子代码文件对应的局部符号表;或者是,对当前子代码文件进行词法分析,得到当前子代码文件对应的词法单元序列表,以及根据当前子代码文件的词法单元序列表构建与当前子代码文件对应的局部符号表;等等。
在得到当前子代码文件的词法单元序列表和局部符号表后,代码检测装置可以根据局部符号表和全局符号表,对当前子代码文件对应的词法单元序列表进行更新,得到更新后的词法单元序列表。
在某些实施方式中,根据局部符号表和全局符号表,对词法单元序列表进行更新,得到更新后的词法单元序列表的步骤可以包括:
(a)获取词法单元序列表中的类型参数,类型参数包括类型参数的类型名和类型参数的限定名。
(b)当类型参数的类型名不是***类型名时,且局部符号表中不存在类型参数的类型名时,从全局符号表中查找类型参数的类型名。
(c)当全局符号表中存在类型参数的类型名时,将词法单元序列表中类型参数的限定名与全局符号表中类型参数的限定名进行匹配。
(d)若匹配成功,则将词法单元序列表中的类型参数与全局符号表中的类型参数进行指针链接,得到更新后的词法单元序列表。
具体地,代码检测装置可以遍历当前子代码文件的词法单元序列表,获取当前子代码文件的词法单元序列表中的类型参数,该类型参数可以包括一个或多个,其中,该类型参数可以包括类、函数及变量等,该类型参数可以包括类型参数的类型名和类型参数的限定名,该限定名可以包括一个或多个。例如,对于类型参数A::B::C,其类型名为C,限定名为A::B。
在得到类型参数后,代码检测装置可以从类型参数中提取出类型参数的类型名,然后判断该类型参数的类型名是否是***类型名,该***类型名可以包括代码编译***自带的数据中存储的类型名,例如,main。当类型参数的类型名是***类型名时,可以不在局部符号表或全局符号表中继续查找该类型名,而是结束查找流程,返回该类型参数指向符号表的指针为空。
当类型参数的类型名不是***类型名时,可以进一步判断局部符号表中是否存在类型参数的类型名,当局部符号表中不存在类型参数的类型名时,可以从全局符号表中查找类型参数的类型名,判断全局符号表中是否存在类型参数的类型名。当全局符号表中存在类型参数的类型名时,将词法单元序列表中类型参数的限定名与全局符号表中类型参数的限定名进行匹配,判断词法单元序列表中类型参数的限定名与全局符号表中类型参数的限定名是否匹配成功。若词法单元序列表中类型参数的限定名与全局符号表中类型参数的限定名匹配成功,则将词法单元序列表中的类型参数与全局符号表中的类型参数进行指针链接,例如,可以将词法单元序列表中的类型参数指向符号表的指针,设置为指向全局符号表中的类型参数,得到更新后的词法单元序列表。
在某些实施方式中,获取词法单元序列表中的类型参数的步骤之后,该代码检测方法还包括:
(e)当类型参数的类型名不是***类型名时,且局部符号表中存在类型参数的类型名时,将词法单元序列表中类型参数的限定名与局部符号表中类型参数的限定名进行匹配。
(f)若匹配成功,则将词法单元序列表中的类型参数与局部符号表中类型参数进行指针链接,得到更新后的词法单元序列表。
当类型参数的类型名不是***类型名时,代码检测装置可以进一步判断局部符号表中是否存在类型参数的类型名,当局部符号表中存在类型参数的类型名时,将词法单元序列表中类型参数的限定名与局部符号表中类型参数的限定名进行匹配,判断词法单元序列表中类型参数的限定名与局部符号表中类型参数的限定名是否匹配成功。若词法单元序列表中类型参数的限定名与局部符号表中类型参数的限定名匹配成功,则将词法单元序列表中的类型参数与局部符号表中类型参数进行指针链接,例如,可以将词法单元序列表中的类型参数指向符号表的指针,设置为指向局部符号表中的类型参数,得到更新后的词法单元序列表。
在更新当前子代码文件的词法单元序列表后,代码检测装置可以根据全局符号表、当前子代码文件的局部符号表、及更新后的词法单元序列表,确定当前子代码文件的检测结果。例如,可以进行代码检查项扫描,基于构建好的全局符号表和符号链接结果,针对各错误代码场景进行代码扫描,即遍历更新后的词法单元序列表,查找更新后的词法单元序列表中的类、函数及变量等,根据查找到的类、函数或变量等,调用类、函数或变量所在的局部符号表及全局符号表,从局部符号表或全局符号表中存储的关键特征中提取出当前子代码文件的检测结果。代码检测装置还可以按照一定格式输出代码错误信息,具体输出格式可以根据实际需要进行灵活设置,具体内容在此处不作限定。
以下将进行举例说明,例如,如图8所示,以上述demo1.cpp子代码文件和demo2.cpp子代码文件为例,基于全局符号表以及类、函数、及变量的查找和关联,可以发现单个局部符号表中不能发现的问题,在检测结果中,demo1.cpp子代码文件中的demo.Func函数调用正确关联到demo2.cpp子代码文件中的CDemo2::Func函数,基于全局符号表,可以获知type等于1时,返回值为空指针NULL这个关键特征,因此可以输出demo1.cpp子代码文件中第19行空指针p解引用报错。
在完成对当前子代码文件的词法单元序列表进行更新,及确定当前子代码文件的检测结果后,可以继续从待检测的代码文件中获取另一个子代码文件,作为当前子代码文件,即返回执行从待检测的代码文件中获取子代码文件,作为当前子代码文件的步骤,直至待检测的代码文件中的子代码文件检测完毕,得到待检测的代码文件的检测结果。
由上可知,本发明实施例可以构建与待检测的代码文件对应的全局符号表,该全局符号表可以包括待检测的代码文件的全局信息,以及获取待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表,该局部符号表可以包括子代码文件的局部信息;然后根据局部符号表和全局符号表,对词法单元序列表进行更新,得到更新后的词法单元序列表;根据局部符号表、全局符号表及更新后的词法单元序列表,确定待检测的代码文件的检测结果。该方案由于可以通过全局符号表和局部符号表对词法单元序列表进行更新,并根据更新后的词法单元序列表,以及局部符号表和全局符号表得到整个待检测的代码文件的全局检测结果,实现了对待检测的代码文件的全局检测,而不仅仅局限于单独对子代码文件进行局部检测,因此,提高了代码检测的准确性。
根据上述实施例所描述的方法,以下将举例作进一步详细说明。
本实施例以代码检测装置为终端为例,并且以代码文件为C++编写的源文件为例,本实施例C++语言项目的代码文件作为输入,对C++代码进行第一次扫描:对C++代码文件中每个子代码文件进行词法分析,得到词法单元序列表,并根据词法单元序列表构建每个子代码文件对应的局部符号表,然后根据每个子代码文件对应的局部符号表构建全局符号表,从而第一次扫描后可以在全局符号表中缓存变量、函数、及类等相关的关键特征。然后,C++代码进行第二次扫描:获取C++代码文件中每个子代码文件的词法单元序列表和局部符号表。以及,根据全局符号表、局部符号表对每个子代码文件的词法单元序列表进行更新,以建立变量使用、函数调用及类调用的链接,并基于全局符号表进行具体的代码规则检查,从而可以输出代码检测结果,为上层静态代码检查项提供检查所需的结果。
请参阅图9,图9为本发明实施例提供的代码检测方法的流程示意图。该方法流程可以包括:
首先,终端获取待检测的代码文件。
其中,待检测的代码文件以C++编写的源文件为例,该待检测的代码文件可以是一个C++项目的代码文件,可以包括一个或多个子代码文件,以下将以C++代码文件中包括多个子代码文件为例进行说明。
需要说明的是,本发明实施例在对代码进行检测的过程中,可以是不基于编译的,即可以进行静态代码检测,从而能够在编译不通过的情况下进行检测,不影响整体检测流程和结果。另外,C++代码文件可以支持Windows\Linux\Mac等***,可以实现跨平台检测。
其次,终端对待检测的代码文件进行第一次扫描。
其中,第一次扫描的过程中可以包括对代码文件进行预处理、词法分析及标准化处理等。
预处理:
终端对代码文件进行预处理可以是根据C++代码规则从代码文件中提取出无效代码内容,将无效代码内容进行过滤,得到预处理后的代码文件,该无效代码内容可以包括多余字符、注释内容及预处理指令等。例如,终端可以根据C++代码规则从代码文件中提取出多余字符,该该多余字符可以包括多余空格、多余空格分号或多余括号等;例如,可以根据关于C++代码规则从代码文件中提取出三行多余空格。
以及,终端根据C++代码规则中的注释标识从代码文件中提取出注释内容,其中,注释标识可以是双斜杠“//”,或者是“/*”和“*/”等,例如,可以根据C++代码规则从代码文件中查找注释标识“//”,并根据注释标识“//”从代码文件中“//”所在行提取出包括“//”及其后面的内容的注释内容。
终端还可以根据C++代码规则中的预处理标识从代码文件中提取出预处理指令,该预处理标识可以包括“#”等,例如,可以根据关于C++语言的代码规则,从代码文件中查找预处理标识“#”,并根据预处理标识“#”从代码文件中“#”所在行提取出包括“#”及其后面的内容的预处理指令。此时,终端可以将多余字符、注释内容及预处理指令等无效代码内容从代码文件中删除,得到预处理后的代码文件。
以下将进行举例说明,例如,预处理前C++代码文件中的某个子代码文件为:
此时,可以根据C++代码规则从该子代码文件中提取出多余字符、注释内容、及预处理指令等无效代码内容,并将无效代码内容进行过滤,得到预处理后的子代码文件为:
需要说明的是,将函数main()内部的“#ifdef TEST_PRE_CMD”、“#else”、“printf("TEST_PRE_CMD is not define.");//not define”、及“#endif”等无效代码内容过滤后,可以预留空行,用于指示预处理之前无效代码内容所在行;当然,也可以不预留空行;可以根据实际需要进行灵活设置,具体内容在此处不作限定。
词法分析:
在得到预处理后的代码文件后,终端可以对预处理后的代码文件进行词法分析,得到代码文件中每个子代码文件对应的词法单元序列表。例如,终端可以获取C++代码文件中每个子代码文件内每个词法单元的字符串值,以及获取与每个词法单元相关联的属性信息,根据每个词法单元的字符串值及属性信息生成双向链表,得到每个子代码文件对应的词法单元序列表。该属性信息可以包括每个词法单元的指针信息及每个词法单元的特征信息等,该指针信息可以包括指向当前词法单元的下一个词法单元的指针、指向当前词法单元的上一个词法单元的指针、指向与当前词法单元配对的词法单元的指针、及指向词法单元的符号表的指针等,该特征信息可以包括词法单元所在代码文件中的行号、及词法单元的类型等,词法单元的类型可以包括数字、字符串、变量、函数、及关键字等类型。
其中,该词法分析与上述词法分析过程类似,在此处不作赘述。例如,对某个代码段:for(int i=0;i<10;++i)进行词法分析,可以得到“for”、“(”、“int”、“i”、“=”、“0”、“;”、“i”、“<”、“10”、“;”、“++”、“i”、及“)”等词法单元,然后,词法单元以双向链表的形式组成的词法单元序列。
标准化处理:
在得到词法单元序列后,终端可以对C++代码文件中每个子代码文件进行标准化处理,得到各个标准子代码文件。例如,终端可以根据每个子代码文件对应的词法单元序列表及C++代码标准逻辑格式,获取标准的代码格式,以及从待检测的代码文件中每个子代码文件内查找与代码格式不匹配的目标代码格式,根据代码格式对目标代码格式进行修改,得到每个子代码文件对应的标准子代码文件,从而实现对代码文件进行等价的代码逻辑替换,以规范代码格式。
例如,以标准化宏的展开为例,在进行标准化处理之前,对于某个局部代码可以如下:
代码检测装置根据词法单元序列表可以分析出宏#define所在的位置,以及根据代码标准逻辑格式确定标准的代码格式可以对宏进行展开,此时,可以从该局部代码中查找与代码格式不匹配的目标代码格式:宏没有进行展开,然后可以根据代码格式对目标代码格式进行修改,即对宏进行展开,实现了对代码进行标准化处理,得到标准的代码可以如下:
return(a>b?a:b);
在得到标准子代码文件后,终端可以获取每个标准子代码文件对应的词法单元序列表,例如,可以将添加的字符***标准化处理之前子代码文件对应的词法单元序列表,或者是,将删除的字符从标准化处理之前子代码文件对应的词法单元序列表中删除,得到标准子代码文件对应的词法单元序列表。
构建局部符号表:
在得到C++代码文件中各个标准子代码文件对应的词法单元序列表后,终端可以构建C++代码文件中各个标准子代码文件对应局部符号表。例如,终端可以根据各个标准子代码文件对应的词法单元序列表构建抽象语法树,根据抽象语法树构建与每个子代码文件对应的局部符号表。其中,抽象语法树的构建与上述抽象语法树的构建类似,在此处不作赘述。
终端可以根据抽象语法树获取每个子代码文件对应的类列表、函数列表和变量列表,该类列表中可以包括类及与类相关的关键特性,该函数列表中可以包括函数及与函数相关的关键特性,该变量列表中可以包括变量及与变量相关的关键特性等,然后根据每个子代码文件对应的类列表、函数列表和变量列表构建与每个子代码文件对应的局部符号表。其中,该局部符号表的构建与上述局部符号表的构建类似,在此处不作赘述。
构建全局符号表:
在得到每个子代码文件对应的局部符号表后,终端可以根据每个子代码文件对应的局部符号表构建全局符号表。例如,终端可以将局部符号表集中每个局部符号表进行合并,得到合并后的符号表;然后将合并后的符号表中相同的符号参数保留其中一个,并对相同的符号参数中的其他参数进行删除,得到全局符号表。其中,该全局符号表的构建与上述全局符号表的构建类似,在此处不作赘述。
在得到全局符号表后,终端可以对C++代码文件进行第二次扫描,以获取每个子代码文件对应的词法单元序列表及局部符号表。例如,终端可以从预先存储的词法单元序列表集的本地硬盘或服务器中获取每个子代码文件对应的词法单元序列表,以及从预先存储的局部符号表集的本地硬盘或服务器中获取每个子代码文件对应的局部符号表。
或者是,终端可以按照上述方法重新获取每个子代码文件对应的词法单元序列表及局部符号表,具体地,可以对C++代码文件中每个子代码文件进行词法分析,得到每个子代码文件对应的词法单元序列表。例如,可以获取每个子代码文件内每个词法单元的字符串值及相关联的属性信息;根据每个词法单元的字符串值及属性信息生成双向链表,得到每个子代码文件对应的词法单元序列表。终端还可以根据每个子代码文件对应的词法单元序列表,对待检测的代码文件中每个子代码文件进行标准化处理,得到每个标准子代码文件。然后,获取每个标准子代码文件对应的词法单元序列表,最终将每个标准子代码文件对应的词法单元序列表设置为每个子代码文件对应的词法单元序列表。
此时,终端可以根据词法单元序列表,构建与每个子代码文件对应的抽象语法树,以及根据抽象语法树构建与每个子代码文件对应的局部符号表。例如,可以根据抽象语法树获取待检测的代码文件中每个子代码文件对应的类列表、函数列表和变量列表,并根据每个子代码文件对应的类列表、函数列表和变量列表构建与每个子代码文件对应的局部符号表。
类、函数、变量查找和链接:
在得到C++代码文件对应的全局符号表,以及C++代码文件中每个子代码文件对应的词法单元序列表和局部符号表后,终端可以通过上下文敏感的符号查找算法对词法单元序列表中的类、函数及变量等进行查找和链接,以便更新词法单元序列表。采用上下文敏感的符号查找算法,相比简单的字符串匹配,具有更高的准确性,另外,在数据结构设计上,尽可能减少了数据结构大小,充分利用缓存,提高了查找效率。
例如,代码文件中一个词法单元所代表的具体类型是受当前上下文影响的,以如下代码段为例:
由该代码段可知,class B的基类A究竟是指向N1::A还是指向N2::A,实际上,在查找的过程中遇到这种情况时,可以采取的是就近原则,即优先匹配最近的类型,因此,classB的基类A指向N2::A。
请参阅图10,图10为本发明实施例提供的更新词法单元序列表的流程示意图。该方法流程可以包括:
S201、获取当前子代码文件的词法单元序列表中的类型参数,并将类型参数进行层次拆分得到类型限定名和类型名。
终端在通过上下文敏感的符号查找算法更新词法单元序列表的过程中,首先,从C++代码文件中获取子代码文件,作为当前子代码文件,获取当前子代码文件的词法单元序列表,遍历该词法单元序列表获取词法单元序列表中的类、函数及变量等类型参数,并将类型参数进行层次拆分得到类型限定名和类型名,例如,对于类型参数A::B::C,其类型名为C,限定名为A和B。
此时,终端可以将类型参数的类型限定名和类型名依次压入栈S中,例如,对于类型参数A::B::C,可以将A、B、C依次压入栈S中,该类型名C处于栈顶。
S202、判断类型名是否为***类型名;若是,则执行步骤S203;若否,则执行步骤S204。
终端可以取出栈S的栈顶元素,即将栈S中栈顶的类型名取出(不包括类型参数的限定名),然后判断该类型参数的类型名是否是***类型名,该***类型名可以包括代码编译***自带的数据中存储的类型名,例如,main。
S203、返回类型参数指向符号表的指针为空。
当类型参数的类型名是***类型名时,可以不在局部符号表或全局符号表中继续查找该类型名,而是结束查找流程,返回该类型参数指向符号表的指针为空。此时,终端可以根据该类型参数指向符号表的指针为空,对当前子代码文件的词法单元序列表进行更新,即将词法单元序列表中该类型参数的指向符号表的指针设置为空。
S204、从当前子代码文件的局部符号表中查找类型参数的类型名。
S205、判断局部符号表中是否存在类型名;若是,则执行步骤S206;若否,则执行步骤S209。
当类型参数的类型名不是***类型名时,终端可以从当前子代码文件的局部符号表中查找类型参数的类型名,可以进一步判断局部符号表中是否存在类型参数的类型名。
需要说明的是,终端可以从类型参数所在局部符号表中的预设范围内查找,当查找不到时,再依次扩大范围进行查找,直至查找完局部符号表中的所有范围。
S206、将词法单元序列表中限定名与局部符号表中类型名对应的限定名进行匹配。
S207、判断是否匹配;若是,则执行步骤S208;若否,则执行步骤S209。
当局部符号表中存在类型参数的类型名时,终端可以将栈S中栈顶的限定名取出,然后将词法单元序列表中类型参数的限定名与局部符号表中类型参数的限定名进行匹配,判断词法单元序列表中类型参数的限定名与局部符号表中类型参数的限定名是否匹配成功。
需要说明的是,当类型参数包括多个限定名时,可以对多个限定名进行一一匹配,直至完成所有限定名匹配成功,则说明词法单元序列表中类型参数的限定名与局部符号表中类型参数的限定名是否匹配成功。
S208、将词法单元序列表中的类型参数与局部符号表中的类型参数进行链接。
若词法单元序列表中类型参数的限定名与局部符号表中类型参数的限定名匹配成功,则终端可以将词法单元序列表中的类型参数与局部符号表中类型参数进行链接,例如指针链接,例如,可以将词法单元序列表中的类型参数指向符号表的指针,设置为指向局部符号表中的类型参数,得到更新后的词法单元序列表。
S209、从全局符号表中查找类型参数的类型名。
S210、判断全局符号表中是否存在类型名;若是,则执行步骤S211;若否,则执行步骤S203。
当局部符号表中不存在类型参数的类型名时,可以从全局符号表中查找类型参数的类型名,判断全局符号表中是否存在类型参数的类型名。
需要说明的是,终端可以从类型参数所在全局符号表中的预设范围内查找,当查找不到时,再依次扩大范围进行查找,直至查找完全局符号表中的所有范围。
S211、将词法单元序列表中限定名与全局符号表中类型名对应的限定名进行匹配。
S212、判断是否匹配;若是,则执行步骤S213;若否,则执行步骤S203。
当全局符号表中存在类型参数的类型名时,终端可以将栈S中栈顶的限定名取出,并将词法单元序列表中类型参数的限定名与全局符号表中类型参数的限定名进行匹配,判断词法单元序列表中类型参数的限定名与全局符号表中类型参数的限定名是否匹配成功。
需要说明的是,当类型参数包括多个限定名时,可以对多个限定名进行一一匹配,直至完成所有限定名匹配成功,则说明词法单元序列表中类型参数的限定名与全局符号表中类型参数的限定名是否匹配成功。
S213、将词法单元序列表中的类型参数与全局符号表中的类型参数进行链接。
若词法单元序列表中类型参数的限定名与全局符号表中类型参数的限定名匹配成功,则将词法单元序列表中的类型参数与全局符号表中的类型参数进行链接,例如指针链接,例如,可以将词法单元序列表中的类型参数指向符号表的指针,设置为指向全局符号表中的类型参数,得到更新后的词法单元序列表。
需要说明的是,当词法单元序列表中包括多个类型参数时,可以一一进行遍历,直至完成所有类型参数的查找和链接。
代码检查项扫描:
在更新子代码文件的词法单元序列表后,终端可以根据全局符号表、子代码文件的局部符号表、及更新后的词法单元序列表,确定子代码文件的检测结果。例如,终端可以基于构建好的全局符号表和符号链接结果,针对各错误代码场景进行代码扫描,即遍历更新后的词法单元序列表,查找更新后的词法单元序列表中的类、函数及变量等,根据查找到的类、函数或变量等,调用类、函数或变量所在的局部符号表及全局符号表,从局部符号表或全局符号表中存储的关键特征中提取出子代码文件的检测结果。
输出检测结果:
在得到各个子代码文件的检测结果后,终端可以按照一定格式输出代码错误信息,具体输出格式可以根据实际需要进行灵活设置,具体内容在此处不作限定。
本发明实施例可以根据全局符号表、局部符号表及词法单元序列表对代码文件进行静态代码检测(即不需要编译代码),充分考虑了代码文件缺失、类型定义缺失和语法错误等情况,可以为静态代码检测提供准确及高效的全局符号表及局部符号表等符号化结果,使得代码检测具备语法层面、跨函数扫描、语义层面以及一定程度的逻辑分析能力;不仅提高了代码检测结果的准确性及高效性,而且可以发现代码中可能存在的缺陷、性能和安全性等潜在问题,最终输出的代码检测结果能够帮助开发人员快速定位代码中隐藏的问题,以便开发人员高效及低成本对代码进行修复,降低了后期的修复成本,以及可以提升代码质量。
为便于更好的实施本发明实施例提供的代码检测方法,本发明实施例还提供一种基于上述代码检测方法的装置。其中名词的含义与上述代码检测方法中相同,具体实现细节可以参考方法实施例中的说明。
请参阅图11,图11为本发明实施例提供的代码检测装置的结构示意图,其中该代码检测装置可以包括第一获取单元301、构建单元302、第二获取单元303、更新单元304及确定单元305等。
其中,第一获取单元301,用于获取待检测的代码文件。
该代码可以是开发人员利用开发工具所支持的语言编写出来的源文件,可以是一组由字符、符号或信号码元等以离散形式表示信息的明确的规则体系。该代码可以是C++语言、C语言、或Java语言等编写出来的源文件,还可以是其他语言编写出来的源文件,具体内容在此处不作限定。
第一获取单元301首先获取待检测的代码文件,该待检测的代码文件可以是一个软件项目的代码文件,可以包括一个或多个子代码文件。
在某些实施方式中,如图14所示,第一获取单元301可以包括提取子单元3011及过滤子单元3012等,具体可以如下:
提取子单元3011,用于获取代码文件,并根据代码规则从代码文件中提取出无效代码内容;
过滤子单元3012,用于将无效代码内容进行过滤,得到待检测的代码文件。
具体地,提取子单元3011可以获取代码文件,例如,可以从本地预先存储的代码库中获取代码文件,该代码文件可以是代码检测装置预先通过代码编程开发工具生成;或者是,可以向服务器发送代码文件获取请求,并接收服务器基于代码文件获取请求返回的代码文件,该代码文件可以是代码检测装置或者其他终端上传至服务器,由服务器存储该代码文件。可以理解的是,代码文件的获取方式还可以其他获取方式,具体内容在此处不作限定。
在得到代码文件后,提取子单元3011可以对代码文件进行预处理,以过滤掉后续处理不需要的内容,例如,可以过滤与有效代码无关的部分,为后续的词法分析提供规范的字符流。该预处理可以包括根据代码规则从代码文件中提取出无效代码内容,其中,当代码文件是利用C++语言编写的源文件时,该代码规则可以是关于C++语言的编写规则;当代码文件是利用C语言编写的源文件时,该代码规则可以是关于C语言的编写规则;当代码文件是利用Java语言编写的源文件时,该代码规则可以是关于Java语言的编写规则等。该无效代码内容可以包括注释内容或预处理指令等,还可以包括其他内容,具体内容在此处不作限定。
在得到无效代码内容后,过滤子单元3012可以将无效代码内容进行过滤,即将无效代码内容从代码文件中删除,得到待检测的代码文件。当代码文件中包括多个子代码文件时,可以遍历多个子代码文件,从每个子代码文件中提取出无效代码内容,并将无效代码内容进行过滤。
可选地,提取子单元3011具体可以用于:
根据代码规则从代码文件中提取出多余字符;
根据代码规则中的注释标识从代码文件中提取出注释内容;
根据代码规则中的预处理标识从代码文件中提取出预处理指令;
将多余字符、注释内容及预处理指令设置为无效代码内容。
具体地,提取子单元3011可以根据代码规则从代码文件中提取出多余字符,该多余字符可以包括多余空格、多余空格分号或多余括号等。例如,当代码文件是利用C++语言编写的源文件时,可以根据关于C++语言的代码规则,从代码文件中提取出三行多余空格。又例如,当代码文件是利用Java语言编写的源文件时,可以根据关于Java语言的代码规则,从代码文件中存在的连续六个空格中提取出其中的五个多余空格;等等。
提取子单元3011可以根据代码规则中的注释标识从代码文件中提取出注释内容,其中,注释标识可以是双斜杠“//”,或者是“/*”和“*/”等。例如,当代码文件是利用C++语言编写的源文件时,可以根据关于C++语言的代码规则,从代码文件中查找注释标识“//”,并根据注释标识“//”从代码文件中“//”所在行提取出注释内容,该注释内容包括“//”及其后面的内容。
又例如,当代码文件是利用C++语言编写的源文件时,可以根据关于C++语言的代码规则,从代码文件中查找起始的注释标识“/*”,以及从代码文件中查找终止的注释标识“*/”,并根据起始的注释标识“/*”和终止的注释标识“*/”提取出“/*”与“*/”之间(包括/*和*/)的注释内容。
提取子单元3011可以根据代码规则中的预处理标识从代码文件中提取出预处理指令,该预处理标识可以包括“#”等,该预处理指令可以包括#define、#if、及#pragma等。例如,当代码文件是利用C++语言编写的源文件时,可以根据关于C++语言的代码规则,从代码文件中查找预处理标识“#”,并根据预处理标识“#”从代码文件中“#”所在行提取出预处理指令,该预处理指令包括“#”及其后面的内容。
在得到多余字符、注释内容、及预处理指令后,提取子单元3011可以将多余字符、注释内容及预处理指令设置为无效代码内容,实现了根据代码规则从代码文件中提取出无效代码内容。
构建单元302,用于构建待检测的代码文件对应的全局符号表。
在得到待检测的代码文件后,构建单元302可以构建待检测的代码文件对应的全局符号表,其中,全局符号表可以包括待检测的代码文件中每个子代码文件包含的类及其相关信息、函数及其相关信息、变量及其相关信息等符号的数据结构。
在某些实施方式中,如图12所示,构建单元302可以包括第一获取子单元3021、第一构建子单元3022及第二构建子单元3023等,具体可以如下:
第一获取子单元3021,用于获取与待检测的代码文件中每个子代码文件对应的词法单元序列表,得到词法单元序列表集;
第一构建子单元3022,用于根据词法单元序列表集中每个词法单元序列表,构建与待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集;
第二构建子单元3023,用于根据局部符号表集构建全局符号表。
具体地,第一获取子单元3021可以先获取与待检测的代码文件中每个子代码文件对应的词法单元序列表,得到词法单元序列表集,例如,可以通过词法分析获取每个子代码文件对应的词法单元序列表。其中,词法单元序列表中可以包括多个词法单元(可以称为词素,也可以称为Token),例如,if或for等均为一个词法单元,一个子代码文件经过词法分析后可以生成的所有词法单元的集合,即为该子代码文件的词法单元序列表(可以称为TokenList),子代码文件中一段代码可以对应得到一个词法单元段(即一个Token段,也可以称为TokenSection),包括一个或者多个Token组成的序列。
需要说明的是,为了提高词法单元序列表的获取效率,第一获取子单元3021可以调用多个线程,并通过各个线程并行获取各个子代码文件的词法单元序列表,从而可以快速获取到多个词法单元序列表。当然,第一获取子单元3021可以串行获取词法单元序列表,具体内容在此处不作限定。
在某些实施方式中,第一获取子单元3021可以包括分析模块、处理模块及获取模块等,具体可以如下:
分析模块,用于对待检测的代码文件中每个子代码文件进行词法分析,得到每个子代码文件对应的词法单元序列表;
处理模块,用于根据每个子代码文件对应的词法单元序列表,对待检测的代码文件中每个子代码文件进行标准化处理,得到每个标准子代码文件组成的标准代码文件集;
获取模块,用于获取标准代码文件集中每个标准子代码文件对应的词法单元序列表,得到词法单元序列表集。
具体地,在获取词法单元序列表集的过程中,首先,分析模块可以对待检测的代码文件中每个子代码文件进行词法分析,得到每个子代码文件对应的词法单元序列表,各个子代码文件对应的词法单元序列表可以组成词法单元序列表集,该词法单元序列表集中可以包括一个或多个子代码文件对应的词法单元序列表。
其中,词法分析可以是将子代码文件中的字符序列转换为词法单元序列的过程,该词法分析的主要用于读入预处理输出的字符流,将该字符流组成词素,生成并输出一个词法单元序列,每个词法单元对应一个词素,整个词法单元序列即为词法单元序列表,词法单元序列表是后续处理和上层检查项遍历代码的基本数据结构。
例如,对某个代码段:for(int index=0;index<42;++index)进行词法分析,可以得到“for”、“(”、“int”、“index”、“=”、“0”、“;”、“index”、“<”、“42”、“;”、“++”、“index”、及“)”等14个词法单元组成的词法单元序列。
在某些实施方式中,分析模块可以包括第一获取子模块及第二获取子模块等,具体可以如下:
第一获取子模块,用于获取待检测的代码文件中每个子代码文件内每个词法单元的字符串值;
第二获取子模块,用于获取与每个词法单元相关联的属性信息;
生成子模块,用于根据每个词法单元的字符串值及属性信息生成双向链表,得到每个子代码文件对应的词法单元序列表组成的词法单元序列表集。
在获取词法单元序列表的过程中,第一获取子模块可以获取待检测的代码文件中每个子代码文件内每个词法单元的字符串值,例如,对于词法单元“for”是由“f”、“o”、“r”等三个字符串值组成的,对于词法单元“int”是由“i”、“n”、“t”等三个字符串值组成的。
词法单元序列表是进行代码检测最基本的单位,除了包括词法单元的字符串值以外,还可以包括与词法单元相关联的属性信息,因此,第二获取子模块可以获取与每个词法单元相关联的属性信息,其中,该属性信息可以包括指向下一个词法单元的指针、指向上一个词法单元的指针、词法单元的类型、及词法单元的行号等。
在得到子代码文件中每个词法单元的字符串值及属性信息后,生成子模块可以根据每个词法单元的字符串值及属性信息生成双向链表,得到每个子代码文件对应的词法单元序列表,各个子代码文件对应的词法单元序列表可以组成词法单元序列表集。词法单元序列表本质上是一个双向链表,维护词法单元序列表中所有的词法单元。
例如,如图3所示,某段代码:“if(i>0)”的词法单元序列表可以表示为图3所示的双向链表,其中,箭头可以表示指向当前词法单元的下一个词法单元的指针,例如,指向词法单元“i”的下一个词法单元“>”的指针;或者箭头可以表示指向当前词法单元的上一个词法单元的指针,例如,指向词法单元“(”的上一个词法单元“if”的指针;或者箭头可以表示当前词法单元指向与其配对的词法单元的指针,例如,词法单元“(”指向与其配对的词法单元“)”的指针;等等。
可选地,第二获取子模块具体可以用于:获取每个词法单元在待检测的代码文件中每个子代码文件内指向各类信息的指针,得到指针信息;获取每个词法单元的特征信息;将指针信息及每个词法单元的特征信息设置为与每个词法单元相关联的属性信息。
具体地,第二获取子模块可以获取每个词法单元在待检测的代码文件中每个子代码文件内指向各类信息的指针,其中,各类信息可以包括当前的词法单元的下一个词法单元、与当前的词法单元配对的词法单元、及词法单元的数据流结构等。
例如,可以获取指向当前词法单元的下一个词法单元的指针、指向当前词法单元的上一个词法单元的指针、指向与当前词法单元配对的词法单元的指针(例如,对于左括号来说,即指向右括号的指针)、指向词法单元的符号表的指针(例如,对于变量指向的是全局符号表或局部符号表中的变量对象,对于函数指向的是全局符号表或局部符号表中的函数对象等)、词法单元的语法树结构指针(可以用于维护词法单元的抽象语法树结构)、及词法单元的数据流结构指针等,这些均为指针信息。
此时,第二获取子模块还需要获取每个词法单元的特征信息,其中,特征信息可以包括词法单元所在代码文件中的行号、及词法单元的类型等,词法单元的类型可以包括数字、字符串、变量、函数、及关键字等类型,例如,“1”和“2”等可以为数字类型,“main”可以为函数类型,“index”和“i”等可以为变量类型,等等。这些指针信息及词法单元的特征信息即为与词法单元相关联的属性信息。
在某些实施方式中,处理模块具体可以用于:根据每个子代码文件对应的词法单元序列表及代码标准逻辑格式,获取标准的代码格式;从待检测的代码文件中每个子代码文件内查找与代码格式不匹配的目标代码格式;根据代码格式对目标代码格式进行修改,得到每个标准子代码文件组成的标准代码文件集。
由于不同项目代码可能是由不同的开发人员编写的,对于不同开发人员的代码风格可能是不同的,客观上形成了代码多样性的现状,因此,为了提高构建全局符号表的效率,以及提高代码检测的准确性,在获取到词法单元序列表后,可以对代码文件进行标准化处理,例如,可以通过一些简化步骤来统一代码风格,以实现标准化及规范化。其中,该标准化处理的过程中,对于所有简化步骤都不能改变代码逻辑,而只是进行逻辑上的等价替换。
具体地,在得到每个子代码文件对应的词法单元序列表后,处理模块可以根据每个子代码文件对应的词法单元序列表,以及代码标准逻辑格式,获取标准的代码格式,例如,一个函数实现的逻辑格式可以是以左大括号为起始,并以右大括号结束。其中,当代码文件是利用C++语言编写的源文件时,该代码标准逻辑格式可以是关于C++语言的逻辑格式;当代码文件是利用Java语言编写的源文件时,该代码标准逻辑格式可以是关于Java语言的逻辑格式。
然后,处理模块从待检测的代码文件中每个子代码文件内查找与标准的代码格式不匹配的目标代码格式,根据标准的代码格式对目标代码格式进行修改,得到每个标准子代码文件,例如,可以利用标准的代码格式替换目标代码格式,各个标准子代码文件可以组成标准代码文件集。从而实现对代码文件进行等价的代码逻辑替换,以规范代码格式。
例如,以规范化条件表达式为例,在进行标准化处理之前,对于某个子代码文件中的条件表达式省略了大括号的语句,具体子代码文件可以如下:
处理模块根据子代码文件对应的词法单元序列表可以分析出条件表达式if(i>0)所在的位置,以及根据代码标准逻辑格式确定标准的代码格式为条件表达式后面需要设置大括号,此时,可以从子代码文件中查找与代码格式不匹配的目标代码格式:条件表达式if(i>0)后面没有设置大括号,然后可以根据代码格式对目标代码格式进行修改,即在条件表达式if(i>0)后面添加大括号,实现对子代码文件进行标准化处理,得到标准子代码文件,具体可以如下:
在得到标准代码文件集后,获取模块可以获取标准代码文件集中每个标准子代码文件对应的词法单元序列表,例如,可以将添加的字符(例如大括号)***标准化处理之前子代码文件对应的词法单元序列表,得到标准子代码文件对应的词法单元序列表;或者是,可以将删除的字符从标准化处理之前子代码文件对应的词法单元序列表中删除,得到标准子代码文件对应的词法单元序列表;各个标准子代码文件对应的词法单元序列表可以组成词法单元序列表集。
在上述得到词法单元序列表集后,第一构建子单元3022可以根据词法单元序列表集中每个词法单元序列表,构建与待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集。例如,可以遍历词法单元序列表,从词法单元序列表提取出子代码文件对应的类、函数和变量等信息,以及与类、函数和变量等相关的关键特性等信息,根据这些信息可以构建类列表、函数列表和变量列表等,可以根据每个子代码文件对应的类列表、函数列表和变量列表构建与每个子代码文件对应的局部符号表,各个子代码文件对应的局部符号表可以组成局部符号表集。
在某些实施方式中,第一构建子单元3022可以包括第一构建模块及第二构建模块等,具体可以如下:
第一构建模块,用于根据词法单元序列表集中每个词法单元序列表,构建与待检测的代码文件中每个子代码文件对应的抽象语法树;
第二构建模块,用于根据抽象语法树构建与待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集。
具体地,第一构建模块可以根据词法单元序列表集中每个词法单元序列表,构建与待检测的代码文件中每个子代码文件对应的抽象语法树(Abstract Syntax Tree,AST)。其中,抽象语法树可以是代码的抽象语法结构的树状表现形式,抽象语法树可以是一个二叉树,每一个非叶子节点代表一个运算符,运算符所在非叶子节点的两个子节点分别代表该运算符的两个运算分量。抽象语法树结构包含了表达式的逻辑结构和运算符的优先级关系,这个特性能够提高代码场景匹配的准确性以及实现该代码场景的效率。
需要说明的是,本发明实施例中的抽象语法树,不会建立代码表达式之间的逻辑关系,例如,不会建立if-else语句段中if语句和else语句之间的逻辑关系,而只针对单个代码表达式中建立抽象语法结构,并不建立表达式和表达式之间的结构关系。由于如果建立表达式和表达式之间的结构关系,则一旦输入的代码文件存在语法错误,那么构建出来的全局抽象语法树结构将会是错误,且没有参考意义的,因此本发明支持不完整的或者不能通过编译的代码文件作为输入,并且构建单表达式的抽象语法树结构,如果某个表达式出现错误,那也只是局部的抽象语法树结构出现错误,而不会影响其他表达式的抽象语法树结构。
例如,如下一段代码:
String::Format("demo:%d%s%d",Func(1,2),"AST",1+2*3);
对于该段代码最终构建出来的抽象语法树的结构,可以如图4所示,包括了参数1:"demo:%d%s%d"、参数2:Func(1,2)、参数3:"AST"、及参数4:1+2*3等,例如,非叶子节点“*”代表一个运算符,该运算符所在非叶子节点的两个子节点“2”和“3”分别代表该运算符的两个运算分量,即2*3;运算符“+”对应的两个子节点为“1”和“*”,可以得到1+2*3。
在得到抽象语法树后,第二构建模块可以根据抽象语法树构建与待检测的代码文件中每个子代码文件对应的局部符号表,各个子代码文件对应的局部符号表可以组成局部符号表集。
在某些实施方式中,第二构建模块具体可以用于:根据抽象语法树获取待检测的代码文件中每个子代码文件对应的类列表、函数列表和变量列表;根据每个子代码文件对应的类列表、函数列表和变量列表构建与每个子代码文件对应的局部符号表,得到局部符号表集。
具体地,第二构建模块可以根据抽象语法树中树状结构快速提取出子代码文件对应的类、函数和变量等信息,以及与类、函数和变量等相关的关键特性等信息,根据这些信息可以构建待检测的代码文件中每个子代码文件对应的类列表、函数列表和变量列表等,可以根据每个子代码文件对应的类列表、函数列表和变量列表构建与每个子代码文件对应的局部符号表,各个子代码文件对应的局部符号表可以组成局部符号表集。其中,局部符号表也可以称为SymbolDatabase,该局部符号表可以是子代码文件对应的符号化结果对象。
例如,在C++语言编写的源文件中,在获取到每一个.cpp文件(包含对应展开的.h文件)对应的词法单元序列表后,可以根据该词法单元序列表构建一个对应的局部符号表,其中,每一个局部符号表可以包含以下三种类型的数据:(1)类型列表(也可以称为TypeList),可以用于记录代码文件中所有的类型,例如,class、struct或namespace等类型,该类型列表中可以包括各个类型名称、以及各个类型对应的关键特征等;(2)函数列表(也可以称为Function List),可以用于记录代码文件中所有的函数,该函数列表中可以包括各个函数名称、以及各个函数对应的关键特征(例如,函数的返回值等)等;(3)变量列表(也可以称为Variable List),可以用于记录代码文件中所有的变量,该变量列表中可以包括各个变量名称、以及各个变量对应的关键特征等。
以下将进行举例说明,例如,demo.cpp代码文件中可以包括demo1.cpp、demo.h及demo2.cpp等子代码文件,demo1.cpp子代码文件中的代码内容可以如下所示:
demo1.cpp子代码文件中可以包括demo.h子代码文件,demo.h子代码文件中的代码内容可以如下所示:
在扫描检测demo1.cpp子代码文件时,可以得到有类似如下的局部符号表:
由demo1.cpp子代码文件的局部符号表可知,demo1.cpp子代码文件中存在符号缺失:CDemo2::Func的定义没有找到,而实际上,CDemo2::Func的定义在demo2.cpp子代码文件中,该demo2.cpp子代码文件中的代码内容可以如下所示:
在扫描检测demo2.cpp子代码文件时,可以得到有类似如下的局部符号表:
由demo2.cpp子代码文件的局部符号表可知,demo2.cpp子代码文件的局部符号表相比demo1.cpp子代码文件的局部符号表较为简单,其中最重要的信息就是CDemo2::Func函数的定义,这个在demo1.cpp子代码文件对应的局部符号表中是缺失的,这个也是单独获取各个子代码文件所出现的比较重要的问题,这时候跨文件符号查找能力是缺失的。
因此,在得到各个子代码文件对应的局部符号表所组成的局部符号表集后,第二构建模块可以根据局部符号表集构建全局符号表,从而可以在全局符号表中查找到某个子代码文件中缺失的类、函数或变量等符号(即类型参数),实现跨文件符号查找能力。
在某些实施方式中,第二构建子单元3023具体用于:
将局部符号表集中每个局部符号表进行合并,得到合并后的符号表;
将合并后的符号表中相同的符号参数保留其中一个,并对相同的符号参数中的其他参数进行删除,得到全局符号表。
具体地,第二构建子单元3023可以将局部符号表集中每个局部符号表进行合并,得到合并后的符号表,由于合并后的符号表中可能会存在相同的符号参数,该符号参数可以包括类、函数及变量等,因此可以将合并后的符号表中相同的符号参数保留其中一个,并对相同的符号参数中的其他参数进行删除,得到全局符号表。或者是,当合并后的符号表中存在两个相同的符号参数时,其中一个符号参数未定义,而另一个符号参数定义时,在合并的过程中可以保留已定义的符号参数,而删除未定义的符号参数。
例如,对于demo1.cpp子代码文件和demo2.cpp子代码文件分别构造了局部符号表,但是在demo1.cpp子代码文件中CDemo2::Func函数的定义是缺失的,该函数的定义是在demo2.cpp子代码文件的局部符号表中。因此,为了很好地解决符号缺失的问题,可以根据各个局部符号表构建全局符号表,构建全局符号表的关键是,解决类、函数和变量等符号的查找和符号冲突时的合并逻辑。
例如,为了形象地说明全局符号表的构建,以符号结构树的形式进行说明,demo1.cpp子代码文件的局部符号表对应的符号结构树可以如图5所示,由图5可知,demo1.cpp子代码文件的局部符号表中可以包括CObject、CDemo1、CDemo2等类,以及包括Func函数及global_var1变量等,其中,CDemo1类中定义有Func,而CDemo2类中Func定义缺失。
demo2.cpp子代码文件的局部符号表对应的符号结构树可以如图6所示,由图6可知,demo1.cpp子代码文件的局部符号表中可以包括CObject和CDemo2等类、及global_var2变量等,其中,CDemo2类中定义有Func。
根据demo1.cpp子代码文件的局部符号表,以及demo2.cpp子代码文件的局部符号表,构建得到的全局符号表可以如图7所示,由图7可知,全局符号表中可以包括CObject、CDemo1、及CDemo2等类,以及包括Func函数,还包括global_var1和global_var2等变量,其中,CDemo1及CDemo2类中均定义有Func。即将demo1.cpp子代码文件和demo2.cpp子代码文件的符号结构树进行合并后,demo2.cpp子代码文件中的CDemo2::Func函数的定义,以及global_var2变量合并到了demo1.cpp子代码文件的符号结构树中。
第二获取单元303,用于获取待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表。
为了方便对代码进行检测,第二获取单元303需要获取待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表。
在某些实施方式中,第二获取单元303具体可以用于:
当存储有词法单元序列表集和局部符号表集时,从词法单元序列表集中获取待检测的代码文件中每个子代码文件对应的词法单元序列表;
从局部符号表集中获取待检测的代码文件中每个子代码文件对应的局部符号表。
具体地,在上述获取全局符号表的过程中,由于需要获取与待检测的代码文件中每个子代码文件对应的词法单元序列表,以及与待检测的代码文件中每个子代码文件对应的局部符号表等,因此,代码检测装置在上述获取到词法单元序列表集和局部符号表集后,可以将词法单元序列表集和局部符号表集存储至本地硬盘中;或者,将词法单元序列表集和局部符号表集上传至服务器,由服务器对词法单元序列表集和局部符号表集进行存储;等等。
此时,第二获取单元303在获取每个子代码文件对应的词法单元序列表及局部符号表的过程中,可以判断本地硬盘或服务器等是否存储有词法单元序列表集,当存储有词法单元序列表集时,可以直接从词法单元序列表集中获取待检测的代码文件中每个子代码文件对应的词法单元序列表。以及,判断本地硬盘或服务器等是否存储有局部符号表集,当存储有局部符号表集时,可以直接从局部符号表集中获取待检测的代码文件中每个子代码文件对应的局部符号表。
在某些实施方式中,第二获取单元303具体可以用于:
当未存储词法单元序列表集和局部符号表集时,对待检测的代码文件中每个子代码文件进行词法分析,得到每个子代码文件对应的词法单元序列表;根据词法单元序列表,构建与每个子代码文件对应的抽象语法树;根据抽象语法树构建与每个子代码文件对应的局部符号表。
代码检测装置在上述获取全局符号表的过程中,可以不存储获取到的词法单元序列表集和局部符号表集等,此时,第二获取单元303在获取每个子代码文件对应的词法单元序列表及局部符号表的过程中,可以判断本地硬盘或服务器等是否存储有词法单元序列表集,当未存储有词法单元序列表集时,代码检测装置需要重新获取每个子代码文件对应的词法单元序列表和局部符号表。
具体地,第二获取单元303可以对待检测的代码文件中每个子代码文件进行词法分析,得到每个子代码文件对应的词法单元序列表。例如,可以获取待检测的代码文件中每个子代码文件内每个词法单元的字符串值,以及获取与每个词法单元相关联的属性信息;根据每个词法单元的字符串值及属性信息生成双向链表,得到每个子代码文件对应的词法单元序列表。
第二获取单元303还可以根据每个子代码文件对应的词法单元序列表,对待检测的代码文件中每个子代码文件进行标准化处理,得到每个标准子代码文件。例如,可以根据每个子代码文件对应的词法单元序列表及代码标准逻辑格式,获取标准的代码格式;从待检测的代码文件中每个子代码文件内查找与代码格式不匹配的目标代码格式;根据代码格式对目标代码格式进行修改,得到每个子代码文件对应的标准子代码文件。
然后,第二获取单元303获取每个标准子代码文件对应的词法单元序列表,最终将每个标准子代码文件对应的词法单元序列表设置为每个子代码文件对应的词法单元序列表。此时,可以根据词法单元序列表,构建与每个子代码文件对应的抽象语法树,以及根据抽象语法树构建与每个子代码文件对应的局部符号表。例如,可以根据抽象语法树获取待检测的代码文件中每个子代码文件对应的类列表、函数列表和变量列表,并根据每个子代码文件对应的类列表、函数列表和变量列表构建与每个子代码文件对应的局部符号表。
更新单元304,用于根据局部符号表和全局符号表,对词法单元序列表进行更新,得到更新后的词法单元序列表。
确定单元305,用于根据局部符号表、全局符号表及更新后的词法单元序列表,确定待检测的代码文件的检测结果。
在得到全局符号表,以及待检测的代码文件中每个子代码文件对应的局部符号表和词法单元序列表,更新单元304可以根据局部符号表和全局符号表,对词法单元序列表进行更新,得到更新后的词法单元序列表。例如,更新单元304可以遍历词法单元序列表,对词法单元序列表中的类、函数及变量进行查找和链接,基于上述构建好的全局符号表,使用上下文敏感的符号查找算法,实现跨文件或跨模块的符号查找能力,达到获取更准确的代码检测结果。
其中,类、函数及变量等符号的查找和链接的作用在于是将遍历词法单元序列表中的类、函数及变量等与其所在局部符号表或全局符号表的进行关联,以便在遍历词法单元序列表时,能够获知类、函数或变量等的相关信息,从而能够显著提高代码检查项扫描的效率。
在某些实施方式中,如图13所示,更新单元304可以包括第二获取子单元3041、第三获取子单元3042、及更新子单元3043等,具体可以如下:
第二获取子单元3041,用于从待检测的代码文件中获取子代码文件,作为当前子代码文件;
第三获取子单元3042,用于获取当前子代码文件对应的词法单元序列表及局部符号表;
更新子单元3043,用于根据局部符号表和全局符号表,对当前子代码文件对应的词法单元序列表进行更新,得到更新后的词法单元序列表;
确定单元305具体可以用于:根据局部符号表、全局符号表及更新后的词法单元序列表,确定当前子代码文件的检测结果;触发第二获取子单元执行从待检测的代码文件中获取子代码文件,作为当前子代码文件的操作,直至待检测的代码文件中的子代码文件检测完毕,得到待检测的代码文件的检测结果。
更新单元304可以通过上下文敏感的符号查找算法对词法单元序列表进行更新,通过该上下文敏感的符号查找算法可以遍历待检测的代码文件中各个子代码文件词法单元序列表,获取词法单元序列表中的类、函数及变量等类型参数,将类型参数与局部符号表或全局符号表中的类型参数进行指针链接,以更新词法单元序列表。从而使得基于上述获取到的全局符号表,实现了上下文敏感的符号查找算法,是对代码检测结果正确性的一个重要的保障。
具体地,第二获取子单元3041可以从待检测的代码文件中获取子代码文件,作为当前子代码文件,然后,第三获取子单元3042从词法单元序列表集中获取当前子代码文件对应的词法单元序列表,以及,从局部符号表集中获取当前子代码文件对应的局部符号表;或者是,第三获取子单元3042对当前子代码文件进行词法分析,得到当前子代码文件对应的词法单元序列表,以及根据当前子代码文件的词法单元序列表构建与当前子代码文件对应的局部符号表等。
在得到当前子代码文件的词法单元序列表和局部符号表后,更新子单元3043可以根据局部符号表和全局符号表,对当前子代码文件对应的词法单元序列表进行更新,得到更新后的词法单元序列表。
在某些实施方式中,更新子单元3043具体可以用于:
获取词法单元序列表中的类型参数,类型参数包括类型参数的类型名和类型参数的限定名;
当类型参数的类型名不是***类型名时,且局部符号表中不存在类型参数的类型名时,从全局符号表中查找类型参数的类型名;
当全局符号表中存在类型参数的类型名时,将词法单元序列表中类型参数的限定名与全局符号表中类型参数的限定名进行匹配;
若匹配成功,则将词法单元序列表中的类型参数与全局符号表中的类型参数进行指针链接,得到更新后的词法单元序列表。
具体地,更新子单元3043可以遍历当前子代码文件的词法单元序列表,获取当前子代码文件的词法单元序列表中的类型参数,该类型参数可以包括一个或多个,其中,该类型参数可以包括类、函数及变量等,该类型参数可以包括类型参数的类型名和类型参数的限定名,该限定名可以包括一个或多个。例如,对于类型参数A::B::C,其类型名为C,限定名为A::B。
在得到类型参数后,更新子单元3043可以从类型参数中提取出类型参数的类型名,然后判断该类型参数的类型名是否是***类型名,该***类型名可以包括代码编译***自带的数据中存储的类型名,例如,main。当类型参数的类型名是***类型名时,可以不在局部符号表或全局符号表中继续查找该类型名,而是结束查找流程,返回该类型参数指向符号表的指针为空。
当类型参数的类型名不是***类型名时,更新子单元3043可以进一步判断局部符号表中是否存在类型参数的类型名,当局部符号表中不存在类型参数的类型名时,可以从全局符号表中查找类型参数的类型名,判断全局符号表中是否存在类型参数的类型名。当全局符号表中存在类型参数的类型名时,将词法单元序列表中类型参数的限定名与全局符号表中类型参数的限定名进行匹配,判断词法单元序列表中类型参数的限定名与全局符号表中类型参数的限定名是否匹配成功。若词法单元序列表中类型参数的限定名与全局符号表中类型参数的限定名匹配成功,则将词法单元序列表中的类型参数与全局符号表中的类型参数进行指针链接,例如,可以将词法单元序列表中的类型参数指向符号表的指针,设置为指向全局符号表中的类型参数,得到更新后的词法单元序列表。
在某些实施方式中,更新子单元3043还具体可以用于:
当类型参数的类型名不是***类型名时,且局部符号表中存在类型参数的类型名时,将词法单元序列表中类型参数的限定名与局部符号表中类型参数的限定名进行匹配;
若匹配成功,则将词法单元序列表中的类型参数与局部符号表中类型参数进行指针链接,得到更新后的词法单元序列表。
当类型参数的类型名不是***类型名时,更新子单元3043可以进一步判断局部符号表中是否存在类型参数的类型名,当局部符号表中存在类型参数的类型名时,将词法单元序列表中类型参数的限定名与局部符号表中类型参数的限定名进行匹配,判断词法单元序列表中类型参数的限定名与局部符号表中类型参数的限定名是否匹配成功。若词法单元序列表中类型参数的限定名与局部符号表中类型参数的限定名匹配成功,则将词法单元序列表中的类型参数与局部符号表中类型参数进行指针链接,例如,可以将词法单元序列表中的类型参数指向符号表的指针,设置为指向局部符号表中的类型参数,得到更新后的词法单元序列表。
在更新当前子代码文件的词法单元序列表后,确定单元305可以根据全局符号表、当前子代码文件的局部符号表、及更新后的词法单元序列表,确定当前子代码文件的检测结果。例如,可以进行代码检查项扫描,基于构建好的全局符号表和符号链接结果,针对各错误代码场景进行代码扫描,即遍历更新后的词法单元序列表,查找更新后的词法单元序列表中的类、函数及变量等,根据查找到的类、函数或变量等,调用类、函数或变量所在的局部符号表及全局符号表,从局部符号表或全局符号表中存储的关键特征中提取出当前子代码文件的检测结果。代码检测装置还可以按照一定格式输出代码错误信息,具体输出格式可以根据实际需要进行灵活设置,具体内容在此处不作限定。
以下将进行举例说明,例如,如图8所示,以上述demo1.cpp子代码文件和demo2.cpp子代码文件为例,基于全局符号表以及类、函数、及变量的查找和关联,可以发现单个局部符号表中不能发现的问题,在检测结果中,demo1.cpp子代码文件中的demo.Func函数调用正确关联到demo2.cpp子代码文件中的CDemo2::Func函数,基于全局符号表,可以获知type等于1时,返回值为空指针NULL这个关键特征,因此可以输出demo1.cpp子代码文件中第19行空指针p解引用报错。
在完成对当前子代码文件的词法单元序列表进行更新,及确定当前子代码文件的检测结果后,可以继续从待检测的代码文件中获取另一个子代码文件,作为当前子代码文件,即返回执行从待检测的代码文件中获取子代码文件,作为当前子代码文件的步骤,直至待检测的代码文件中的子代码文件检测完毕,得到待检测的代码文件的检测结果。
由上可知,本发明实施例可以通过第一获取单元301获取待检测的代码文件,并由构建单元302构建与待检测的代码文件对应的全局符号表,该全局符号表可以包括待检测的代码文件的全局信息,以及第二获取单元303获取待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表,该局部符号表可以包括子代码文件的局部信息;然后更新单元304根据局部符号表和全局符号表,对词法单元序列表进行更新,得到更新后的词法单元序列表;确定单元305根据局部符号表、全局符号表及更新后的词法单元序列表,确定待检测的代码文件的检测结果。该方案由于可以通过全局符号表和局部符号表对词法单元序列表进行更新,并根据更新后的词法单元序列表,以及局部符号表和全局符号表得到整个待检测的代码文件的全局检测结果,实现了对待检测的代码文件的全局检测,而不仅仅局限于单独对子代码文件进行局部检测,因此,提高了代码检测的准确性。
相应的,本发明实施例还提供一种终端,该终端可以是测试终端,如图15所示,该终端可以包括射频(RF,Radio Frequency)电路601、包括有一个或一个以上计算机可读存储介质的存储器602、输入单元603、显示单元604、传感器605、音频电路606、无线保真(WiFi,Wireless Fidelity)模块607、包括有一个或者一个以上处理核心的处理器608、以及电源609等部件。本领域技术人员可以理解,图15中示出的终端结构并不构成对终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:
RF电路601可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,交由一个或者一个以上处理器608处理;另外,将涉及上行的数据发送给基站。通常,RF电路601包括但不限于天线、至少一个放大器、调谐器、一个或多个振荡器、用户身份模块(SIM,Subscriber Identity Module)卡、收发信机、耦合器、低噪声放大器(LNA,Low Noise Amplifier)、双工器等。此外,RF电路601还可以通过无线通信与网络和其他设备通信。所述无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯***(GSM,Global System of Mobile communication)、通用分组无线服务(GPRS,GeneralPacket Radio Service)、码分多址(CDMA,Code Division Multiple Access)、宽带码分多址(WCDMA,Wideband Code Division Multiple Access)、长期演进(LTE,Long TermEvolution)、电子邮件、短消息服务(SMS,Short Messaging Service)等。
存储器602可用于存储软件程序以及模块,处理器608通过运行存储在存储器602的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器602可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作***、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据终端的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器602可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器602还可以包括存储器控制器,以提供处理器608和输入单元603对存储器602的访问。
输入单元603可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。具体地,在一个具体的实施例中,输入单元603可包括触敏表面以及其他输入设备。触敏表面,也称为触摸显示屏或者触控板,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触敏表面上或在触敏表面附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触敏表面可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器608,并能接收处理器608发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触敏表面。除了触敏表面,输入单元603还可以包括其他输入设备。具体地,其他输入设备可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
显示单元604可用于显示由用户输入的信息或提供给用户的信息以及终端的各种图形用户接口,这些图形用户接口可以由图形、文本、图标、视频和其任意组合来构成。显示单元604可包括显示面板,可选的,可以采用液晶显示器(LCD,Liquid Crystal Display)、有机发光二极管(OLED,Organic Light-Emitting Diode)等形式来配置显示面板。进一步的,触敏表面可覆盖显示面板,当触敏表面检测到在其上或附近的触摸操作后,传送给处理器608以确定触摸事件的类型,随后处理器608根据触摸事件的类型在显示面板上提供相应的视觉输出。虽然在图15中,触敏表面与显示面板是作为两个独立的部件来实现输入和输入功能,但是在某些实施例中,可将触敏表面与显示面板集成而实现输入和输出功能。
终端还可包括至少一种传感器605,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板的亮度,接近传感器可在终端移动到耳边时,关闭显示面板和/或背光。作为运动传感器的一种,重力加速度传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别终端姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于终端还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
音频电路606、扬声器,传声器可提供用户与终端之间的音频接口。音频电路606可将接收到的音频数据转换后的电信号,传输到扬声器,由扬声器转换为声音信号输出;另一方面,传声器将收集的声音信号转换为电信号,由音频电路606接收后转换为音频数据,再将音频数据输出处理器608处理后,经RF电路601以发送给比如另一终端,或者将音频数据输出至存储器602以便进一步处理。音频电路606还可能包括耳塞插孔,以提供外设耳机与终端的通信。
WiFi属于短距离无线传输技术,终端通过WiFi模块607可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图15示出了WiFi模块607,但是可以理解的是,其并不属于终端的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
处理器608是终端的控制中心,利用各种接口和线路连接整个终端的各个部分,通过运行或执行存储在存储器602内的软件程序和/或模块,以及调用存储在存储器602内的数据,执行终端的各种功能和处理数据,从而对终端进行整体监控。可选的,处理器608可包括一个或多个处理核心;优选的,处理器608可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作***、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器608中。
终端还包括给各个部件供电的电源609(比如电池),优选的,电源可以通过电源管理***与处理器608逻辑相连,从而通过电源管理***实现管理充电、放电、以及功耗管理等功能。电源609还可以包括一个或一个以上的直流或交流电源、再充电***、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
尽管未示出,终端还可以包括摄像头、蓝牙模块等,在此不再赘述。具体在本实施例中,终端中的处理器608会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器602中,并由处理器608来运行存储在存储器602中的应用程序,从而实现各种功能:
获取待检测的代码文件;构建待检测的代码文件对应的全局符号表;获取待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表;根据局部符号表和全局符号表,对词法单元序列表进行更新,得到更新后的词法单元序列表;根据局部符号表、全局符号表及更新后的词法单元序列表,确定待检测的代码文件的检测结果。
可选地,构建待检测的代码文件对应的全局符号表的步骤可以包括:获取与待检测的代码文件中每个子代码文件对应的词法单元序列表,得到词法单元序列表集;根据词法单元序列表集中每个词法单元序列表,构建与待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集;根据局部符号表集构建全局符号表。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见上文针对代码检测方法的详细描述,此处不再赘述。
由上可知,本发明实施例可以通过全局符号表和局部符号表对词法单元序列表进行更新,并根据更新后的词法单元序列表,以及局部符号表和全局符号表得到整个待检测的代码文件的全局检测结果,实现了对待检测的代码文件的全局检测,而不仅仅局限于单独对子代码文件进行局部检测,因此,提高了代码检测的准确性。
本领域普通技术人员可以理解,上述实施例的各种方法中的全部或部分步骤可以通过指令来完成,或通过指令控制相关的硬件来完成,该指令可以存储于一计算机可读存储介质中,并由处理器进行加载和执行。
为此,本发明实施例提供一种存储介质,其中存储有多条指令,该指令能够被处理器进行加载,以执行本发明实施例所提供的任一种代码检测方法中的步骤。例如,该指令可以执行如下步骤:
获取待检测的代码文件;构建待检测的代码文件对应的全局符号表;获取待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表;根据局部符号表和全局符号表,对词法单元序列表进行更新,得到更新后的词法单元序列表;根据局部符号表、全局符号表及更新后的词法单元序列表,确定待检测的代码文件的检测结果。
可选地,构建待检测的代码文件对应的全局符号表的步骤可以包括:获取与待检测的代码文件中每个子代码文件对应的词法单元序列表,得到词法单元序列表集;根据词法单元序列表集中每个词法单元序列表,构建与待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集;根据局部符号表集构建全局符号表。
以上各个操作的具体实施可参见前面的实施例,在此不再赘述。
其中,该存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取记忆体(RAM,Random Access Memory)、磁盘或光盘等。
由于该存储介质中所存储的指令,可以执行本发明实施例所提供的任一种代码检测方法中的步骤,因此,可以实现本发明实施例所提供的任一种代码检测方法所能实现的有益效果,详见前面的实施例,在此不再赘述。
以上对本发明实施例所提供的一种代码检测方法、装置、存储介质及测试终端进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

Claims (23)

1.一种代码检测方法,其特征在于,包括:
获取待检测的代码文件;
构建所述待检测的代码文件对应的全局符号表;
获取所述待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表;
根据所述局部符号表和所述全局符号表,对所述词法单元序列表进行更新,得到更新后的词法单元序列表;
根据所述局部符号表、所述全局符号表及所述更新后的词法单元序列表,确定所述待检测的代码文件的检测结果。
2.根据权利要求1所述的代码检测方法,其特征在于,所述构建所述待检测的代码文件对应的全局符号表的步骤包括:
获取与所述待检测的代码文件中每个子代码文件对应的词法单元序列表,得到词法单元序列表集;
根据所述词法单元序列表集中每个词法单元序列表,构建与所述待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集;
根据所述局部符号表集构建全局符号表。
3.根据权利要求2所述的代码检测方法,其特征在于,所述获取与所述待检测的代码文件中每个子代码文件对应的词法单元序列表,得到词法单元序列表集的步骤包括:
对所述待检测的代码文件中每个子代码文件进行词法分析,得到每个子代码文件对应的词法单元序列表;
根据每个子代码文件对应的词法单元序列表,对所述待检测的代码文件中每个子代码文件进行标准化处理,得到每个标准子代码文件组成的标准代码文件集;
获取所述标准代码文件集中每个标准子代码文件对应的词法单元序列表,得到词法单元序列表集。
4.根据权利要求3所述的代码检测方法,其特征在于,所述根据每个子代码文件对应的词法单元序列表,对所述待检测的代码文件中每个子代码文件进行标准化处理,得到每个标准子代码文件组成的标准代码文件集的步骤包括:
根据每个子代码文件对应的词法单元序列表及代码标准逻辑格式,获取标准的代码格式;
从所述待检测的代码文件中每个子代码文件内查找与所述代码格式不匹配的目标代码格式;
根据所述代码格式对所述目标代码格式进行修改,得到每个标准子代码文件组成的标准代码文件集。
5.根据权利要求3所述的代码检测方法,其特征在于,所述对所述待检测的代码文件中每个子代码文件进行词法分析,得到每个子代码文件对应的词法单元序列表的步骤包括:
获取待检测的代码文件中每个子代码文件内每个词法单元的字符串值;
获取与所述每个词法单元相关联的属性信息;
根据每个词法单元的字符串值及属性信息生成双向链表,得到每个子代码文件对应的词法单元序列表组成的词法单元序列表集。
6.根据权利要求5所述的代码检测方法,其特征在于,所述获取与所述每个词法单元相关联的属性信息的步骤包括:
获取所述每个词法单元在所述待检测的代码文件中每个子代码文件内指向各类信息的指针,得到指针信息;
获取所述每个词法单元的特征信息;
将所述指针信息及每个词法单元的特征信息设置为与所述每个词法单元相关联的属性信息。
7.根据权利要求2所述的代码检测方法,其特征在于,所述根据所述词法单元序列表集中每个词法单元序列表,构建与所述待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集的步骤包括:
根据所述词法单元序列表集中每个词法单元序列表,构建与所述待检测的代码文件中每个子代码文件对应的抽象语法树;
根据所述抽象语法树构建与所述待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集。
8.根据权利要求7所述的代码检测方法,其特征在于,所述根据所述抽象语法树构建与所述待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集的步骤包括:
根据所述抽象语法树获取所述待检测的代码文件中每个子代码文件对应的类列表、函数列表和变量列表;
根据每个子代码文件对应的类列表、函数列表和变量列表构建与所述每个子代码文件对应的局部符号表,得到局部符号表集。
9.根据权利要求2所述的代码检测方法,其特征在于,所述根据所述局部符号表集构建全局符号表的步骤包括:
将所述局部符号表集中每个局部符号表进行合并,得到合并后的符号表;
将所述合并后的符号表中相同的符号参数保留其中一个,并对相同的符号参数中的其他参数进行删除,得到全局符号表。
10.根据权利要求2所述的代码检测方法,其特征在于,所述获取所述待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表的步骤包括:
当存储有所述词法单元序列表集和局部符号表集时,从所述词法单元序列表集中获取所述待检测的代码文件中每个子代码文件对应的词法单元序列表;
从所述局部符号表集中获取所述待检测的代码文件中每个子代码文件对应的局部符号表。
11.根据权利要求2所述的代码检测方法,其特征在于,所述获取所述待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表的步骤包括:
当未存储所述词法单元序列表集和局部符号表集时,对所述待检测的代码文件中每个子代码文件进行词法分析,得到每个子代码文件对应的词法单元序列表;
根据所述词法单元序列表,构建与所述每个子代码文件对应的抽象语法树;
根据所述抽象语法树构建与所述每个子代码文件对应的局部符号表。
12.根据权利要求1至11任一项所述的代码检测方法,其特征在于,所述根据所述局部符号表和所述全局符号表,对所述词法单元序列表进行更新,得到更新后的词法单元序列表,根据所述局部符号表、所述全局符号表及所述更新后的词法单元序列表,确定所述待检测的代码文件的检测结果的步骤包括:
从所述待检测的代码文件中获取子代码文件,作为当前子代码文件;
获取所述当前子代码文件对应的词法单元序列表及局部符号表;
根据所述局部符号表和所述全局符号表,对所述当前子代码文件对应的词法单元序列表进行更新,得到更新后的词法单元序列表;
根据所述局部符号表、所述全局符号表及所述更新后的词法单元序列表,确定所述当前子代码文件的检测结果;
返回执行从所述待检测的代码文件中获取子代码文件,作为当前子代码文件的步骤,直至所述待检测的代码文件中的子代码文件检测完毕,得到所述待检测的代码文件的检测结果。
13.根据权利要求12所述的代码检测方法,其特征在于,所述根据所述局部符号表和所述全局符号表,对所述词法单元序列表进行更新,得到更新后的词法单元序列表的步骤包括:
获取所述词法单元序列表中的类型参数,所述类型参数包括类型参数的类型名和类型参数的限定名;
当所述类型参数的类型名不是***类型名时,且所述局部符号表中不存在所述类型参数的类型名时,从所述全局符号表中查找所述类型参数的类型名;
当所述全局符号表中存在所述类型参数的类型名时,将所述词法单元序列表中类型参数的限定名与所述全局符号表中类型参数的限定名进行匹配;
若匹配成功,则将所述词法单元序列表中的类型参数与所述全局符号表中的类型参数进行指针链接,得到更新后的词法单元序列表。
14.根据权利要求13所述的代码检测方法,其特征在于,所述获取所述词法单元序列表中的类型参数的步骤之后,所述方法还包括:
当所述类型参数的类型名不是***类型名时,且所述局部符号表中存在所述类型参数的类型名时,将所述词法单元序列表中类型参数的限定名与所述局部符号表中类型参数的限定名进行匹配;
若匹配成功,则将所述词法单元序列表中的类型参数与所述局部符号表中类型参数进行指针链接,得到更新后的词法单元序列表。
15.根据权利要求1至11任一项所述的代码检测方法,其特征在于,所述获取待检测的代码文件的步骤包括:
获取代码文件,并根据代码规则从所述代码文件中提取出无效代码内容;
将所述无效代码内容进行过滤,得到待检测的代码文件。
16.根据权利要求15所述的代码检测方法,其特征在于,所述根据代码规则从所述代码文件中提取出无效代码内容的步骤包括:
根据代码规则从所述代码文件中提取出多余字符;
根据代码规则中的注释标识从所述代码文件中提取出注释内容;
根据代码规则中的预处理标识从所述代码文件中提取出预处理指令;
将所述多余字符、注释内容及预处理指令设置为无效代码内容。
17.一种代码检测装置,其特征在于,包括:
第一获取单元,用于获取待检测的代码文件;
构建单元,用于构建所述待检测的代码文件对应的全局符号表;
第二获取单元,用于获取所述待检测的代码文件中每个子代码文件对应的词法单元序列表及局部符号表;
更新单元,用于根据所述局部符号表和所述全局符号表,对所述词法单元序列表进行更新,得到更新后的词法单元序列表;
确定单元,用于根据所述局部符号表、所述全局符号表及所述更新后的词法单元序列表,确定所述待检测的代码文件的检测结果。
18.根据权利要求17所述的代码检测装置,其特征在于,所述构建单元包括:
第一获取子单元,用于获取与所述待检测的代码文件中每个子代码文件对应的词法单元序列表,得到词法单元序列表集;
第一构建子单元,用于根据所述词法单元序列表集中每个词法单元序列表,构建与所述待检测的代码文件中每个子代码文件对应的局部符号表,得到局部符号表集;
第二构建子单元,用于根据所述局部符号表集构建全局符号表。
19.根据权利要求18所述的代码检测装置,其特征在于,所述第一获取子单元包括:
分析模块,用于对所述待检测的代码文件中每个子代码文件进行词法分析,得到每个子代码文件对应的词法单元序列表;
处理模块,用于根据每个子代码文件对应的词法单元序列表,对所述待检测的代码文件中每个子代码文件进行标准化处理,得到每个标准子代码文件组成的标准代码文件集;
获取模块,用于获取所述标准代码文件集中每个标准子代码文件对应的词法单元序列表,得到词法单元序列表集。
20.根据权利要求17至19任一项所述的代码检测装置,其特征在于,所述更新单元包括:
第二获取子单元,用于从所述待检测的代码文件中获取子代码文件,作为当前子代码文件;
第三获取子单元,用于获取所述当前子代码文件对应的词法单元序列表及局部符号表;
更新子单元,用于根据所述局部符号表和所述全局符号表,对所述当前子代码文件对应的词法单元序列表进行更新,得到更新后的词法单元序列表;
所述确定单元具体用于:根据所述局部符号表、所述全局符号表及所述更新后的词法单元序列表,确定所述当前子代码文件的检测结果;触发所述第二获取子单元执行从所述待检测的代码文件中获取子代码文件,作为当前子代码文件的操作,直至所述待检测的代码文件中的子代码文件检测完毕,得到所述待检测的代码文件的检测结果。
21.根据权利要求20所述的代码检测装置,其特征在于,所述更新子单元具体用于:
获取所述词法单元序列表中的类型参数,所述类型参数包括类型参数的类型名和类型参数的限定名;
当所述类型参数的类型名不是***类型名时,且所述局部符号表中存在所述类型参数的类型名时,将所述词法单元序列表中类型参数的限定名与所述局部符号表中类型参数的限定名进行匹配;若匹配成功,则将所述词法单元序列表中的类型参数与所述局部符号表中类型参数进行指针链接,得到更新后的词法单元序列表;
当所述类型参数的类型名不是***类型名时,且所述局部符号表中不存在所述类型参数的类型名时,从所述全局符号表中查找所述类型参数的类型名;
当所述全局符号表中存在所述类型参数的类型名时,将所述词法单元序列表中类型参数的限定名与所述全局符号表中类型参数的限定名进行匹配;
若匹配成功,则将所述词法单元序列表中的类型参数与所述全局符号表中的类型参数进行指针链接,得到更新后的词法单元序列表。
22.一种存储介质,其特征在于,所述存储介质存储有多条指令,所述指令适于处理器进行加载,以执行权利要求1至16任一项所述的代码检测方法中的步骤。
23.一种测试终端,其特征在于,所述测试终端包括:至少一个存储器和至少一个处理器;所述存储器存储有程序,所述处理器调用所述程序,以执行权利要求1-16任一项所述的代码检测方法中的步骤。
CN201810321498.XA 2018-04-11 2018-04-11 一种代码检测方法、装置、存储介质及测试终端 Active CN108549538B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810321498.XA CN108549538B (zh) 2018-04-11 2018-04-11 一种代码检测方法、装置、存储介质及测试终端

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810321498.XA CN108549538B (zh) 2018-04-11 2018-04-11 一种代码检测方法、装置、存储介质及测试终端

Publications (2)

Publication Number Publication Date
CN108549538A true CN108549538A (zh) 2018-09-18
CN108549538B CN108549538B (zh) 2021-03-02

Family

ID=63514479

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810321498.XA Active CN108549538B (zh) 2018-04-11 2018-04-11 一种代码检测方法、装置、存储介质及测试终端

Country Status (1)

Country Link
CN (1) CN108549538B (zh)

Cited By (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109582575A (zh) * 2018-11-27 2019-04-05 网易(杭州)网络有限公司 游戏测试方法及装置
CN110297639A (zh) * 2019-07-01 2019-10-01 北京百度网讯科技有限公司 用于检测代码的方法和装置
CN110309050A (zh) * 2019-05-22 2019-10-08 深圳壹账通智能科技有限公司 代码规范性的检测方法、装置、服务器及存储介质
CN110489127A (zh) * 2019-08-12 2019-11-22 腾讯科技(深圳)有限公司 错误代码确定方法、装置、计算机可读存储介质及设备
CN110489973A (zh) * 2019-08-06 2019-11-22 广州大学 一种基于Fuzz的智能合约漏洞检测方法、装置和存储介质
CN110879709A (zh) * 2019-11-29 2020-03-13 五八有限公司 无用代码的检测方法、装置、终端设备及存储介质
CN111651198A (zh) * 2020-04-20 2020-09-11 北京大学 代码摘要自动化生成方法及装置
CN112276263A (zh) * 2020-10-14 2021-01-29 宁波市博虹机械制造开发有限公司 基于g代码的电火花成型机专用运动控制方法
CN112651213A (zh) * 2020-12-25 2021-04-13 军工保密资格审查认证中心 数控程序的安全审查方法及装置
CN113946347A (zh) * 2021-09-29 2022-01-18 北京五八信息技术有限公司 函数调用的检测方法、装置、电子设备及可读介质
CN117149663A (zh) * 2023-10-30 2023-12-01 合肥中科类脑智能技术有限公司 多目标检测算法的部署方法、装置、电子设备和介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH03255533A (ja) * 1990-03-06 1991-11-14 Fujitsu Ltd プログラミング言語処理システムにおけるシンボル管理方式
CN103780263A (zh) * 2012-10-22 2014-05-07 株式会社特博睿 数据压缩装置、数据压缩方法及记录介质
CN105930267A (zh) * 2016-04-15 2016-09-07 中国工商银行股份有限公司 一种基于数据库字典的存储过程静态检测方法及***
CN106227668A (zh) * 2016-07-29 2016-12-14 腾讯科技(深圳)有限公司 数据处理方法和装置

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH03255533A (ja) * 1990-03-06 1991-11-14 Fujitsu Ltd プログラミング言語処理システムにおけるシンボル管理方式
CN103780263A (zh) * 2012-10-22 2014-05-07 株式会社特博睿 数据压缩装置、数据压缩方法及记录介质
CN105930267A (zh) * 2016-04-15 2016-09-07 中国工商银行股份有限公司 一种基于数据库字典的存储过程静态检测方法及***
CN106227668A (zh) * 2016-07-29 2016-12-14 腾讯科技(深圳)有限公司 数据处理方法和装置

Cited By (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109582575B (zh) * 2018-11-27 2022-03-22 网易(杭州)网络有限公司 游戏测试方法及装置
CN109582575A (zh) * 2018-11-27 2019-04-05 网易(杭州)网络有限公司 游戏测试方法及装置
CN110309050A (zh) * 2019-05-22 2019-10-08 深圳壹账通智能科技有限公司 代码规范性的检测方法、装置、服务器及存储介质
CN110297639A (zh) * 2019-07-01 2019-10-01 北京百度网讯科技有限公司 用于检测代码的方法和装置
CN110297639B (zh) * 2019-07-01 2023-03-21 北京百度网讯科技有限公司 用于检测代码的方法和装置
CN110489973A (zh) * 2019-08-06 2019-11-22 广州大学 一种基于Fuzz的智能合约漏洞检测方法、装置和存储介质
CN110489127A (zh) * 2019-08-12 2019-11-22 腾讯科技(深圳)有限公司 错误代码确定方法、装置、计算机可读存储介质及设备
CN110489127B (zh) * 2019-08-12 2023-10-13 腾讯科技(深圳)有限公司 错误代码确定方法、装置、计算机可读存储介质及设备
CN110879709A (zh) * 2019-11-29 2020-03-13 五八有限公司 无用代码的检测方法、装置、终端设备及存储介质
CN111651198A (zh) * 2020-04-20 2020-09-11 北京大学 代码摘要自动化生成方法及装置
CN111651198B (zh) * 2020-04-20 2021-04-13 北京大学 代码摘要自动化生成方法及装置
CN112276263A (zh) * 2020-10-14 2021-01-29 宁波市博虹机械制造开发有限公司 基于g代码的电火花成型机专用运动控制方法
CN112651213A (zh) * 2020-12-25 2021-04-13 军工保密资格审查认证中心 数控程序的安全审查方法及装置
CN113946347A (zh) * 2021-09-29 2022-01-18 北京五八信息技术有限公司 函数调用的检测方法、装置、电子设备及可读介质
CN117149663A (zh) * 2023-10-30 2023-12-01 合肥中科类脑智能技术有限公司 多目标检测算法的部署方法、装置、电子设备和介质
CN117149663B (zh) * 2023-10-30 2024-02-02 合肥中科类脑智能技术有限公司 多目标检测算法的部署方法、装置、电子设备和介质

Also Published As

Publication number Publication date
CN108549538B (zh) 2021-03-02

Similar Documents

Publication Publication Date Title
CN108549538A (zh) 一种代码检测方法、装置、存储介质及测试终端
US10324909B2 (en) Omega names: name generation and derivation utilizing nested three or more attributes
CN106227774B (zh) 信息搜索方法及装置
CN108763887A (zh) 数据库操作请求验证方法、装置、服务器及存储介质
WO2014193869A1 (en) Deeply parallel source code compilation
US9483508B1 (en) Omega names: name generation and derivation
US20160306736A1 (en) Translation verification testing
US9311077B2 (en) Identification of code changes using language syntax and changeset data
CN110058850A (zh) 一种应用的开发方法、装置以及存储介质
US11243750B2 (en) Code completion with machine learning
CN112860265A (zh) 一种源代码数据库操作异常检测方法及装置
CN110188366A (zh) 一种信息处理方法、装置及存储介质
CN111949328B (zh) 一种启动加速方法、装置、计算机设备及存储介质
CN108763222A (zh) 一种漏译检测、翻译方法及装置、服务器及存储介质
WO2017167118A1 (zh) 编译计算机语言的方法和装置
CN107729015A (zh) 一种确定工程代码中的无用函数的方法和装置
CN113821496B (zh) 数据库迁移方法、***、设备及计算机可读存储介质
CN107741901A (zh) 一种关联数据库语句的测试方法和装置
CN107818100B (zh) 一种sql语句执行方法及装置
CN109635175A (zh) 页面数据拼接方法、装置、可读存储介质和电子设备
CN105808212A (zh) 产品支持工具的扩展方法和***
EP4075320A1 (en) A method and device for improving the efficiency of pattern recognition in natural language
CN112069198B (zh) Sql解析优化方法和装置
US11360764B2 (en) Adversarial language analysis for code scanning
CN107220349B (zh) 数据库发布时间的预测方法和***

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
GR01 Patent grant
GR01 Patent grant