数据处理方法和装置转让专利

申请号 : CN201610613852.7

文献号 : CN106227668B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 邹越严明张蓓黄斌袁明凯魏学峰

申请人 : 腾讯科技(深圳)有限公司

摘要 :

本发明公开了一种数据处理方法和装置。其中,该数据处理方法包括:获取代码文件,其中,代码文件为包括字符序列的源程序文本;对代码文件中的字符序列进行词法分析,得到词法单元序列;解析代码文件,得到预设对象;对词法单元序列和预设对象进行关联以建立全局符号表,其中,全局符号表用于记录代码文件中的所有预设对象的数据信息;以及根据全局符号表对代码文件执行静态代码扫描,得到扫描结果,其中,扫描结果至少包括对词法单元序列的类型的查找结果。本发明解决了相关技术中代码扫描的准确性低的技术问题。

权利要求 :

1.一种数据处理方法,其特征在于,包括:

获取代码文件,其中,所述代码文件为包括字符序列的源程序文本;

对所述代码文件中的字符序列进行词法分析,得到词法单元序列;

解析所述代码文件,得到预设对象,其中,所述预设对象为与所述代码文件相对应的具有类型的对象;

对所述词法单元序列和所述预设对象进行关联以建立全局符号表,其中,所述全局符号表用于记录所述代码文件中的所有所述预设对象的数据信息;以及根据所述全局符号表对所述代码文件执行静态代码扫描,得到扫描结果,其中,所述扫描结果至少包括对所述词法单元序列的类型的查找结果;

其中,所述预设对象包括多个预设对象,对所述词法单元序列和所述预设对象进行关联以建立全局符号表包括:根据所述多个预设对象建立预设全局对象列表,其中,所述预设全局对象列表用于将所述代码文件中的同一类型的不同关键字部分进行关联;获取所述代码文件中的别名指令并对所述代码文件中使用所述别名指令的代码执行处理,得到处理代码;在所述预设全局对象列表中,根据所述处理代码将所述词法单元序列和与所述词法单元序列对应的预设对象执行类型关联或者函数关联,得到所述全局符号表。

2.根据权利要求1所述的方法,其特征在于,

在对所述词法单元序列和所述预设对象进行关联以建立所述全局符号表之前,所述方法还包括:在不改变所述代码文件的逻辑的情况下,对所述词法单元序列进行简化,得到简化词法单元序列,对所述词法单元序列和所述预设对象进行关联以建立所述全局符号表包括:对所述简化词法单元序列和所述预设对象进行关联以建立所述全局符号表。

3.根据权利要求2所述的方法,其特征在于,

在对所述词法单元序列进行简化,得到所述简化词法单元序列之后,所述方法还包括:根据所述简化词法单元序列建立树形语法结构,其中,所述树形语法结构为用于存储具有预设语法的数据对象的树形结构,对所述简化词法单元序列和所述预设对象进行关联以建立所述全局符号表包括:根据所述树形语法结构对所述简化词法单元序列和所述预设对象进行关联以建立所述全局符号表。

4.根据权利要求3所述的方法,其特征在于,根据所述词法单元序列建立所述树形语法结构包括:获取所述词法单元序列中的单个代码表达式;以及

根据所述单个代码表达式建立所述树形语法结构。

5.根据权利要求1所述的方法,其特征在于,根据所述处理代码将所述词法单元序列和与所述词法单元序列对应的预设对象执行类型关联包括以下至少之一:根据所述处理代码将用于类型声明的词法单元序列和与所述词法单元序列对应的预设对象执行关联;

根据所述处理代码将与所述代码文件中的变量对应的词法单元序列和所述变量执行关联。

6.根据权利要求1所述的方法,其特征在于,根据所述处理代码将所述词法单元序列和与所述词法单元序列对应的预设对象执行函数关联至少包括:根据所述处理代码将与预设调用方法对应的词法单元序列和所述预设调用方法执行关联。

7.根据权利要求1所述的方法,其特征在于,根据所述处理代码将所述词法单元序列和与所述词法单元序列对应的预设对象执行类型关联或者函数关联包括:确定所述词法单元序列的类型的类型名并在所述预设全局对象列表中查找所述类型名;

判断查找到的所述类型名是否符合预设条件;以及

如果判断出查找到的所述类型名符合所述预设条件,根据所述处理代码将所述词法单元序列和所述预设对象执行类型关联或者函数关联。

8.根据权利要求7所述的方法,其特征在于,根据所述全局符号表对所述代码文件执行静态代码扫描,得到所述扫描结果包括:拆分包括一个或者多个所述词法单元的词法单元段,得到拆分结果;

将所述拆分结果压入栈中;

根据所述栈中的栈顶元素确定所述词法单元序列的待查找类型名;

判断所述待查找类型名是否为预设类型名;

如果判断出所述待查找类型名不为所述预设类型名,从所述词法单元段所在的基类对象中查找所述待查找类型名;

在从所述词法单元段所在的基类对象中未查找到所述待查找类型名时,从所述全局符号表中查找所述待查找类型名;

在从所述全局符号表中查找到所述待查找类型名时,验证所述待查找类型名的类型限定名,其中,所述类型限定名为用于限定所述待查找类型名的名称;

判断所述类型限定名是否与预设限定名相匹配;以及

如果判断出所述类型限定名与所述预设限定名相匹配,返回所述待查找类型名以作为所述扫描结果。

9.根据权利要求8所述的方法,在从所述词法单元段所在的基类对象中查找所述待查找类型名之后,所述方法还包括:在从所述词法单元段所在的基类对象中查找到所述待查找类型名时,验证所述待查找类型名的类型限定名;

判断所述类型限定名是否与所述预设限定名相匹配;以及

如果判断出所述类型限定名与所述预设限定名相匹配,返回所述待查找类型名以作为所述扫描结果。

10.根据权利要求1所述的方法,其特征在于,

在对所述代码文件中的字符序列进行词法分析,得到所述词法单元序列之前,所述方法还包括:对所述代码文件执行预处理,得到预处理代码,其中,所述预处理代码为符合预设规则的字符流,对所述代码文件中的字符序列进行词法分析,得到所述词法单元序列包括:对所述预处理代码中的字符序列进行词法分析,得到所述词法单元序列。

11.根据权利要求10所述的方法,其特征在于,对所述代码文件执行预处理包括以下至少之一:过滤所述代码文件的空格;

删除所述代码文件的注释;

按照预设配置处理所述代码文件的预处理指令;

对所述代码文件统一编码,输出编码字符流。

12.根据权利要求1所述的方法,其特征在于,对所述代码文件中的字符序列进行词法分析,得到所述词法单元序列包括:读取所述代码文件的字符流;

将所述字符流组成词素;以及

根据所述词素生成所述词法单元序列,其中,所述词法单元序列中的每个词法单元与所述词素一一对应。

13.根据权利要求1所述的方法,其特征在于,在对所述词法单元序列和所述预设对象进行关联以建立所述全局符号表之后,所述方法还包括:根据所述全局符号表建立用于模拟所述代码文件的执行流程的数据流模型。

14.根据权利要求13所述的方法,其特征在于,根据所述全局符号表建立所述数据流模型包括:根据所述全局符号表模拟所述代码文件的执行流程,得到模拟结果;以及根据所述模拟结果建立所述数据流模型。

15.根据权利要求14所述的方法,其特征在于,根据所述全局符号表模拟所述代码文件的执行流程,得到所述模拟结果包括:在根据所述全局符号表对所述代码文件的变量进行比较的情况下,确定并记录所述变量的取值范围。

16.一种数据处理装置,其特征在于,包括:

第一获取单元,用于获取代码文件,其中,所述代码文件为包括字符序列的源程序文本;

分析单元,用于对所述代码文件中的字符序列进行词法分析,得到词法单元序列;

解析单元,用于解析所述代码文件,得到预设对象,其中,所述预设对象为与所述代码文件相对应的具有类型的对象;

关联单元,用于对所述词法单元序列和所述预设对象进行关联以建立全局符号表,其中,所述全局符号表用于记录所述代码文件中的所有所述预设对象的数据信息;以及扫描单元,用于根据所述全局符号表对所述代码文件执行静态代码扫描,得到扫描结果,其中,所述扫描结果至少包括对所述词法单元序列的类型的查找结果;

其中,所述预设对象包括多个预设对象,对所述词法单元序列和所述预设对象进行关联以建立全局符号表包括:根据所述多个预设对象建立预设全局对象列表,其中,所述预设全局对象列表用于将所述代码文件中的同一类型的不同关键字部分进行关联;获取所述代码文件中的别名指令并对所述代码文件中使用所述别名指令的代码执行处理,得到处理代码;在所述预设全局对象列表中,根据所述处理代码将所述词法单元序列和与所述词法单元序列对应的预设对象执行类型关联或者函数关联,得到所述全局符号表。

17.根据权利要求16所述的装置,其特征在于,

所述装置还包括:第二获取单元,用于在对所述词法单元序列和所述预设对象进行关联以建立所述全局符号表之前,在不改变所述代码文件的逻辑的情况下,对所述词法单元序列进行简化,得到简化词法单元序列,所述关联单元用于对所述简化词法单元序列和所述预设对象进行关联以建立所述全局符号表。

说明书 :

数据处理方法和装置

技术领域

[0001] 本发明涉及数据处理领域,具体而言,涉及一种数据处理方法和装置。

背景技术

[0002] 目前,对于生成符号化的数据处理方法没有全局符号化的解决方案,在上层静态代码检查项扫描时,非全局符号化的处理结果不够准确。
[0003] 在传统的编译过程中,抽象语法树(AST)会建立代码表达式之间的逻辑关系,比如,if-else语句段中if语句和else语句的逻辑关系,并不针对单个代码表达式建立抽象语
法结构,需要通过编译的语言代码作为输入,一旦输入的语言代码存在语法错误,那么构建
出来的全局抽象语法树结构将会是错误且没有参考意义的。这样在编译不通过的情况下对
代码进行检测、分析,会影响整体符号化流程和结果。因此,根据抽象语法树进行符号化的
数据处理准确性低,对符号化的代码进行扫描的准确性低,进而使程序员不易发现代码中
存在的缺陷,降低了使用性能和安全性,降低了程序员处理代码的效率,以及提高了修复成
本。
[0004] 目前的数据处理中采用简单的字符串匹配,准确性低,另外在数据结构设计上,数据结构较大,不能充分地利用数据缓存,降低了数据存储的效率。
[0005] 针对相关技术中代码扫描的准确性低的问题,目前尚未提出有效的解决方案。

发明内容

[0006] 本发明实施例提供了一种数据处理方法和装置,以至少解决相关技术中代码扫描的准确性低的技术问题。
[0007] 根据本发明实施例的一个方面,提供了一种数据处理方法。该数据处理方法包括:获取代码文件,其中,代码文件为包括字符序列的源程序文本;对代码文件中的字符序列进
行词法分析,得到词法单元序列;解析代码文件,得到预设对象;对词法单元序列和预设对
象进行关联以建立全局符号表,其中,全局符号表用于记录代码文件中的所有预设对象的
数据信息;以及根据全局符号表对代码文件执行静态代码扫描,得到扫描结果,其中,扫描
结果至少包括对词法单元序列的类型的查找结果。
[0008] 根据本发明实施例的另一方面,还提供了一种数据处理装置。该数据处理装置包括:第一获取单元,用于获取代码文件,其中,代码文件为包括字符序列的源程序文本;分析
单元,用于对代码文件中的字符序列进行词法分析,得到词法单元序列;解析单元,用于解
析代码文件,得到预设对象;关联单元,用于对词法单元序列和预设对象进行关联以建立全
局符号表,其中,全局符号表用于记录代码文件中的所有预设对象的数据信息;以及扫描单
元,用于根据全局符号表对代码文件执行静态代码扫描,得到扫描结果,其中,扫描结果至
少包括对词法单元序列的类型的查找结果。
[0009] 在本发明实施例中,获取代码文件,其中,代码文件为包括字符序列的源程序文本;对代码文件中的字符序列进行词法分析,得到词法单元序列;解析代码文件,得到预设
对象;对词法单元序列和预设对象进行关联以建立全局符号表,其中,全局符号表用于记录
代码文件中的所有预设对象的数据信息;以及根据全局符号表对代码文件执行静态代码扫
描,得到扫描结果,其中,扫描结果至少包括对词法单元序列的类型的查找结果,由于通过
对词法单元序列和预设对象进行关联以建立全局符号表,根据全局符号表对代码文件执行
静态代码扫描,得到扫描结果,达到了对代码文件进行符号化处理的目的,从而实现了提高
代码扫描的准确性的技术效果,进而解决了相关技术中代码扫描的准确性低的技术问题。

附图说明

[0010] 此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
[0011] 图1是根据本发明实施例的一种数据处理方法的计算机终端的硬件结构框图;
[0012] 图2是根据本发明实施例的一种数据处理方法的流程图;
[0013] 图3是根据本发明实施例的一种根据词法单元序列建立树形语法结构的方法的流程图;
[0014] 图4是根据本发明实施例的一种对词法单元序列和预设对象进行关联以建立全局符号表的方法的流程图;
[0015] 图5是根据本发明实施例的一种根据处理代码将词法单元序列和与词法单元序列对应的预设对象执行类型关联或者函数关联的方法的流程图;
[0016] 图6是根据本发明实施例的一种根据全局符号表对代码文件执行静态代码扫描的方法的流程图;
[0017] 图7是根据本发明实施例的另一种根据全局符号表对代码文件执行静态代码扫描的方法的流程图;
[0018] 图8是根据本发明实施例的另一种对代码文件中的字符流进行词法分析的方法的流程图;
[0019] 图9是根据本发明实施例的一种根据全局符号表建立数据流模型的方法的流程图;
[0020] 图10是根据本发明实施例的另一种数据处理方法的流程图;
[0021] 图11是根据本发明实施例的一种对代码文件进行预处理之前的代码示意图;
[0022] 图12是根据本发明实施例对代码文件进行预处理之后的代码示意图;
[0023] 图13是根据本发明实施例的一种对预处理代码进行词法分析,得到词法单元序列的代码示意图;
[0024] 图14是根据本发明实施例的一种词法单元序列的示意图;
[0025] 图15是根据本发明实施例的一种对词法单元序列进行简化的示意图;
[0026] 图16是根据本发明实施例的另一种对词法单元序列进行简化的示意图;
[0027] 图17是根据本发明实施例的一种抽象语法树结构的示意图;
[0028] 图18是根据本发明实施例的一种建立全局符号表的方法的流程图;
[0029] 图19是根据本发明实施例的一种对象的类的示意图;
[0030] 图20是根据本发明实施例的一种全局类型哈希表的示意图;
[0031] 图21是根据本发明实施例的一种对别名指令执行处理的代码示意图;
[0032] 图22是根据本发明实施例的一种词法单元的类型查找的示意图;
[0033] 图23是根据本发明实施例的一种对代码文件执行静态代码扫描的方法的流程图;
[0034] 图24是根据本发明实施例的一种原始代码的示意图;
[0035] 图25是根据本发明实施例的一种符号化输出的调试文件的示意图;
[0036] 图26是根据本发明实施例的一种建立数据流模型的代码示意图;
[0037] 图27是根据本发明实施例的一种数据处理装置的示意图;
[0038] 图28是根据本发明实施例的另一种数据处理装置的示意图;以及
[0039] 图29是根据本发明实施例的一种终端的结构框图。

具体实施方式

[0040] 为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是
本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人
员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范
围。
[0041] 需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用
的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或
描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆
盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于
清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品
或设备固有的其它步骤或单元。
[0042] 实施例1
[0043] 根据本发明实施例,提供了一种数据处理方法的实施例。
[0044] 可选地,在本实施例中,上述数据处理方法可以应用于如图1所示的由服务器102和终端104所构成的硬件环境中。图1是根据本发明实施例的一种数据处理方法的计算机终
端的硬件结构框图。如图1所示,服务器102通过网络与终端104进行连接,上述网络包括但
不限于:广域网、城域网或局域网,终端104并不限定于PC、手机、平板电脑等。本发明实施例
的数据处理方法可以由服务器102来执行,也可以由终端104来执行,还可以是由服务器102
和终端104共同执行。其中,终端104执行本发明实施例的数据处理方法也可以是由安装在
其上的客户端来执行。
[0045] 图2是根据本发明实施例的一种数据处理方法的流程图。如图2所示,该数据处理方法可以包括以下步骤:
[0046] 步骤S202,获取代码文件。
[0047] 在本申请上述步骤S202提供的技术方案中,获取代码文件,其中,代码文件为包括字符序列的源程序文本,可以为C#语言项目的代码文件,该C#语言为微软开发的程序设计语
言,字符序列也即字符流。通过输入代码文件,进而获取该代码文件。
[0048] 步骤S204,对代码文件中的字符序列进行词法分析,得到词法单元序列。
[0049] 在本申请上述步骤S204提供的技术方案中,对代码文件中的字符序列进行词法分析,得到词法单元序列,也即,将代码文件的字符序列转化为单词序列的过程。
[0050] 词法分析是将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析
器一般以函数的形式存在,供语法分析器调用。完成词法分析任务的程序称为词法分析程
序或词法分析器或扫描器。从左至右地对源程序进行扫描,按照语言的词法规则识别各类
单词,并产生相应单词的属性。
[0051] 在获取代码文件之后,读取代码文件的字符序列,将字符序列组成词素,生成并输出一个词法单元序列,其中,词法单元序列为经过词法分析后生成的所有词法单元的集合,
是后续处理和上层检查项遍历代码的基本数据结果,其本质是一个双向链表,维护所有的
词法单元,比如,if、for为词法单元。其中,双向链表也即双链表,是链表的一种,它的每个
数据结点中都有两个指针,分别指向直接后继和直接前驱,因此从双向链表中的任意一个
结点开始,都可以很方便地访问它的前驱结点和后继结点。
[0052] 每个词法单元对应一个词素,包括对应的词素的字符串值,还包括与该词法单元相关联的其它属性,比如,指向下一个词法单元的指针的属性,指向上一个词法单元的指针
的属性,指向配对词法单元的指针的属性,该配对词法单元为与原词法单元相匹配的词法
单元,比如,原词法单元为“(”,则配对词法单元为“)”。与词法单元相关联的属性还包括词
法单元的类型,比如,数字、字符串、变量、函数、关键字等。与词法单元相关联的属性还包括
词法单元指向符号表的指针,也即,变量词法单元指向符号表中的变量对象,函数词法单元
指向与其对应的函数对象。与词法单元相关联的属性还包括词法单元的行号,词法单元的
语法树结构指针,该语法树结构指针为用于维护词法单元的抽象语法树结构。与词法单元
相关联的属性还包括词法单元的数据流结构指针。
[0053] 步骤S206,解析代码文件,得到预设对象。
[0054] 在本申请上述步骤S206提供的技术方案中,解析代码文件,得到预设对象。
[0055] 在获取代码文件之后,对代码文件进行解析,生成与代码文件相对应的类、命名空间、方法字段等预设对象,并建立预设对象之间的包含关系。可选地,代码文件包括多个代
码文件,依次解析所有代码文件,分别生成与代码文件相对应的类、命名空间、方法字段等
预设对象,并建立所有预设对象之间的包含关系。该预设对象可以是所有对象的基类,对应
具有逻辑意义的代码,可以是类、方法、属性等,用于区分方法中的词法单元段对应的基类
对象,也可以是命名空间、枚举、方法、字段、委托、事件、属性、枚举器等。预设对象具有对应
的类型,类型之间的继承关系主要从代码层面的结构是否相似来考虑。
[0056] 步骤S208,对词法单元序列和预设对象进行关联以建立全局符号表。
[0057] 在本申请上述步骤S208提供的技术方案中,对词法单元序列和预设对象进行关联以建立全局符号表,其中,全局符号表用于记录代码文件中的所有预设对象的数据信息,建
立全局符号表的过程也即对代码文件进行符号化的过程。
[0058] 符号化可以是指对于指令、指令地址、常数、变量、寄存器等,在屏幕上均用表义性和可读性很强的符号来显示。符号表是用于语言翻译器的数据结构。在符号表中,程序源代
码中的每个标识符都和它的声明或使用信息绑定在一起,比如其数据类型、作用域以及内
存地址。符号表在编译程序工作的过程中需要不断收集、记录和使用源程序中一些语法符
号的类型和特征等相关信息。这符号表些信息一般以表格形式存储于系统中。如常数表、变
量名表、数组名表、过程名表、标号表等等,统称为符号表。对于符号表组织、构造和管理方
法的好坏会直接影响编译系统的运行效率。
[0059] 在对代码文件中的字符序列进行词法分析,得到词法单元序列以及解析代码文件,得到预设对象之后,需要将代码文件中的同一类型的不同部分的定义关联起来,也即,
将代码文件中的同一类型部分的不同关键字部分链接起来,从而建立全局符号表,该全局
符号表包括键(key)和与键对应的键值(Value),用于记录代码文件中的所有预设对象的数
据信息,记录了代码中所有逻辑对象的格式化信息,可以用于扫描代码文件中的所有代码,
从而提高了代码扫描的准确性。
[0060] 步骤S210,根据全局符号表对代码文件执行静态代码扫描,得到扫描结果。
[0061] 在本申请上述步骤S210提供的技术方案中,根据全局符号表对代码文件执行静态代码扫描,得到扫描结果,其中,扫描结果至少包括对词法单元序列的类型的查找结果。
[0062] 在对词法单元序列和预设对象进行关联以建立全局符号表之后,根据全局符号表对代码文件执行静态代码扫描,静态代码扫描为在软件工程中,程序员在写好源代码之后,
无需经过编译器的编译,无需搭建源代码的运行环境,而直接使用一些扫描工具对源代码
进行扫描,可以节省大量的人力和时间成本,提高开发效率,并且找出源代码中存在的很多
只靠人力无法发现的一些安全漏洞,从而提高了代码扫描的准确性,大大降低了项目中的
安全风险,提高了软件质量。这样为上层静态代码检查项扫描提供了准确、高效的符号化结
果,使得代码中的检查项具备语法层面、跨函数扫描、语义层面以及逻辑分析能力,最终输
出的代码扫描结果能够帮助开发人员、测试人员快速定位代码中隐藏的问题,进而提高了
代码质量,降低后期对代码的修复成本。在充分考虑代码文件缺失、类型定义缺失和语法错
误的情况下,该实施例的代码文件的符号化过程不需要编译输入的代码文件,也不需要代
码文件能够编译通过。
[0063] 可选地,根据全局符号表对代码文件执行静态代码扫描适用于所有的C#语言的项目的静态代码检查。
[0064] 通过上述步骤S202至步骤S210,通过获取代码文件,代码文件为包括字符序列的源程序文本;对代码文件中的字符序列进行词法分析,得到词法单元序列;解析代码文件,
得到预设对象;对词法单元序列和预设对象进行关联以建立全局符号表,全局符号表用于
记录代码文件中的所有预设对象的数据信息;根据全局符号表对代码文件执行静态代码扫
描,得到扫描结果,扫描结果至少包括对词法单元序列的类型的查找结果,可以解决了相关
技术中代码扫描的准确性低的技术问题,进而达到提高代码扫描的准确性的技术效果。
[0065] 作为一种可选的实施例,在对词法单元序列和预设对象进行关联以建立全局符号表之前,在不改变代码文件的逻辑的情况下,对词法单元序列进行简化,得到简化词法单元
序列,对词法单元序列和预设对象进行关联以建立全局符号表包括:对简化词法单元序列
和预设对象进行关联以建立全局符号表。
[0066] 不同项目的代码、不同程序员的代码风格是不同的,从而使代码文件具有多样性,这样不利于全局符号表的建立。在对词法单元序列和预设对象进行关联以建立全局符号表
之前,在不改变代码文件的逻辑的情况下,对词法单元序列进行简化,也即,对词法单元序
列进行逻辑上的等价替换,得到简化词法单元序列。通过简化词法单元序列的步骤统一了
代码文件的风格,从而减小全局符号化的成本,以及提高了上层静态扫描的准确性。在对词
法单元序列进行简化,得到简化词法单元序列之后,对简化词法单元序列和预设对象进行
关联以建立全局符号表。
[0067] 作为一种可选的实施例,在对词法单元序列进行简化,得到简化词法单元序列之后,根据简化词法单元序列建立树形语法结构,其中,树形语法结构为用于存储具有预设语
法的数据对象的树形结构,对简化词法单元序列和预设对象进行关联以建立全局符号表包
括:根据树形语法结构对简化词法单元序列和预设对象进行关联以建立全局符号表。
[0068] 树形语法结构为代码文件的抽象语法结构的树状表现形式,也即,抽象语法树(Abstract Syntax Tree,简称为AST),树形语法结构是一个二叉树,每一个非叶子节点代
表一个运算符,它的两个子节点分别代表该运算符的两个运算分量。树形语法结构包含了
表达式的逻辑结构和运算符的优先级关系,从而提高代码场景匹配的准确性以及实现代码
文件对应的场景的效率。在对词法单元序列进行简化,得到简化词法单元序列之后,根据简
化词法单元序列建立树形语法结构,该树形语法结构为用于存储具有预设语法的数据对象
的树形结构。在根据简化词法单元序列建立树形语法结构之后,根据树形语法结构对简化
词法单元序列和预设对象进行关联以建立全局符号表。
[0069] 作为一种可选的实施例,通过词法单元序列中的单个代码表达式建立树形语法结构。
[0070] 图3是根据本发明实施例的一种根据词法单元序列建立树形语法结构的方法的流程图。如图3所示,该根据词法单元序列建立树形语法结构的方法包括以下步骤:
[0071] 步骤S301,获取词法单元序列中的单个代码表达式。
[0072] 在本申请上述步骤S301提供的技术方案中,根据词法单元序列建立树形语法结构包括:获取词法单元序列中的单个代码表达式。词法单元序列由多个代码表达式组成,在对
词法单元序列进行简化,得到简化词法单元序列之后,获取词法单元序列中的单个代码表
达式。
[0073] 步骤S302,根据单个代码表达式建立树形语法结构。
[0074] 在本申请上述步骤S302提供的技术方案中,根据单个代码表达式建立树形语法结构。传统的树形语法结构在编译过程中包括代码表达式之间的逻辑关系,比如,if-else语
句和else语句的逻辑关系,而该实施例中的树形语法结构与传统编译过程中的树形语法结
构不同,该实施例的树形语法结构只针对单个代码表达式建立树形语法结构,并不建立代
码表达式和代码表达式之间的结构关系。由于该实施例指出不完整的或者不能通过编译的
代码文件,一旦输入的代码文件按存在语法错误,那么构建出来的树形语法结构将会是错
误的并且是没有意义的,而构建的单个表达式的树形语法结构,如果出现错误,也只是整个
代码文件的局部出现错误,并不影响代码文件中的其它代码表达式的树形语法结构,从而
提高了树形语法结构在构建过程中的可靠性。
[0075] 该实施例通过获取词法单元序列中的单个代码表达式;根据单个代码表达式建立树形语法结构,从而达到了对树形语法结构的建立的目的,提高了树形语法结构在构建过
程中的可靠性。
[0076] 作为一种可选的实施例,预设对象包括多个预设对象,在步骤S210中,对词法单元序列和预设对象进行关联以建立全局符号表通过根据多个预设对象建立预设全局对象列
表,获取代码文件中的别名指令并对代码文件中使用别名指令的代码执行处理,得到处理
代码;在预设全局对象列表中,根据处理代码将词法单元序列和与词法单元序列对应的预
设对象执行关联以得到全局符号表。
[0077] 图4是根据本发明实施例的一种对词法单元序列和预设对象进行关联以建立全局符号表的方法的流程图。如图4所示,该对词法单元序列和预设对象进行关联以建立全局符
号表的方法包括以下步骤:
[0078] 步骤S401,根据多个预设对象建立预设全局对象列表。
[0079] 在本申请上述步骤S401提供的技术方案中,根据多个预设对象建立预设全局对象列表,该多个预设对象可以为代码文件对应的类、命名空间、方法字段等对象,其中,预设全
局对象列表用于将代码文件中的同一类型的不同关键字部分进行关联,也即,预设对象列
表用于将代码文件中的同一类型的不同部分的定义关联起来。
[0080] 代码文件包括多个代码文件,解析所有代码文件,生成与代码文件对应的类、命名空间、方法字段等多个预设对象,并建立多个预设对象相应的包含关系。可选地,每个代码
文件对应一个预设对象列表,该预设对象列表可以包括Scope对象、CType对象、CSI对象、
CNamespace对象、CNum枚举对象、CFunction对象、CField对象、CDelegate对象、CEvent对
象、CProperty对象、CIndexer对象、CSymbolFile对象。合并所有代码文件的CSymbolFile对
象等,其中,Scope对象为所有对象的基类,对应具有逻辑意义的代码,CType对象为类、方
法、属性等,用于区分方法中的词法单元段对应的基类对象,CSI对象对应C#语言中的类
Class、结构Struct、接口Interface,CNamespace对象为命名空间,CNum枚举对象为枚举,
CFunction对象为方法,CField对象为字段,CDelegate对象为委托,CEvent对象为事件、
CProperty对象为属性、CIndexer对象为枚举器,CSymbolFile对象对应物理上的代码文件,
一个代码文件对应一个CSymbolFile对象。合并所有的预设对象,通过键和键值建立全局对
象列表,比如,合并所少有的CSymbolFile对象,以CSI对象的全限定名作为键。以对应的CSI
对象的键值作为键值,建立全局类型哈希表,该哈希表为根据关键码值(Key Value)直接进
行访问的数据结构。
[0081] 步骤S402,获取代码文件中的别名指令并对代码文件中使用别名指令的代码执行处理,得到处理代码。
[0082] 在本申请上述步骤S402提供的技术方案中,获取代码文件中的别名指令并对代码文件中使用别名指令的代码执行处理,得到处理代码。代码文件中的别名指令为一个命名
空间或者类型指定的别名,也即,标识符。该别名指令直接包含此指令的编译单元,在命名
空间内有效。该别名指令对代码文件的类型查找会造成干扰,可以对代码文件中使用该别
名指令的地方进行词法单元层面上的展开,得到处理代码。
[0083] 步骤S403,在预设全局对象列表中,根据处理代码将词法单元序列和与词法单元序列对应的预设对象执行类型关联或者函数关联,得到全局符号表。
[0084] 在本申请上述步骤S403提供的技术方案中,在预设全局对象列表中,根据处理代码将词法单元序列和与词法单元序列对应的预设对象执行类型关联或者函数关联,得到全
局符号表。类型关联和函数关联是将与词法单元对应的变量、类型以及方法对象进行绑定,
这样在遍历词法单元序列时可以知道当前遍历的词法单元对应的变量类型,进而确定该变
量是值类型还是引用类型,函数关联实现了函数的调用,确定是否引用了所关注的变量等,
从而显著地提高上层检查项在语义层面和函数跟踪方面的能力。
[0085] 该实施例通过根据多个预设对象建立预设全局对象列表,预设全局对象列表用于将代码文件中的同一类型的不同关键字部分进行关联;获取代码文件中的别名指令并对代
码文件中使用别名指令的代码执行处理,得到处理代码;在预设全局对象列表中,根据处理
代码将词法单元序列和与词法单元序列对应的预设对象执行类型关联或者函数关联,得到
全局符号表,实现了对词法单元序列和预设对象进行关联以建立全局符号表的目的。
[0086] 作为一种可选的实施例,根据处理代码将词法单元序列和与词法单元序列对应的预设对象执行类型关联包括以下至少之一:根据处理代码将用于类型声明的词法单元序列
和与词法单元序列对应的预设对象执行关联;根据处理代码将与代码文件中的变量对应的
词法单元序列和变量执行关联。
[0087] 根据处理代码将用于类型声明的词法单元序列和与词法单元序列对应的预设对象执行关联,可以是用于类型声明的词法单元序列中的词法单元和与词法单元对应的预设
对象执行关联;类型关联还可以是根据处理代码将与代码文件中的变量对应的词法单元序
列和变量执行关联,可以是变量对应的词法单元和变量定义关联,从而实现了全局符号表
建立过程中的类型关联。
[0088] 作为一种可选的实施例,根据处理代码将词法单元序列和与词法单元序列对应的预设对象执行函数关联至少包括:根据处理代码将与预设调用方法对应的词法单元序列和
预设调用方法执行关联。
[0089] 根据处理代码将与预设调用方法对应的词法单元序列和预设调用方法执行关联,可以是根据处理代码将与预设调用方法对应的词法单元和该预设调用方法执行关联,从而
实现了全局符号表建立过程中的函数关联。
[0090] 作为一种可选的实施例,根据处理代码将词法单元序列和与词法单元序列对应的预设对象执行类型关联或者函数关联通过在预设全局对象列表中查找到的类型名符合预
设条件的情况下根据处理代码将词法单元序列和预设对象执行类型关联或者函数关联。
[0091] 图5是根据本发明实施例的一种根据处理代码将词法单元序列和与词法单元序列对应的预设对象执行类型关联或者函数关联的方法的流程图。如图5所示,该方法包括以下
步骤:
[0092] 步骤S501,确定词法单元序列的类型的类型名并在预设全局对象列表中查找类型名。
[0093] 在本申请上述步骤S501提供的技术方案中,确定词法单元序列的类型的类型名并在预设全局对象列表中查找类型名。获取词法单元序列的类型,词法单元的类型具有类型
名,确定词法单元的类型名。在预设全局对象列表中查找该类型名。
[0094] 步骤S502,判断查找到的类型名是否符合预设条件。
[0095] 在本申请上述步骤S502提供的技术方案中,判断查找到的类型名是否符合预设条件。代码文件中的类型的类型名是受上下文代码影响的,在查找到类型名之后,判查找到的
类型名是否符合预设条件,可选地,确定离词法单元对应的对象最近的类型名符合预设条
件。
[0096] 步骤S503,根据处理代码将词法单元序列和预设对象执行类型关联或者函数关联。
[0097] 在本申请上述步骤S503提供的技术方案中,确定词法单元序列的类型的类型名并在预设全局对象列表中查找类型名。在判断查找到的类型名符合预设条件之后,也即,根据
已经对别名指令进行处理过的代码将词法单元序列和与词法单元序列对应的预设对象执
行类型关联或者函数关联。
[0098] 该实施例通过确定词法单元序列的类型的类型名并在预设全局对象列表中查找类型名;在判断出查找到的类型名符合预设条件的情况下根据处理代码将词法单元序列和
预设对象执行类型关联或者函数关联,从而实现了根据处理代码将词法单元序列和与词法
单元序列对应的预设对象执行类型关联或者函数关联的目的,显著提高上层检查项在语义
层面和函数调用跟踪方面的性能。
[0099] 作为一种可选的实施例,在步骤S210中,根据全局符号表对代码文件执行静态代码扫描,得到扫描结果通过确定待查找类型名,在待查找类型名不为预设类型名的情况下,
从词法单元段所在的基类对象中查找待查找类型名,在从词法单元段所在的基类对象中未
查找到待查找类型名时,从预设全局对象列表中查找待查找类型名,在从预设全局对象列
表中查找到待查找类型名时,且在类型限定名与预设限定名相匹配时,返回待查找类型名
以作为扫描结果。
[0100] 图6是根据本发明实施例的一种根据全局符号表对代码文件执行静态代码扫描的方法的流程图。如图6所示,该根据全局符号表对代码文件执行静态代码扫描的方法包括以
下步骤:
[0101] 步骤S601,拆分包括一个或者多个词法单元的词法单元段,得到拆分结果。
[0102] 在本申请上述步骤S601提供的技术方案中,拆分包括一个或者多个词法单元的词法单元段,得到拆分结果。词法单元段表示一个或者多个词法单元组成的序列。将与待查找
类型对应的词法单元段按照层次进行拆分,得到拆分结果。
[0103] 步骤S602,将拆分结果压入栈中。
[0104] 在本申请上述步骤S602提供的技术方案中,如果判断出类型限定名与预设限定名相匹配,返回待查找类型名以作为扫描结果。在拆分包括一个或者多个词法单元的词法单
元段,得到拆分结果之后,将该拆分结果压入栈S中。
[0105] 步骤S603,根据栈中的栈顶元素确定词法单元序列的待查找类型名。
[0106] 在本申请上述步骤S603提供的技术方案中,根据栈中的栈顶元素确定词法单元序列的待查找类型名。在将拆分结果压入栈中之后,获取栈中的栈顶元素,该栈顶元素即为待
查找类型的类型名,不包括待查找类型的类型限定名。
[0107] 步骤S604,判断待查找类型名是否为预设类型名。
[0108] 在本申请上述步骤S604提供的技术方案中,判断待查找类型名是否为预设类型名。预设类型名可以为语言本身所在系统库里的系统类型名。在根据栈中的栈顶元素确定
词法单元序列的待查找类型名之后,判断待查找类型名是否为系统类型名。
[0109] 步骤S605,从词法单元段所在的基类对象中查找待查找类型名。
[0110] 在本申请上述步骤S605提供的技术方案中,如果判断出待查找类型名不为预设类型名,从词法单元段所在的基类对象中查找待查找类型名。可选地,从词法单元段
TokenSection所在的物理文件中的对象的基类CScope开始,从下往上查找待查找类型名。
[0111] 步骤S606,在从词法单元段所在的基类对象中未查找到待查找类型名时,从全局符号表中查找待查找类型名。
[0112] 在本申请上述步骤S606提供的技术方案中,在从词法单元段所在的基类对象中未查找到待查找类型名时,可以从全局符号表包括全局类型哈希列表,根据全局类型哈希列
表查找待查找类型名。
[0113] 步骤S607,在从全局符号表中查找到待查找类型名时,验证待查找类型名的类型限定名。
[0114] 在本申请上述步骤S607提供的技术方案中,在从预设全局对象列表中查找到待查找类型名时,验证待查找类型名的类型限定名,该类型限定名为用于限定待查找类型名的
名称。可选地,如果在从预设全局对象列表中未查找到待查找类型名时,结束对代码文件执
行静态代码扫描的过程。
[0115] 步骤S608,判断类型限定名是否与预设限定名相匹配。
[0116] 在本申请上述步骤S608提供的技术方案中,预设限定名为匹配到的限定名,判断栈中的类型限定名与预设限定名是否相匹配。
[0117] 步骤S609,返回待查找类型名以作为扫描结果。
[0118] 在本申请上述步骤S609提供的技术方案中,如果判断出类型限定名与预设限定名相匹配,返回待查找类型名,该返回的待查找类型名为最终匹配到的类型名。
[0119] 该实施例通过拆分包括一个或者多个词法单元的词法单元段,得到拆分结果;将拆分结果压入栈中;根据栈中的栈顶元素确定词法单元序列的待查找类型名;判断待查找
类型名是否为预设类型名;如果判断出待查找类型名不为预设类型名,从词法单元段所在
的基类对象中查找待查找类型名;在从词法单元段所在的基类对象中未查找到待查找类型
名时,从预设全局对象列表中查找待查找类型名,在从预设全局对象列表中查找到待查找
类型名时,验证待查找类型名的类型限定名,类型限定名为用于限定待查找类型名的名称;
判断类型限定名是否与预设限定名相匹配;如果判断出类型限定名与预设限定名相匹配,
返回待查找类型名以作为扫描结果,从而实现了根据全局符号表对代码文件执行静态代码
扫描的目的。
[0120] 作为一种可选的实施例,步骤S210,根据全局符号表对代码文件执行静态代码扫描,在从词法单元段所在的基类对象中查找待查找类型名之后,在从词法单元段所在的基
类对象中查找到待查找类型名时,验证待查找类型名的类型限定名;判断类型限定名是否
与预设限定名相匹配;以及如果判断出类型限定名与预设限定名相匹配,返回待查找类型
名以作为扫描结果。
[0121] 图7是根据本发明实施例的另一种根据全局符号表对代码文件执行静态代码扫描的方法的流程图。如图7所示,该根据全局符号表对代码文件执行静态代码扫描的方法包括
以下步骤:
[0122] 步骤S701,在从词法单元段所在的基类对象中查找到待查找类型名时,验证待查找类型名的类型限定名。
[0123] 在本申请上述步骤S701提供的技术方案中,当从词法单元段所在的基类对象中查找到待查找类型名时,验证待查找类型名的类型限定名。可选地,从词法单元段
TokenSection所在的物理文件中的对象的基类CScope开始,从下往上查找到待查找类型名
时,验证待查找类型名的类型限定名。
[0124] 步骤S702,判断类型限定名是否与预设限定名相匹配。
[0125] 在本申请上述步骤S702提供的技术方案中,判断类型限定名是否与预设限定名相匹配。在验证待查找类型名的类型限定名时,判断栈中的类型限定名是否与预设限定名相
匹配。
[0126] 步骤S703,返回待查找类型名以作为扫描结果。
[0127] 在本申请上述步骤S703提供的技术方案中,如果判断出类型限定名与预设限定名相匹配,返回待查找类型名以作为扫描结果。如果判断出了性限定名与预设限定名不相匹
配,继续执行步骤S605,从词法单元段所在的基类对象中查找待查找类型名。
[0128] 该实施例在从词法单元段所在的基类对象中查找待查找类型名之后,在从词法单元段所在的基类对象中查找到待查找类型名时,验证待查找类型名的类型限定名;判断类
型限定名是否与预设限定名相匹配;如果判断出类型限定名与预设限定名相匹配,返回待
查找类型名以作为扫描结果,从而实现该根据全局符号表对代码文件执行静态代码扫描的
目的。
[0129] 作为一种可选的实施例,在对代码文件中的字符序列进行词法分析,得到词法单元序列之前,对代码文件执行预处理,得到预处理代码,其中,预处理代码为符合预设规则
的字符流,对代码文件中的字符序列进行词法分析,得到词法单元序列包括:对预处理代码
中的字符序列进行词法分析,得到词法单元序列。
[0130] 预处理是对代码文件进行的第一道处理,过滤掉与有效代码无关的代码,也即,过滤掉与后续全局符号化表无关的内容,从而为对代码文件中进行词法分析提供了规范的字
符序列。在对代码文件执行预处理,得到预处理代码之后,对预处理代码中的字符序列进行
词法分析,得到词法单元序列。
[0131] 在作为一种可选的实施例,对代码文件执行预处理包括以下至少之一:过滤代码文件的空格;删除代码文件的注释;按照预设配置处理代码文件的预处理指令;对代码文件
统一编码,输出编码字符流。
[0132] 在对代码文件中的字符序列进行词法分析,得到词法单元序列之前,对代码文件执行预处理包括多种方法,过滤代码文件的空格,从而去掉多余的空格;注释对代码文件的
执行不造成任何影响,因而删除代码文件的注释;按照预设配置处理代码文件的预处理指
令,可以根据项目配置处理预处理指令,该预处理指令可以为#define,#if,#error,#line
等。可以对代码文件统一编码,输出编码字符流,比如,ASCII编码字符流,从而实现对代码
文件的预处理。
[0133] 作为一种可选的实施例,步骤S204,对代码文件中的字符流进行词法分析,得到词法单元序列通过读取代码文件的字符流;将字符流组成词素,并根据词素生成词法单元序
列来实现。
[0134] 图8是根据本发明实施例的另一种对代码文件中的字符流进行词法分析的方法的流程图。如图8所示,该对代码文件中的字符流进行词法分析的方法包括以下步骤:
[0135] 步骤S801,读取代码文件的字符流。
[0136] 在本申请上述步骤S801提供的技术方案中,读取代码文件的字符流。可以读入预处理输出的编码字符流。
[0137] 步骤S802,将字符流组成词素。
[0138] 在本申请上述步骤S802提供的技术方案中,将字符流组成词素。可以将对代码文件进行预处理时输出的编码字符流组成词素。词素是从词或词干的直接成分的角度来确定
的音义结合体,它不一定是最小的音义结合成分,而词内的语素只从是否为最小的音义结
合成分来确定。
[0139] 步骤S803,根据词素生成词法单元序列。
[0140] 在本申请上述步骤S803提供的技术方案中,在将字符流组成词素之后,根据词素生成词法单元序列,词法单元序列中的每个词法单元与词素一一对应。
[0141] 该实施例通过读取代码文件的字符流;将字符流组成词素;以及根据词素生成词法单元序列,词法单元序列中的每个词法单元与词素一一对应,从而实现了对代码文件中
的字符流进行词法分析,得到词法单元序列的目的。
[0142] 作为一种可选的实施例,在对词法单元序列和预设对象进行关联以建立全局符号表之后,根据全局符号表建立用于模拟代码文件的执行流程的数据流模型。
[0143] 构建数据流模型的基本思路是根据全局符号表模拟代码执行流程,可以全局符号表处理代码中的具有明文数值的词法单元,在词法单元对应的数据流字段中记录数值信
息;可以对于简单函数,比如,对于返回常数值或者返回值只是经过简单算术运算,根据全
局符号表模拟计算函数返回值;可以根据全局符号表处理位运算符;可以根据全局符号表
对于for循环中的标准模式进行模拟;当变量被赋值为已知值时,可以根据全局符号表跟踪
后续变量的使用情况,更新变量的数据流字段等。
[0144] 作为一种可选的实施例,根据全局符号表建立数据流模型通过根据全局符号表模拟代码文件的执行流程,得到模拟结果来建立数据流模型。
[0145] 图9是根据本发明实施例的一种根据全局符号表建立数据流模型的方法的流程图。如图9所示,该根据全局符号表建立数据流模型的方法包括以下步骤:
[0146] 步骤S901,根据全局符号表模拟代码文件的执行流程,得到模拟结果。
[0147] 在本申请上述步骤S901提供的技术方案中,根据全局符号表模拟代码执行逻辑,尽可能地推测并记录变量在当前上下文可能的取值范围,得到模拟结果。
[0148] 步骤S902,根据模拟结果建立数据流模型。
[0149] 在本申请上述步骤S902提供的技术方案中,在根据全局符号表模拟代码文件的执行流程,得到模拟结果之后,根据模拟结果建立数据流模型。
[0150] 该实施例通过根据全局符号表模拟代码文件的执行流程,得到模拟结果;根据模拟结果建立数据流模型,从而实现了根据全局符号表建立数据流模型的目的。
[0151] 作为一种可选的实施例,根据全局符号表模拟代码文件的执行流程,得到模拟结果包括:在根据全局符号表对代码文件的变量进行比较的情况下,确定并记录变量的取值
范围。
[0152] 在根据全局符号表对代码文件的变量进行比较的情况下,确定并记录变量的取值范围,如果if条件语句对变量进行了大小等判断,那么可以推测该变量在当前上下文中可
能的取值情况,然后从If条件向前向后解析变量的使用情况,更新数据流字段。
[0153] 本发明实施例获取代码文件,代码文件为包括字符序列的源程序文本;对代码文件中的字符序列进行词法分析,得到词法单元序列;解析代码文件,得到预设对象;对词法
单元序列和预设对象进行关联以建立全局符号表,全局符号表用于记录代码文件中的所有
预设对象的数据信息;以及根据全局符号表对代码文件执行静态代码扫描,得到扫描结果,
扫描结果至少包括对词法单元序列的类型的查找结果,可以用于上层检查项的开发,发现
代码中可能存在的缺陷,性能和安全问题,能够让程序员高效、低成本修复这些问题,从而
提升代码质量,使符号化结果准确、高效,可以采用上下文敏感的类型查找算法,相比简单
的字符串匹配来讲,具有更高的准确性,另外在数据结构设计上,尽可能减少结构大小,充
分利用缓存,在内存和效率上都有不错的表现,能够在编译不通过的情况下进行检测,分
析,不影响整体符号化流程和结果,提高了代码扫描的准确性,能够基于C++语言实现,可以
支持Windows\Linux\Mac系统。
[0154] 实施例2
[0155] 下面结合优选的实施例对本发明的技术方案进行说明。
[0156] 该实施例为针对C#语言基于非编译的全局符号化方案,为上层静态代码检查项扫描提供了准确、高效的符号化结果,使得检查项具备语法层面、跨函数扫描、语义层面以及
一定程度的逻辑分析能力。最终输出的代码扫描结果能够帮助开发、测试人员快速定位代
码中隐藏的问题、提升代码质量,降低后期的修复成本。适用于所有使用C#语言的项目的静
态代码检查。
[0157] 该实施例充分考虑了代码文件缺失、类型定义缺失和语法错误的情况,因此符号# #
化过程不需要编译输入的C代码,也不需要C代码能够编译通过。
[0158] 该实施例实现了针对C#语言基于非编译的符号化流程;全局符号表的数据结构以及构建全局符号表的逻辑;以及类型查找和函数查找时上下文敏感的查找算法。
[0159] 该实施例的应用场景为:输入C#语言项目的代码文件,对C#语言代码进行词法分析,建立词法单元链表和抽象语法树,然后提取变量、函数特征信息,构建全局符号表,并建
立变量使用规则、函数调用链接,最后,跟踪代码中变量的使用情况,推测变量可能的取值
范围,最终建立变量数据流模型,为上层静态代码检查项提供检查所需的符号化结果和调
用接口。
[0160] 图10是根据本发明实施例的另一种数据处理方法的流程图。如图10所示,该数据处理方法包括以下步骤:
[0161] 步骤S1001,对代码文件执行预处理,得到预处理代码。
[0162] 对代码文件进行预处理是对于输入代码的第一道处理,过滤掉后续符号化不需要的内容,得到预处理代码。
[0163] 步骤S1002,对预处理代码进行词法分析,得到词法单元序列。
[0164] 对预处理之后的代码文本的字符序列进行词法分析,将字符序列转换成词法单元序列。
[0165] 步骤S1003,对词法单元序列进行简化,得到简化词法单元序列。
[0166] 对词法单元序列进行等价的代码逻辑替换,得到简化词法单元序列,从而规范了代码格式。
[0167] 步骤S1004,建立树形语法结构。
[0168] 在得到简化词法单元序列之后,建立树形语法结构,树形语法结构的构建过程类似于编译过程中构建抽象语法树AST的过程。
[0169] 步骤S1005,根据树形语法结构建立全局符号表。
[0170] 在建立树形语法结构之后,构建全局符号表,该全局符号表记录了代码中所有逻辑对象的格式化信息。
[0171] 步骤S1006,根据全局符号表建立数据流模型。
[0172] 在建立全局符号表之后,根据全局符号表建立数据流模型,模拟代码执行逻辑,记录变量可能的取值范围。
[0173] 该实施例通过对代码文件执行预处理,得到预处理代码,对预处理代码进行词法分析,得到词法单元序列,对词法单元序列进行简化,得到简化词法单元序列,建立树形语
法结构,根据树形语法结构建立全局符号表,根据全局符号表建立数据流模型,提高了代码
文件扫描的准确性。
[0174] 下面对步骤S1001,代码文件执行预处理,得到预处理代码进行介绍。
[0175] 预处理是对源程序文本代码进行的第一道处理,目的是为之后的词法分析提供规范的字符流,过滤与有效代码无关的部分。主要包括如下几部分内容:过滤多余的空格;去
掉注释;依据项目配置处理预处理指令(#define,#if,#error,#line等);统一代码文件编
码,输出ASCII编码字符流。
[0176] 图11是根据本发明实施例的一种对代码文件进行预处理之前的代码示意图。如图11所示,在对代码文件进行预处理之前,代码文件包括与有效代码无关的部分,包括:注释
“/*This is the entry point.*/”,预处理指令“#if TEST CMD”,预处理指令“//defind”,
预处理指令“#else”,无效语句“Console.WriteLie(“TEST_CMD is not defind.”);//not 
defind.”,预处理指令“#endif”,以及空格等。
[0177] 图12是根据本发明实施例对代码文件进行预处理之后的代码示意图。如图12所示,过滤与有效代码无关的部分。经过滤多余的空格,去掉注释,依据项目配置处理预处理
指令,统一代码文件编码,等处理之后,对代码文件进行预处理之后的代码不包括图11所示
的注释“/*This is the entry point.*/”,预处理指令“#if TEST CMD”,预处理指令“//
defind”,预处理指令“#else”,无效语句“Console.WriteLie(“TEST_CMD is not 
defind.”);//not defind.”,预处理指令“#endif”,以及多余空格等,从而为后续词法分析
提供规范的字符流。
[0178] 下面对步骤S1002,对预处理代码进行词法分析,得到词法单元序列进行介绍。
[0179] 词法分析的主要任务是读入预处理输出的字符流,将字符流组成词素,并将词素生成并输出一个词法单元(Token)序列,每个词法单元对应一个词素。整个词法单元序列叫
做Token list。Token list是后续处理和上层检查项遍历代码的基本数据结构,是一个代
码文件经过词法分析之后生成的所有Token的集合。
[0180] 图13是根据本发明实施例的一种对预处理代码进行词法分析,得到词法单元序列的代码示意图。如图13所示,预处理代码“for(int index=0;index<42;++index)”,对预处
理代码“for(int index=0;index<42;++index)”进行词法分析,得到词法单元序列:
“for”、“(”、“int”、“index”、“=”、“0”、“;”、“index”、“<”、“42”、“;”、“++”、“index”、“)”。
[0181] 词法单元Token是进行语法分析以及规则扫描的最基本的单位,代码扫描包括上层扫描和底层扫描,底层扫描包括了本发明的技术方案,上层扫描为规则扫描,比如,除零
操作,从而很好地发现代码缺陷。词法单元Token除了包含该词素的字符串值以外,还有与
词法单元Token相关联的其它属性:比如,指向下一个词法单元Token的指针;指向上一个词
法单元Token的指针;指向“配对”词法单元Token的指针(对于左括号来说,即指向右括号的
指针);词法单元Token的类型(数字,字符串,变量,函数,关键字等);词法单元Token指向符
号表的指针(变量Token指向符号表中的变量对象,函数Token指向其对应的函数对象);词
法单元Token的行号;词法单元Token的语法树结构指针(维护词法单元Token的抽象语法树
结构);词法单元Token的数据流结构指针。
[0182] 词法单元序列TokenList本质上是一个双向链表,维护所有的词法单元Token。
[0183] 图14是根据本发明实施例的一种词法单元序列的示意图。如图14所示,代码“if(i>0)”的词法单元序列TokenList为双向链表,其中,“if”→“(”→“i”→“>”→“0”→“)”→“0”
→“>”→“i”→“(”→“if”,其中,“(”与“)”配对。
[0184] 下面对步骤S1003对词法单元序列进行简化,得到简化词法单元序列进行介绍。
[0185] 不同项目代码、不同程序员的代码风格是不同的,客观上形成了代码文件的多样性现状,这给全局符号化表建立的过程造成了一些麻烦。为了减小实现全局符号化的成本
以及提高上层静态扫描的准确性,在建立好T词法单元序列Token list之后,需要一些简化
步骤来使代码文件统一代码风格。
[0186] 该实施例的所有简化步骤都不能改变代码的逻辑,只能是对代码文件进行逻辑上的等价替换。
[0187] 图15是根据本发明实施例的一种对词法单元序列进行简化的示意图。如图15所示,简化C#平台类型为基础类型,将代码“System.Int32il=default(int);”进行简化,简
化default关键字之后,得到简化词法单元序列“int i1=0;”。
[0188] 图16是根据本发明实施例的另一种对词法单元序列进行简化的示意图。如图16所示,将lamada表达式“i=>i+5”简化为标准形式“(i)=>{return i+5;}”。
[0189] 下面对步骤S1004建立树形语法结构进行介绍。
[0190] 树形语法结构,也即,抽象语法树,是C#代码的抽象语法结构的树状表现形式。树形语法结构是一个二叉树,每一个非叶子节点代表一个运算符,它的两个子节点分别代表
该运算符的两个运算分量。树形语法结构包含了表达式的逻辑结构和运算符的优先级关
系,这个特性能够提高代码场景匹配的准确性以及实现该场景的效率。
[0191] 需要说明的是,该实施例的抽象语法树结构与传统编译过程中的抽象语法树结构不同的地方在于,传统编译过程中的抽象语法树结构会建立代码表达式之间的逻辑关系,
比如if-else语句段中if语句和else语句的逻辑关系,而该实施例中的抽象语法树结构只
针对单个代码表达式中建立抽象语法结构,并不建立代码表达式和代码表达式之间的结构
关系。该实施例支持不完整的或者不能通过编译的C#代码作为输入,一旦输入的C#代码存在
语法错误,那么构建出来的全局抽象语法树结构将会是错误且没有参考意义的,而构建单
表达式的抽象语法树结构,如果出现错误,那也只是局部的,不影响其它表达式的抽象语法
树结构。
[0192] 图17是根据本发明实施例的一种抽象语法树结构的示意图。如图17所示,该抽象语法树结构为代码“String.Format("{0}{1}{2}{3}",Func(1,2),"tsc#",1+2*3)”的树状
结构。
[0193] 下面对步骤S1005根据树形语法结构建立全局符号表进行介绍。
[0194] 全局符号表的建立是实现代码扫描过程中对变量类型的判定,以及函数调用跟踪的基础,比其它基于文本和正则匹配的符号化方案更加强大。
[0195] 图18是根据本发明实施例的一种建立全局符号表的方法的流程图。如图18所示,该建立全局符号表的方法包括以下步骤:
[0196] 步骤S1801,依次解析所有代码文件,生成对应的类,命名空间,方法字段等对象,并建立相应的包含关系,每个代码文件对应一个CSymbolFile对象。
[0197] 根据C#语言的语法特点,定义了如表1所示的CSymbolFile对象列表。
[0198] 表1CSymbolFile对象列表
[0199]
[0200] 步骤S1802,合并所有的CSymbolFile对象,以CSI对象的全限定名作为key,对应的CSI对象作为value,建立全局类型哈希表。
[0201] 该步骤主要是解决partial关键字类型的关联问题。
[0202] 步骤S1803,处理代码中的别名指令。
[0203] 处理代码中的别名指令(Using alias directives),为后续的类型关联做准备
[0204] 步骤S1804,类型声明Token跟对应的类型对象关联;变量Token跟变量定义关联。
[0205] 用于类型声明的词法单元Token与对应的类型对象关联,与代码文件中的变量对应的词法单元Token和变量执行关联。
[0206] 步骤S1805,方法调用Token跟对应的方法对象关联。
[0207] 方法调用Token跟对应的方法对象关联,也即,与预设调用方法对应的词法单元Token和预设调用方法执行关联,从而实现对全局符号表的建立。
[0208] 该实施例通过依次解析所有代码文件,生成对应的类,命名空间,方法字段等对象,并建立相应的包含关系,每个代码文件对应一个CSymbolFile对象,合并所有的
CSymbolFile对象,以CSI对象的全限定名作为key,对应的CSI对象作为value,建立全局类
型哈希表,处理代码中的别名指令,类型声明Token跟对应的类型对象关联;变量Token跟变
量定义关联,方法调用Token跟对应的方法对象关联,从而实现了对全局符号表的建立。
[0209] 图19是根据本发明实施例的一种对象的类的示意图。如图19所示,该对象的类为表1中所示的对象的类,类型之间的继承关系主要是从代码层面的结构是否相似来考虑。其
中CSI代表一个类Class,结构Struct或者接口Interface对象,因为这三种类型在代码层面
有相似的结构,所以整合到了一起。CSymbolFile对象代表物理上的一个代码文件,而它继
承自命名空间CNamespace是因为代码文件的最上层可以被认为是隐藏了“namespace 
global{…}”的一个全局namespace,两者具有相同的逻辑含义。
[0210] 图20是根据本发明实施例的一种全局类型哈希表的示意图。如图20所示,C#语言支持partial关键字,即同一个类或者方法的定义,可以在多个代码文件中,所以需要把同
一个类型的不同部分的定义关联起来。建立全局类型哈希表的过程中,就会把同一类型的
不同partial关键字部分链接起来,该全局类型哈希表包括键Key和键值Value,其中,键Key
包括Namepace.A与classA关联,Namepace.B与class partial B关联,Namepace.C与class 
C关联。
[0211] 全局类型哈希表建立除了解决partial对象的关联问题,还解决了类型查找以及类型遍历的问题。
[0212] C#代码中的别名指令会对后续的类型查找造成干扰,因此这里需要先解析出代码中的别名指令,然后对使用该别名指令的地方进行Token层面的展开。
[0213] 图21是根据本发明实施例的一种对别名指令执行处理的代码示意图。如图21所示,使用别名指令的代码为“using A=N1.N2.A;class B:A{}”,对该别名指令执行处理之
后为“class B:N1.N2.A”,从而避免了该别名指令对后续的类型查找造成干扰。
[0214] 类型关联和函数关联的工作是将词法单元Token跟它对应的变量、类型以及方法对象进行绑定,这样做的意义在遍历词法单元序列TokenList时,能够知道当前词法单元
Token所对应的变量类型,该变量是值类型还是引用类型,这个函数调用的实现是否引用了
所关注的变量等等,这能够显著提高上层检查项在语义层面和函数跟踪方面的能力。
[0215] 类型关联和函数关联的关键是类型查找。C#语言中一个类型Token所代表的具体类型是受当前上下文影响的。图22是根据本发明实施例的一种词法单元的类型查找的示意
#
图。如图22所示,理论上来讲,class B的基类A指向N1.A或者N2.A都是可以的,而实际上,C
编译器在遇到这种情况采取的是“就近原则”,即优先匹配“最近”的类型,对于以上例子,编
译器会把A指向N2.A。
[0216] 该实施例在进行类型查找和函数查找的时候,采取了同样的思路来处理,基于生成的全局符号表,实现了上下文敏感的类型查找算法,也即,对代码文件执行静态代码扫
描,这是对扫描结果正确性的一个重要的保障。
[0217] 图23是根据本发明实施例的一种对代码文件执行静态代码扫描的方法的流程图。如图23所示,该方法包括以下步骤:
[0218] 步骤S2301,将类型过对应的词法单元段按照层次拆分,压入栈中。
[0219] 步骤S2302,取出栈中的元素以确定类型名。
[0220] 取出栈中的元素,也即,类型的类型名N,不包括类型的限定名。
[0221] 步骤S2303,判断类型名是否为系统类型。
[0222] 判断类型名是否为系统类型,如果判断出类型名为系统类型,结束代码文件静态代码扫描的流程,如果判断出类型名不为系统类型,执行步骤S2304。
[0223] 步骤S2304,从词法单元段所在的基类对象开始,从下往上查找类型名N。
[0224] 如果判断出类型名不为系统类型,词法单元段所在的基类对象开始,从下往上查找类型名N。
[0225] 步骤S2305,判断是否查找到类型名N。
[0226] 在词法单元段所在的基类对象开始,从下往上查找类型名N之后,判断是否查找到类型名N。如果判断出查找到类型名N,执行步骤S2308,如果判断出没有查找到类型名N,执
行步骤S2306。
[0227] 步骤S2306,从全局类型哈希表中查找类型名N。
[0228] 在判断出没有查找到类型名N时,从全局类型哈希表中查找类型名N。
[0229] 步骤S2307,判断在全局类型哈希表中是否查找到类型名N。
[0230] 如果判断出全局类型哈希表中查找到类型名N,执行步骤S2308,如果判断出在全局类型哈希表中未查找到类型名N,结束代码文件静态代码扫描的流程。
[0231] 步骤S2308,验证栈中的类型限定名。
[0232] 如果判断出全局类型哈希表中查找到类型名N,验证栈中的类型限定名。
[0233] 步骤S2309,判断栈中的类型限定名是否与预设类型限定名相匹配。
[0234] 如果判断出栈中的类型限定名与预设类型限定名相匹配,执行步骤S2310,如果判断出栈中的类型限定名不与预设类型限定名相匹配,结束代码文件静态代码扫描的流程。
[0235] 步骤S2310,返回匹配到的类型。
[0236] 该匹配到的类型为类型查找的结果,也即,代码扫描的结果。
[0237] 该实施例通过将类型过对应的词法单元段按照层次拆分,压入栈中,取出栈中的元素以确定类型名,判断类型名是否为系统类型,如果判断出类型名不为系统类型,从词法
单元段所在的基类对象开始,从下往上查找类型名N,判断是否查找到类型名N,如果判断出
没有查找到类型名N,从全局类型哈希表中查找类型名N,判断在全局类型哈希表中是否查
找到类型名N。如果判断出在全局类型哈希表中查找到类型名N,验证栈中的类型限定名,判
断栈中的类型限定名是否与预设类型限定名相匹配。如果判断出栈中的类型限定名与预设
类型限定名相匹配,返回匹配到的类型,实现了对代码文件执行静态代码扫描,提高了代码
文件扫描的准确性。
[0238] 实施例3
[0239] 本发明实施例的应用环境可以但不限于参照上述实施例中的应用环境,本实施例中对此不再赘述。本发明实施例提供了用于实施上述数据处理方法的一种可选的具体应
用。
[0240] 图24是根据本发明实施例的一种原始代码的示意图。如图24所示,通过获取代码文件,代码文件为包括字符序列的源程序文本;对代码文件中的字符序列进行词法分析,得
到词法单元序列;解析代码文件,得到预设对象;对词法单元序列和预设对象进行关联以建
立全局符号表,全局符号表用于记录代码文件中的所有预设对象的数据信息;以及根据全
局符号表对代码文件执行静态代码扫描,得到扫描结果,扫描结果至少包括对词法单元序
列的类型的查找结果,得到图25所示的代码,其中,图25是根据本发明实施例的一种符号化
输出的调试文件的示意图。其中,相同变量ID代表同一个变量,并且能够关联该变量的定
义,通过函数Func可以直接引用其定义。
[0241] 在根据全局符号表对代码文件执行静态代码扫描,得到扫描结果之后,建立数据流模型,建立数据流模型的基本思路是模拟代码执行流程,尽可能地推测并记录变量在当
前上下文可能的取值范围。
[0242] 处理代码中的明文数值Token,在Token对应的数据流字段中记录数值信息;对于某些简单函数(返回常数值或者返回值只是经过简单算术运算),模拟计算函数返回值;处
理位运算符&,对于表达式“i=j&4;”,变量i的结果只能是4或者0;对于for循环中标准模
式:比如“for(int i=0;i<10;++i)”,模拟执行i从0到9的过程;变量被赋值为已知值时,跟
踪后续变量的使用情况,更新变量的数据流字段;如果if条件语句对变量进行了大小、判等
比较,那么可以推测该变量在当前上下文中可能的取值情况,然后从if条件向前向后解析
变量的使用情况,更新相应的数据流字段。
[0243] 图26是根据本发明实施例的一种建立数据流模型的代码示意图。如图26所示,通过“int i=10;if(j>0)i=42;j=1”得出变量i在当前上下文的取值范围为{10,42}。
[0244] 本发明实施例发现了代码潜在问题,能够让程序员高效、低成本修复这些问题,提升代码质量。符号化结果准确、高效,采用上下文敏感的类型查找算法,相比简单的字符串
匹配来讲,具有更高的准确性,另外在数据结构设计上,尽可能减少结构大小,充分利用缓
存,在内存和效率上都有不错的表现。本发明实施例不基于编译,能够在编译不通过的情况
下进行检测,分析,不影响整体符号化流程和结果。可以实现基于C++语言,目前可以支持
Windows\Linux\Mac系统。
[0245] 需要说明的是,本发明的技术方案的支持多语言扩展,该技术方案除了支持C#语言之外,理论上能够支持其它类似的语言比如Java,C/C++语言,它们都属于类C语言。Java
语言在语法和代码风格上都和C#很相似,因此本方案对于Java语言的支持代价会比较小;
C/C++语言是基于头文件包含的,在方案细节上可能会有变化。本发明的技术方案同样对中
间语言的支持,C#语言一般是运行在“托管虚拟机”上(.NET或者Mono)的,C#语言会被编译成
中间语言(IL),因此,基于本方案中全局符号表的数据结构和接口,可以直接全局符号化C#
对应的IL语言,用户只需要提供编译好的程序集文件(dll文件或者exe文件等)即可。类型
和函数查找实现更加容易,数据流模型以及AST的精准度也会提高。
[0246] 需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为
依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知
悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明
所必须的。
[0247] 通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多
情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有
技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储
介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算
机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
[0248] 实施例4
[0249] 根据本发明实施例,还提供了一种用于实施上述数据处理方法的。图27是根据本发明实施例的一种数据处理装置的示意图。如图27所示,该数据处理装置包括:第一获取单
元10、分析单元20、解析单元30、关联单元40和扫描单元50。
[0250] 第一获取单元10,用于获取代码文件,其中,代码文件为包括字符序列的源程序文本。
[0251] 分析单元20,用于对代码文件中的字符序列进行词法分析,得到词法单元序列。
[0252] 解析单元30,用于解析代码文件,得到预设对象。
[0253] 关联单元40,用于对词法单元序列和预设对象进行关联以建立全局符号表,其中,全局符号表用于记录代码文件中的所有预设对象的数据信息。
[0254] 扫描单元50,用于根据全局符号表对代码文件执行静态代码扫描,得到扫描结果,其中,扫描结果至少包括对词法单元序列的类型的查找结果。
[0255] 需要说明的是,该实施例中的第一获取单元10可以用于执行本申请实施例1中的步骤S202,该实施例中的分析单元20可以用于执行本申请实施例1中的步骤S204,该实施例
中的解析单元30可以用于执行本申请实施例1中的步骤S206,该实施例中的关联单元40可
以用于执行本申请实施例1中的步骤S208,该实施例中的扫描单元50以用于执行本申请实
施例1中的步骤S210。
[0256] 图28是根据本发明实施例的另一种数据处理装置的示意图。如图28所示,该数据处理装置包括:第一获取单元10、分析单元20、解析单元30、关联单元40和扫描单元50。该数
据处理装置还包括:第二获取单元60。
[0257] 需要说明的是,该实施例的第一获取单元10、分析单元20、解析单元30、关联单元40与图27所示的数据处理装置中的作用相同,此处不再赘述。
[0258] 第二获取单元60,用于在对词法单元序列和预设对象进行关联以建立全局符号表之前,在不改变代码文件的逻辑的情况下,对词法单元序列进行简化,得到简化词法单元序
列。
[0259] 关联单元40用于对简化词法单元序列和预设对象进行关联以建立全局符号表。
[0260] 可选地,该数据处理装置还包括:第一建立单元,用于在对词法单元序列进行简化,得到简化词法单元序列之后,根据简化词法单元序列建立树形语法结构,其中,树形语
法结构为用于存储具有预设语法的数据对象的树形结构。上述关联单元40用于根据树形语
法结构对简化词法单元序列和预设对象进行关联以建立全局符号表。
[0261] 可选地,第一建立单元包括:第一获取模块和第一建立模块。其中,第一获取模块用于获取词法单元序列中的单个代码表达式;第一建立模块用于根据单个代码表达式建立
树形语法结构。
[0262] 可选地,预设对象包括多个预设对象,关联单元40包括:第二建立模块、第二获取模块和关联模块。其中,第二建立模块用于根据多个预设对象建立预设全局对象列表,其
中,预设全局对象列表用于将代码文件中的同一类型的不同关键字部分进行关联;第二获
取模块用于获取代码文件中的别名指令并对代码文件中使用别名指令的代码执行处理,得
到处理代码;关联模块,用于在预设全局对象列表中,根据处理代码将词法单元序列和与词
法单元序列对应的预设对象执行类型关联或者函数关联,得到全局符号表。
[0263] 可选地,关联模块用于执行的方法包括以下至少之一:根据处理代码将用于类型声明的词法单元序列和与词法单元序列对应的预设对象执行关联;根据处理代码将与代码
文件中的变量对应的词法单元序列和变量执行关联。
[0264] 可选地,关联模块还用于根据处理代码将与预设调用方法对应的词法单元序列和预设调用方法执行关联。
[0265] 可选地,关联模块包括:确定子模块,判断子模块和关联子模块。其中,确定子模块用于确定词法单元序列的类型的类型名并在预设全局对象列表中查找类型名;判断子模块
用于判断查找到的类型名是否符合预设条件;以及关联子模块用于在判断出查找到的类型
名符合预设条件时,根据处理代码将词法单元序列和预设对象执行类型关联或者函数关
联。
[0266] 可选地,扫描单元50包括:拆分模块、确定模块、第一判断模块、第一查找模块、第二查找模块、第一验证模块、第二判断模块和第一返回模块。其中,拆分模块,用于将拆分结
果压入栈中;确定模块,用于根据栈中的栈顶元素确定词法单元序列的待查找类型名;第一
判断模块,用于判断待查找类型名是否为预设类型名;第一查找模块,用于在判断出待查找
类型名不为预设类型名时,从词法单元段所在的基类对象中查找待查找类型名;第二查找
模块,用于在从词法单元段所在的基类对象中未查找到待查找类型名时,从全局符号表中
查找待查找类型名;第一验证模块,与在全局符号表中查找到待查找类型名时,验证待查找
类型名的类型限定名,其中,类型限定名为用于限定待查找类型名的名称;第二判断模块,
用于判断类型限定名是否与预设限定名相匹配;以及第一返回模块,用于在判断出类型限
定名与预设限定名相匹配时,返回待查找类型名以作为扫描结果。
[0267] 可选地,扫描单元50还包括:第二验证模块、第三判断模块和第二返回模块。其中,第二验证模块,用于在从词法单元段所在的基类对象中查找待查找类型名之后,在从词法
单元段所在的基类对象中查找到待查找类型名时,验证待查找类型名的类型限定名;第三
判断模块,用于判断类型限定名是否与预设限定名相匹配;以及第二返回模块,用于在判断
出类型限定名与预设限定名相匹配时,返回待查找类型名以作为扫描结果。
[0268] 可选地,该数据处理装置还包括:预处理单元,用于在对代码文件中的字符序列进行词法分析,得到词法单元序列之前,对代码文件执行预处理,得到预处理代码,其中,预处
理代码为符合预设规则的字符流,分析单元20用于对预处理代码中的字符序列进行词法分
析,得到词法单元序列。
[0269] 可选地,预处理单元用于执行的方法包括以下至少之一:过滤代码文件的空格;删除代码文件的注释;按照预设配置处理代码文件的预处理指令;对代码文件统一编码,输出
编码字符流。
[0270] 可选地,分析单元20包括:读取模块、组成模块和生成模块。其中,读取模块,用于读取代码文件的字符流;组成模块,用于将字符流组成词素;以及生成模块,用于根据词素
生成词法单元序列,其中,词法单元序列中的每个词法单元与词素一一对应。
[0271] 可选地,该数据处理装置还包括:第二建立单元,用于在对词法单元序列和预设对象进行关联以建立全局符号表之后,根据全局符号表建立用于模拟代码文件的执行流程的
数据流模型。
[0272] 可选地,第二建立单元包括:模拟模块和第三建立模块。其中,模拟模块用于根据全局符号表模拟代码文件的执行流程,得到模拟结果;第三建立模块用于根据模拟结果建
立数据流模型。
[0273] 可选地,模拟模块用于在根据全局符号表对代码文件的变量进行比较的情况下,确定并记录变量的取值范围。
[0274] 此处需要说明的是,上述单元和模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例1所公开的内容。需要说明的是,上述单元和模块作为装置的一部
分可以运行在如图1所示的硬件环境中,可以通过软件实现,也可以通过硬件实现。
[0275] 通过上述单元和模块,可以解决了相关技术中代码扫描的准确性低的技术问题,进而达到提高代码扫描的准确性的技术效果。
[0276] 此处需要说明的是,上述单元和模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例1所公开的内容。需要说明的是,上述单元和模块作为装置的一部
分可以运行在如图1所示的硬件环境中,可以通过软件实现,也可以通过硬件实现,其中,硬
件环境包括网络环境。
[0277] 实施例5
[0278] 根据本发明实施例,还提供了一种用于实施上述数据处理方法的服务器或终端。
[0279] 图29是根据本发明实施例的一种终端的结构框图。如图29所示,该终端可以包括:一个或多个(图中仅示出一个)处理器291、存储器293、以及传输装置295(如上述实施例中
的发送装置),如图29所示,该终端还可以包括输入输出设备297。
[0280] 其中,存储器293可用于存储软件程序以及模块,如本发明实施例中的数据处理方法和装置对应的程序指令/模块,处理器291通过运行存储在存储器293内的软件程序以及
模块,从而执行各种功能应用以及数据处理,即实现上述的数据处理方法。存储器293可包
括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或
者其他非易失性固态存储器。在一些实例中,存储器293可进一步包括相对于处理器291远
程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限
于互联网、企业内部网、局域网、移动通信网及其组合。
[0281] 上述的传输装置295用于经由一个网络接收或者发送数据,还可以用于处理器与存储器之间的数据传输。上述的网络具体实例可包括有线网络及无线网络。在一个实例中,
传输装置295包括一个网络适配器(Network Interface Controller,简称为NIC),其可通
过网线与其他网络设备与路由器相连从而可与互联网或局域网进行通讯。在一个实例中,
传输装置295为射频(Radio Frequency,简称为RF)模块,其用于通过无线方式与互联网进
行通讯。
[0282] 其中,具体地,存储器293用于存储应用程序。
[0283] 处理器291可以通过传输装置295调用存储器293存储的应用程序,以执行下述步骤:
[0284] 获取代码文件,其中,代码文件为包括字符序列的源程序文本;
[0285] 对代码文件中的字符序列进行词法分析,得到词法单元序列;
[0286] 解析代码文件,得到预设对象;对词法单元序列和预设对象进行关联以建立全局符号表,其中,全局符号表用于记录代码文件中的所有预设对象的数据信息;
[0287] 根据全局符号表对代码文件执行静态代码扫描,得到扫描结果,其中,扫描结果至少包括对词法单元序列的类型的查找结果。
[0288] 处理器291还用于执行下述步骤:在对词法单元序列和预设对象进行关联以建立全局符号表之前,在不改变代码文件的逻辑的情况下,对词法单元序列进行简化,得到简化
词法单元序列,对词法单元序列和预设对象进行关联以建立全局符号表包括:对简化词法
单元序列和预设对象进行关联以建立全局符号表。
[0289] 处理器291还用于执行下述步骤:在对词法单元序列进行简化,得到简化词法单元序列之后,根据简化词法单元序列建立树形语法结构,其中,树形语法结构为用于存储具有
预设语法的数据对象的树形结构,对简化词法单元序列和预设对象进行关联以建立全局符
号表包括:根据树形语法结构对简化词法单元序列和预设对象进行关联以建立全局符号
表。
[0290] 处理器291还用于执行下述步骤:获取词法单元序列中的单个代码表达式;以及根据单个代码表达式建立树形语法结构。
[0291] 处理器291还用于执行下述步骤:根据多个预设对象建立预设全局对象列表,其中,预设全局对象列表用于将代码文件中的同一类型的不同关键字部分进行关联;获取代
码文件中的别名指令并对代码文件中使用别名指令的代码执行处理,得到处理代码;在预
设全局对象列表中,根据处理代码将词法单元序列和与词法单元序列对应的预设对象执行
类型关联或者函数关联,得到全局符号表。
[0292] 处理器291还用于执行下述步骤:根据处理代码将与预设调用方法对应的词法单元序列和预设调用方法执行关联。
[0293] 处理器291还用于执行下述步骤:确定词法单元序列的类型的类型名并在预设全局对象列表中查找类型名;判断查找到的类型名是否符合预设条件;以及如果判断出查找
到的类型名符合预设条件,根据处理代码将词法单元序列和预设对象执行类型关联或者函
数关联。
[0294] 处理器291还用于执行下述步骤:拆分包括一个或者多个词法单元的词法单元段,得到拆分结果;将拆分结果压入栈中;根据栈中的栈顶元素确定词法单元序列的待查找类
型名;判断待查找类型名是否为预设类型名;如果判断出待查找类型名不为预设类型名,从
词法单元段所在的基类对象中查找待查找类型名;在从词法单元段所在的基类对象中未查
找到待查找类型名时,从全局符号表中查找待查找类型名;在从全局符号表中查找到待查
找类型名时,验证待查找类型名的类型限定名,其中,类型限定名为用于限定待查找类型名
的名称;判断类型限定名是否与预设限定名相匹配;以及如果判断出类型限定名与预设限
定名相匹配,返回待查找类型名以作为扫描结果。
[0295] 处理器291还用于执行下述步骤:在从词法单元段所在的基类对象中查找待查找类型名之后,在从词法单元段所在的基类对象中查找到待查找类型名时,验证待查找类型
名的类型限定名;判断类型限定名是否与预设限定名相匹配;以及如果判断出类型限定名
与预设限定名相匹配,返回待查找类型名以作为扫描结果。
[0296] 处理器291还用于执行下述步骤:在对代码文件中的字符序列进行词法分析,得到词法单元序列之前,对代码文件执行预处理,得到预处理代码,其中,预处理代码为符合预
设规则的字符流,对预处理代码中的字符序列进行词法分析,得到词法单元序列。
[0297] 处理器291还用于执行下述步骤:读取代码文件的字符流;将字符流组成词素;以及根据词素生成词法单元序列,其中,词法单元序列中的每个词法单元与词素一一对应。
[0298] 处理器291还用于执行下述步骤:在对词法单元序列和预设对象进行关联以建立全局符号表之后,根据全局符号表建立用于模拟代码文件的执行流程的数据流模型。
[0299] 处理器291还用于执行下述步骤:根据全局符号表模拟代码文件的执行流程,得到模拟结果;以及根据模拟结果建立数据流模型。
[0300] 处理器291还用于执行下述步骤:在根据全局符号表对代码文件的变量进行比较的情况下,确定并记录变量的取值范围。
[0301] 采用本发明实施例,提供了一种数据处理方法的方案。通过获取代码文件,其中,代码文件为包括字符序列的源程序文本;对代码文件中的字符序列进行词法分析,得到词
法单元序列;解析代码文件,得到预设对象;对词法单元序列和预设对象进行关联以建立全
局符号表,其中,全局符号表用于记录代码文件中的所有预设对象的数据信息;以及根据全
局符号表对代码文件执行静态代码扫描,得到扫描结果,其中,扫描结果至少包括对词法单
元序列的类型的查找结果,达到了对代码文件进行符号化处理的目的,从而实现了提高代
码扫描的准确性的技术效果,进而解决了相关技术中代码扫描的准确性低的技术问题。
[0302] 可选地,本实施例中的具体示例可以参考上述实施例中所描述的示例,本实施例在此不再赘述。
[0303] 本领域普通技术人员可以理解,图29所示的结构仅为示意,终端可以是智能手机(如Android手机、iOS手机等)、平板电脑、掌上电脑以及移动互联网设备(Mobile Internet 
Devices,MID)、PAD等终端设备。图29其并不对上述电子装置的结构造成限定。例如,终端还
可包括比图29中所示更多或者更少的组件(如网络接口、显示装置等),或者具有与图29所
示不同的配置。
[0304] 本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质
中,存储介质可以包括:闪存盘、只读存储器(Read-Only Memory,ROM)、随机存取器(Random 
Access Memory,RAM)、磁盘或光盘等。
[0305] 实施例6
[0306] 本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以用于执行数据处理方法的程序代码。
[0307] 可选地,在本实施例中,上述存储介质可以位于上述实施例所示的网络中的多个网络设备中的至少一个网络设备上。
[0308] 可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:
[0309] 获取代码文件,其中,代码文件为包括字符序列的源程序文本;
[0310] 对代码文件中的字符序列进行词法分析,得到词法单元序列;
[0311] 解析代码文件,得到预设对象;对词法单元序列和预设对象进行关联以建立全局符号表,其中,全局符号表用于记录代码文件中的所有预设对象的数据信息;
[0312] 根据全局符号表对代码文件执行静态代码扫描,得到扫描结果,其中,扫描结果至少包括对词法单元序列的类型的查找结果。
[0313] 可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在对词法单元序列和预设对象进行关联以建立全局符号表之前,在不改变代码文件的逻辑的情况下,对
词法单元序列进行简化,得到简化词法单元序列,对词法单元序列和预设对象进行关联以
建立全局符号表包括:对简化词法单元序列和预设对象进行关联以建立全局符号表。
[0314] 可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在对词法单元序列进行简化,得到简化词法单元序列之后,根据简化词法单元序列建立树形语法结构,其
中,树形语法结构为用于存储具有预设语法的数据对象的树形结构,对简化词法单元序列
和预设对象进行关联以建立全局符号表包括:根据树形语法结构对简化词法单元序列和预
设对象进行关联以建立全局符号表。
[0315] 可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:获取词法单元序列中的单个代码表达式;以及根据单个代码表达式建立树形语法结构。
[0316] 可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:根据多个预设对象建立预设全局对象列表,其中,预设全局对象列表用于将代码文件中的同一类型的不
同关键字部分进行关联;获取代码文件中的别名指令并对代码文件中使用别名指令的代码
执行处理,得到处理代码;在预设全局对象列表中,根据处理代码将词法单元序列和与词法
单元序列对应的预设对象执行类型关联或者函数关联,得到全局符号表。
[0317] 可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:根据处理代码将与预设调用方法对应的词法单元序列和预设调用方法执行关联。
[0318] 可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:确定词法单元序列的类型的类型名并在预设全局对象列表中查找类型名;判断查找到的类型名是否符合
预设条件;以及如果判断出查找到的类型名符合预设条件,根据处理代码将词法单元序列
和预设对象执行类型关联或者函数关联。
[0319] 可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:拆分包括一个或者多个词法单元的词法单元段,得到拆分结果;将拆分结果压入栈中;根据栈中的栈顶元
素确定词法单元序列的待查找类型名;判断待查找类型名是否为预设类型名;如果判断出
待查找类型名不为预设类型名,从词法单元段所在的基类对象中查找待查找类型名;在从
词法单元段所在的基类对象中未查找到待查找类型名时,从全局符号表中查找待查找类型
名;在全局符号表中查找到待查找类型名时,验证待查找类型名的类型限定名,其中,类型
限定名为用于限定待查找类型名的名称;判断类型限定名是否与预设限定名相匹配;以及
如果判断出类型限定名与预设限定名相匹配,返回待查找类型名以作为扫描结果。
[0320] 可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在从词法单元段所在的基类对象中查找待查找类型名之后,在从词法单元段所在的基类对象中查找到待
查找类型名时,验证待查找类型名的类型限定名;判断类型限定名是否与预设限定名相匹
配;以及如果判断出类型限定名与预设限定名相匹配,返回待查找类型名以作为扫描结果。
[0321] 可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在对代码文件中的字符序列进行词法分析,得到词法单元序列之前,对代码文件执行预处理,得到预处理
代码,其中,预处理代码为符合预设规则的字符流,对预处理代码中的字符序列进行词法分
析,得到词法单元序列。
[0322] 可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:读取代码文件的字符流;将字符流组成词素;以及根据词素生成词法单元序列,其中,词法单元序列中的
每个词法单元与词素一一对应。
[0323] 可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在对词法单元序列和预设对象进行关联以建立全局符号表之后,根据全局符号表建立用于模拟代码文件
的执行流程的数据流模型。
[0324] 可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:根据全局符号表模拟代码文件的执行流程,得到模拟结果;以及根据模拟结果建立数据流模型。
[0325] 可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在根据全局符号表对代码文件的变量进行比较的情况下,确定并记录变量的取值范围。
[0326] 可选地,本实施例中的具体示例可以参考上述实施例中所描述的示例,本实施例在此不再赘述。
[0327] 可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者
光盘等各种可以存储程序代码的介质。
[0328] 上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
[0329] 上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本发明的技
术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软
件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一
台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所
述方法的全部或部分步骤。
[0330] 在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
[0331] 在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一
种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者
可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之
间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连
接,可以是电性或其它的形式。
[0332] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个
网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目
的。
[0333] 另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单
元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0334] 以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应
视为本发明的保护范围。