数据处理方法和装置转让专利
申请号 : CN201610613852.7
文献号 : CN106227668B
文献日 : 2017-11-17
发明人 : 邹越 , 严明 , 张蓓 , 黄斌 , 袁明凯 , 魏学峰
申请人 : 腾讯科技(深圳)有限公司
摘要 :
权利要求 :
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所述的装置,其特征在于,
所述装置还包括:第二获取单元,用于在对所述词法单元序列和所述预设对象进行关联以建立所述全局符号表之前,在不改变所述代码文件的逻辑的情况下,对所述词法单元序列进行简化,得到简化词法单元序列,所述关联单元用于对所述简化词法单元序列和所述预设对象进行关联以建立所述全局符号表。
说明书 :
数据处理方法和装置
技术领域
背景技术
法结构,需要通过编译的语言代码作为输入,一旦输入的语言代码存在语法错误,那么构建
出来的全局抽象语法树结构将会是错误且没有参考意义的。这样在编译不通过的情况下对
代码进行检测、分析,会影响整体符号化流程和结果。因此,根据抽象语法树进行符号化的
数据处理准确性低,对符号化的代码进行扫描的准确性低,进而使程序员不易发现代码中
存在的缺陷,降低了使用性能和安全性,降低了程序员处理代码的效率,以及提高了修复成
本。
发明内容
行词法分析,得到词法单元序列;解析代码文件,得到预设对象;对词法单元序列和预设对
象进行关联以建立全局符号表,其中,全局符号表用于记录代码文件中的所有预设对象的
数据信息;以及根据全局符号表对代码文件执行静态代码扫描,得到扫描结果,其中,扫描
结果至少包括对词法单元序列的类型的查找结果。
单元,用于对代码文件中的字符序列进行词法分析,得到词法单元序列;解析单元,用于解
析代码文件,得到预设对象;关联单元,用于对词法单元序列和预设对象进行关联以建立全
局符号表,其中,全局符号表用于记录代码文件中的所有预设对象的数据信息;以及扫描单
元,用于根据全局符号表对代码文件执行静态代码扫描,得到扫描结果,其中,扫描结果至
少包括对词法单元序列的类型的查找结果。
对象;对词法单元序列和预设对象进行关联以建立全局符号表,其中,全局符号表用于记录
代码文件中的所有预设对象的数据信息;以及根据全局符号表对代码文件执行静态代码扫
描,得到扫描结果,其中,扫描结果至少包括对词法单元序列的类型的查找结果,由于通过
对词法单元序列和预设对象进行关联以建立全局符号表,根据全局符号表对代码文件执行
静态代码扫描,得到扫描结果,达到了对代码文件进行符号化处理的目的,从而实现了提高
代码扫描的准确性的技术效果,进而解决了相关技术中代码扫描的准确性低的技术问题。
附图说明
具体实施方式
本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人
员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范
围。
的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或
描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆
盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于
清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品
或设备固有的其它步骤或单元。
端的硬件结构框图。如图1所示,服务器102通过网络与终端104进行连接,上述网络包括但
不限于:广域网、城域网或局域网,终端104并不限定于PC、手机、平板电脑等。本发明实施例
的数据处理方法可以由服务器102来执行,也可以由终端104来执行,还可以是由服务器102
和终端104共同执行。其中,终端104执行本发明实施例的数据处理方法也可以是由安装在
其上的客户端来执行。
言,字符序列也即字符流。通过输入代码文件,进而获取该代码文件。
器一般以函数的形式存在,供语法分析器调用。完成词法分析任务的程序称为词法分析程
序或词法分析器或扫描器。从左至右地对源程序进行扫描,按照语言的词法规则识别各类
单词,并产生相应单词的属性。
是后续处理和上层检查项遍历代码的基本数据结果,其本质是一个双向链表,维护所有的
词法单元,比如,if、for为词法单元。其中,双向链表也即双链表,是链表的一种,它的每个
数据结点中都有两个指针,分别指向直接后继和直接前驱,因此从双向链表中的任意一个
结点开始,都可以很方便地访问它的前驱结点和后继结点。
的属性,指向配对词法单元的指针的属性,该配对词法单元为与原词法单元相匹配的词法
单元,比如,原词法单元为“(”,则配对词法单元为“)”。与词法单元相关联的属性还包括词
法单元的类型,比如,数字、字符串、变量、函数、关键字等。与词法单元相关联的属性还包括
词法单元指向符号表的指针,也即,变量词法单元指向符号表中的变量对象,函数词法单元
指向与其对应的函数对象。与词法单元相关联的属性还包括词法单元的行号,词法单元的
语法树结构指针,该语法树结构指针为用于维护词法单元的抽象语法树结构。与词法单元
相关联的属性还包括词法单元的数据流结构指针。
码文件,依次解析所有代码文件,分别生成与代码文件相对应的类、命名空间、方法字段等
预设对象,并建立所有预设对象之间的包含关系。该预设对象可以是所有对象的基类,对应
具有逻辑意义的代码,可以是类、方法、属性等,用于区分方法中的词法单元段对应的基类
对象,也可以是命名空间、枚举、方法、字段、委托、事件、属性、枚举器等。预设对象具有对应
的类型,类型之间的继承关系主要从代码层面的结构是否相似来考虑。
立全局符号表的过程也即对代码文件进行符号化的过程。
码中的每个标识符都和它的声明或使用信息绑定在一起,比如其数据类型、作用域以及内
存地址。符号表在编译程序工作的过程中需要不断收集、记录和使用源程序中一些语法符
号的类型和特征等相关信息。这符号表些信息一般以表格形式存储于系统中。如常数表、变
量名表、数组名表、过程名表、标号表等等,统称为符号表。对于符号表组织、构造和管理方
法的好坏会直接影响编译系统的运行效率。
将代码文件中的同一类型部分的不同关键字部分链接起来,从而建立全局符号表,该全局
符号表包括键(key)和与键对应的键值(Value),用于记录代码文件中的所有预设对象的数
据信息,记录了代码中所有逻辑对象的格式化信息,可以用于扫描代码文件中的所有代码,
从而提高了代码扫描的准确性。
无需经过编译器的编译,无需搭建源代码的运行环境,而直接使用一些扫描工具对源代码
进行扫描,可以节省大量的人力和时间成本,提高开发效率,并且找出源代码中存在的很多
只靠人力无法发现的一些安全漏洞,从而提高了代码扫描的准确性,大大降低了项目中的
安全风险,提高了软件质量。这样为上层静态代码检查项扫描提供了准确、高效的符号化结
果,使得代码中的检查项具备语法层面、跨函数扫描、语义层面以及逻辑分析能力,最终输
出的代码扫描结果能够帮助开发人员、测试人员快速定位代码中隐藏的问题,进而提高了
代码质量,降低后期对代码的修复成本。在充分考虑代码文件缺失、类型定义缺失和语法错
误的情况下,该实施例的代码文件的符号化过程不需要编译输入的代码文件,也不需要代
码文件能够编译通过。
得到预设对象;对词法单元序列和预设对象进行关联以建立全局符号表,全局符号表用于
记录代码文件中的所有预设对象的数据信息;根据全局符号表对代码文件执行静态代码扫
描,得到扫描结果,扫描结果至少包括对词法单元序列的类型的查找结果,可以解决了相关
技术中代码扫描的准确性低的技术问题,进而达到提高代码扫描的准确性的技术效果。
序列,对词法单元序列和预设对象进行关联以建立全局符号表包括:对简化词法单元序列
和预设对象进行关联以建立全局符号表。
之前,在不改变代码文件的逻辑的情况下,对词法单元序列进行简化,也即,对词法单元序
列进行逻辑上的等价替换,得到简化词法单元序列。通过简化词法单元序列的步骤统一了
代码文件的风格,从而减小全局符号化的成本,以及提高了上层静态扫描的准确性。在对词
法单元序列进行简化,得到简化词法单元序列之后,对简化词法单元序列和预设对象进行
关联以建立全局符号表。
法的数据对象的树形结构,对简化词法单元序列和预设对象进行关联以建立全局符号表包
括:根据树形语法结构对简化词法单元序列和预设对象进行关联以建立全局符号表。
表一个运算符,它的两个子节点分别代表该运算符的两个运算分量。树形语法结构包含了
表达式的逻辑结构和运算符的优先级关系,从而提高代码场景匹配的准确性以及实现代码
文件对应的场景的效率。在对词法单元序列进行简化,得到简化词法单元序列之后,根据简
化词法单元序列建立树形语法结构,该树形语法结构为用于存储具有预设语法的数据对象
的树形结构。在根据简化词法单元序列建立树形语法结构之后,根据树形语法结构对简化
词法单元序列和预设对象进行关联以建立全局符号表。
词法单元序列进行简化,得到简化词法单元序列之后,获取词法单元序列中的单个代码表
达式。
句和else语句的逻辑关系,而该实施例中的树形语法结构与传统编译过程中的树形语法结
构不同,该实施例的树形语法结构只针对单个代码表达式建立树形语法结构,并不建立代
码表达式和代码表达式之间的结构关系。由于该实施例指出不完整的或者不能通过编译的
代码文件,一旦输入的代码文件按存在语法错误,那么构建出来的树形语法结构将会是错
误的并且是没有意义的,而构建的单个表达式的树形语法结构,如果出现错误,也只是整个
代码文件的局部出现错误,并不影响代码文件中的其它代码表达式的树形语法结构,从而
提高了树形语法结构在构建过程中的可靠性。
程中的可靠性。
表,获取代码文件中的别名指令并对代码文件中使用别名指令的代码执行处理,得到处理
代码;在预设全局对象列表中,根据处理代码将词法单元序列和与词法单元序列对应的预
设对象执行关联以得到全局符号表。
号表的方法包括以下步骤:
局对象列表用于将代码文件中的同一类型的不同关键字部分进行关联,也即,预设对象列
表用于将代码文件中的同一类型的不同部分的定义关联起来。
文件对应一个预设对象列表,该预设对象列表可以包括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)直接进
行访问的数据结构。
空间或者类型指定的别名,也即,标识符。该别名指令直接包含此指令的编译单元,在命名
空间内有效。该别名指令对代码文件的类型查找会造成干扰,可以对代码文件中使用该别
名指令的地方进行词法单元层面上的展开,得到处理代码。
局符号表。类型关联和函数关联是将与词法单元对应的变量、类型以及方法对象进行绑定,
这样在遍历词法单元序列时可以知道当前遍历的词法单元对应的变量类型,进而确定该变
量是值类型还是引用类型,函数关联实现了函数的调用,确定是否引用了所关注的变量等,
从而显著地提高上层检查项在语义层面和函数跟踪方面的能力。
码文件中使用别名指令的代码执行处理,得到处理代码;在预设全局对象列表中,根据处理
代码将词法单元序列和与词法单元序列对应的预设对象执行类型关联或者函数关联,得到
全局符号表,实现了对词法单元序列和预设对象进行关联以建立全局符号表的目的。
和与词法单元序列对应的预设对象执行关联;根据处理代码将与代码文件中的变量对应的
词法单元序列和变量执行关联。
对象执行关联;类型关联还可以是根据处理代码将与代码文件中的变量对应的词法单元序
列和变量执行关联,可以是变量对应的词法单元和变量定义关联,从而实现了全局符号表
建立过程中的类型关联。
预设调用方法执行关联。
实现了全局符号表建立过程中的函数关联。
设条件的情况下根据处理代码将词法单元序列和预设对象执行类型关联或者函数关联。
步骤:
名,确定词法单元的类型名。在预设全局对象列表中查找该类型名。
类型名是否符合预设条件,可选地,确定离词法单元对应的对象最近的类型名符合预设条
件。
已经对别名指令进行处理过的代码将词法单元序列和与词法单元序列对应的预设对象执
行类型关联或者函数关联。
预设对象执行类型关联或者函数关联,从而实现了根据处理代码将词法单元序列和与词法
单元序列对应的预设对象执行类型关联或者函数关联的目的,显著提高上层检查项在语义
层面和函数调用跟踪方面的性能。
从词法单元段所在的基类对象中查找待查找类型名,在从词法单元段所在的基类对象中未
查找到待查找类型名时,从预设全局对象列表中查找待查找类型名,在从预设全局对象列
表中查找到待查找类型名时,且在类型限定名与预设限定名相匹配时,返回待查找类型名
以作为扫描结果。
下步骤:
类型对应的词法单元段按照层次进行拆分,得到拆分结果。
元段,得到拆分结果之后,将该拆分结果压入栈S中。
查找类型的类型名,不包括待查找类型的类型限定名。
词法单元序列的待查找类型名之后,判断待查找类型名是否为系统类型名。
TokenSection所在的物理文件中的对象的基类CScope开始,从下往上查找待查找类型名。
表查找待查找类型名。
名称。可选地,如果在从预设全局对象列表中未查找到待查找类型名时,结束对代码文件执
行静态代码扫描的过程。
类型名是否为预设类型名;如果判断出待查找类型名不为预设类型名,从词法单元段所在
的基类对象中查找待查找类型名;在从词法单元段所在的基类对象中未查找到待查找类型
名时,从预设全局对象列表中查找待查找类型名,在从预设全局对象列表中查找到待查找
类型名时,验证待查找类型名的类型限定名,类型限定名为用于限定待查找类型名的名称;
判断类型限定名是否与预设限定名相匹配;如果判断出类型限定名与预设限定名相匹配,
返回待查找类型名以作为扫描结果,从而实现了根据全局符号表对代码文件执行静态代码
扫描的目的。
类对象中查找到待查找类型名时,验证待查找类型名的类型限定名;判断类型限定名是否
与预设限定名相匹配;以及如果判断出类型限定名与预设限定名相匹配,返回待查找类型
名以作为扫描结果。
以下步骤:
TokenSection所在的物理文件中的对象的基类CScope开始,从下往上查找到待查找类型名
时,验证待查找类型名的类型限定名。
匹配。
配,继续执行步骤S605,从词法单元段所在的基类对象中查找待查找类型名。
型限定名是否与预设限定名相匹配;如果判断出类型限定名与预设限定名相匹配,返回待
查找类型名以作为扫描结果,从而实现该根据全局符号表对代码文件执行静态代码扫描的
目的。
的字符流,对代码文件中的字符序列进行词法分析,得到词法单元序列包括:对预处理代码
中的字符序列进行词法分析,得到词法单元序列。
符序列。在对代码文件执行预处理,得到预处理代码之后,对预处理代码中的字符序列进行
词法分析,得到词法单元序列。
统一编码,输出编码字符流。
执行不造成任何影响,因而删除代码文件的注释;按照预设配置处理代码文件的预处理指
令,可以根据项目配置处理预处理指令,该预处理指令可以为#define,#if,#error,#line
等。可以对代码文件统一编码,输出编码字符流,比如,ASCII编码字符流,从而实现对代码
文件的预处理。
列来实现。
的音义结合体,它不一定是最小的音义结合成分,而词内的语素只从是否为最小的音义结
合成分来确定。
的字符流进行词法分析,得到词法单元序列的目的。
息;可以对于简单函数,比如,对于返回常数值或者返回值只是经过简单算术运算,根据全
局符号表模拟计算函数返回值;可以根据全局符号表处理位运算符;可以根据全局符号表
对于for循环中的标准模式进行模拟;当变量被赋值为已知值时,可以根据全局符号表跟踪
后续变量的使用情况,更新变量的数据流字段等。
范围。
能的取值情况,然后从If条件向前向后解析变量的使用情况,更新数据流字段。
单元序列和预设对象进行关联以建立全局符号表,全局符号表用于记录代码文件中的所有
预设对象的数据信息;以及根据全局符号表对代码文件执行静态代码扫描,得到扫描结果,
扫描结果至少包括对词法单元序列的类型的查找结果,可以用于上层检查项的开发,发现
代码中可能存在的缺陷,性能和安全问题,能够让程序员高效、低成本修复这些问题,从而
提升代码质量,使符号化结果准确、高效,可以采用上下文敏感的类型查找算法,相比简单
的字符串匹配来讲,具有更高的准确性,另外在数据结构设计上,尽可能减少结构大小,充
分利用缓存,在内存和效率上都有不错的表现,能够在编译不通过的情况下进行检测,分
析,不影响整体符号化流程和结果,提高了代码扫描的准确性,能够基于C++语言实现,可以
支持Windows\Linux\Mac系统。
一定程度的逻辑分析能力。最终输出的代码扫描结果能够帮助开发、测试人员快速定位代
码中隐藏的问题、提升代码质量,降低后期的修复成本。适用于所有使用C#语言的项目的静
态代码检查。
化过程不需要编译输入的C代码,也不需要C代码能够编译通过。
立变量使用规则、函数调用链接,最后,跟踪代码中变量的使用情况,推测变量可能的取值
范围,最终建立变量数据流模型,为上层静态代码检查项提供检查所需的符号化结果和调
用接口。
法结构,根据树形语法结构建立全局符号表,根据全局符号表建立数据流模型,提高了代码
文件扫描的准确性。
掉注释;依据项目配置处理预处理指令(#define,#if,#error,#line等);统一代码文件编
码,输出ASCII编码字符流。
“/*This is the entry point.*/”,预处理指令“#if TEST CMD”,预处理指令“//defind”,
预处理指令“#else”,无效语句“Console.WriteLie(“TEST_CMD is not defind.”);//not
defind.”,预处理指令“#endif”,以及空格等。
指令,统一代码文件编码,等处理之后,对代码文件进行预处理之后的代码不包括图11所示
的注释“/*This is the entry point.*/”,预处理指令“#if TEST CMD”,预处理指令“//
defind”,预处理指令“#else”,无效语句“Console.WriteLie(“TEST_CMD is not
defind.”);//not defind.”,预处理指令“#endif”,以及多余空格等,从而为后续词法分析
提供规范的字符流。
做Token list。Token list是后续处理和上层检查项遍历代码的基本数据结构,是一个代
码文件经过词法分析之后生成的所有Token的集合。
理代码“for(int index=0;index<42;++index)”进行词法分析,得到词法单元序列:
“for”、“(”、“int”、“index”、“=”、“0”、“;”、“index”、“<”、“42”、“;”、“++”、“index”、“)”。
操作,从而很好地发现代码缺陷。词法单元Token除了包含该词素的字符串值以外,还有与
词法单元Token相关联的其它属性:比如,指向下一个词法单元Token的指针;指向上一个词
法单元Token的指针;指向“配对”词法单元Token的指针(对于左括号来说,即指向右括号的
指针);词法单元Token的类型(数字,字符串,变量,函数,关键字等);词法单元Token指向符
号表的指针(变量Token指向符号表中的变量对象,函数Token指向其对应的函数对象);词
法单元Token的行号;词法单元Token的语法树结构指针(维护词法单元Token的抽象语法树
结构);词法单元Token的数据流结构指针。
→“>”→“i”→“(”→“if”,其中,“(”与“)”配对。
以及提高上层静态扫描的准确性,在建立好T词法单元序列Token list之后,需要一些简化
步骤来使代码文件统一代码风格。
化default关键字之后,得到简化词法单元序列“int i1=0;”。
该运算符的两个运算分量。树形语法结构包含了表达式的逻辑结构和运算符的优先级关
系,这个特性能够提高代码场景匹配的准确性以及实现该场景的效率。
比如if-else语句段中if语句和else语句的逻辑关系,而该实施例中的抽象语法树结构只
针对单个代码表达式中建立抽象语法结构,并不建立代码表达式和代码表达式之间的结构
关系。该实施例支持不完整的或者不能通过编译的C#代码作为输入,一旦输入的C#代码存在
语法错误,那么构建出来的全局抽象语法树结构将会是错误且没有参考意义的,而构建单
表达式的抽象语法树结构,如果出现错误,那也只是局部的,不影响其它表达式的抽象语法
树结构。
结构。
CSymbolFile对象,以CSI对象的全限定名作为key,对应的CSI对象作为value,建立全局类
型哈希表,处理代码中的别名指令,类型声明Token跟对应的类型对象关联;变量Token跟变
量定义关联,方法调用Token跟对应的方法对象关联,从而实现了对全局符号表的建立。
中CSI代表一个类Class,结构Struct或者接口Interface对象,因为这三种类型在代码层面
有相似的结构,所以整合到了一起。CSymbolFile对象代表物理上的一个代码文件,而它继
承自命名空间CNamespace是因为代码文件的最上层可以被认为是隐藏了“namespace
global{…}”的一个全局namespace,两者具有相同的逻辑含义。
一个类型的不同部分的定义关联起来。建立全局类型哈希表的过程中,就会把同一类型的
不同partial关键字部分链接起来,该全局类型哈希表包括键Key和键值Value,其中,键Key
包括Namepace.A与classA关联,Namepace.B与class partial B关联,Namepace.C与class
C关联。
后为“class B:N1.N2.A”,从而避免了该别名指令对后续的类型查找造成干扰。
Token所对应的变量类型,该变量是值类型还是引用类型,这个函数调用的实现是否引用了
所关注的变量等等,这能够显著提高上层检查项在语义层面和函数跟踪方面的能力。
#
图。如图22所示,理论上来讲,class B的基类A指向N1.A或者N2.A都是可以的,而实际上,C
编译器在遇到这种情况采取的是“就近原则”,即优先匹配“最近”的类型,对于以上例子,编
译器会把A指向N2.A。
描,这是对扫描结果正确性的一个重要的保障。
行步骤S2306。
单元段所在的基类对象开始,从下往上查找类型名N,判断是否查找到类型名N,如果判断出
没有查找到类型名N,从全局类型哈希表中查找类型名N,判断在全局类型哈希表中是否查
找到类型名N。如果判断出在全局类型哈希表中查找到类型名N,验证栈中的类型限定名,判
断栈中的类型限定名是否与预设类型限定名相匹配。如果判断出栈中的类型限定名与预设
类型限定名相匹配,返回匹配到的类型,实现了对代码文件执行静态代码扫描,提高了代码
文件扫描的准确性。
用。
到词法单元序列;解析代码文件,得到预设对象;对词法单元序列和预设对象进行关联以建
立全局符号表,全局符号表用于记录代码文件中的所有预设对象的数据信息;以及根据全
局符号表对代码文件执行静态代码扫描,得到扫描结果,扫描结果至少包括对词法单元序
列的类型的查找结果,得到图25所示的代码,其中,图25是根据本发明实施例的一种符号化
输出的调试文件的示意图。其中,相同变量ID代表同一个变量,并且能够关联该变量的定
义,通过函数Func可以直接引用其定义。
前上下文可能的取值范围。
理位运算符&,对于表达式“i=j&4;”,变量i的结果只能是4或者0;对于for循环中标准模
式:比如“for(int i=0;i<10;++i)”,模拟执行i从0到9的过程;变量被赋值为已知值时,跟
踪后续变量的使用情况,更新变量的数据流字段;如果if条件语句对变量进行了大小、判等
比较,那么可以推测该变量在当前上下文中可能的取值情况,然后从if条件向前向后解析
变量的使用情况,更新相应的数据流字段。
匹配来讲,具有更高的准确性,另外在数据结构设计上,尽可能减少结构大小,充分利用缓
存,在内存和效率上都有不错的表现。本发明实施例不基于编译,能够在编译不通过的情况
下进行检测,分析,不影响整体符号化流程和结果。可以实现基于C++语言,目前可以支持
Windows\Linux\Mac系统。
语言在语法和代码风格上都和C#很相似,因此本方案对于Java语言的支持代价会比较小;
C/C++语言是基于头文件包含的,在方案细节上可能会有变化。本发明的技术方案同样对中
间语言的支持,C#语言一般是运行在“托管虚拟机”上(.NET或者Mono)的,C#语言会被编译成
中间语言(IL),因此,基于本方案中全局符号表的数据结构和接口,可以直接全局符号化C#
对应的IL语言,用户只需要提供编译好的程序集文件(dll文件或者exe文件等)即可。类型
和函数查找实现更加容易,数据流模型以及AST的精准度也会提高。
依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知
悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明
所必须的。
情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有
技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储
介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算
机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
元10、分析单元20、解析单元30、关联单元40和扫描单元50。
中的解析单元30可以用于执行本申请实施例1中的步骤S206,该实施例中的关联单元40可
以用于执行本申请实施例1中的步骤S208,该实施例中的扫描单元50以用于执行本申请实
施例1中的步骤S210。
据处理装置还包括:第二获取单元60。
列。
法结构为用于存储具有预设语法的数据对象的树形结构。上述关联单元40用于根据树形语
法结构对简化词法单元序列和预设对象进行关联以建立全局符号表。
树形语法结构。
中,预设全局对象列表用于将代码文件中的同一类型的不同关键字部分进行关联;第二获
取模块用于获取代码文件中的别名指令并对代码文件中使用别名指令的代码执行处理,得
到处理代码;关联模块,用于在预设全局对象列表中,根据处理代码将词法单元序列和与词
法单元序列对应的预设对象执行类型关联或者函数关联,得到全局符号表。
文件中的变量对应的词法单元序列和变量执行关联。
用于判断查找到的类型名是否符合预设条件;以及关联子模块用于在判断出查找到的类型
名符合预设条件时,根据处理代码将词法单元序列和预设对象执行类型关联或者函数关
联。
果压入栈中;确定模块,用于根据栈中的栈顶元素确定词法单元序列的待查找类型名;第一
判断模块,用于判断待查找类型名是否为预设类型名;第一查找模块,用于在判断出待查找
类型名不为预设类型名时,从词法单元段所在的基类对象中查找待查找类型名;第二查找
模块,用于在从词法单元段所在的基类对象中未查找到待查找类型名时,从全局符号表中
查找待查找类型名;第一验证模块,与在全局符号表中查找到待查找类型名时,验证待查找
类型名的类型限定名,其中,类型限定名为用于限定待查找类型名的名称;第二判断模块,
用于判断类型限定名是否与预设限定名相匹配;以及第一返回模块,用于在判断出类型限
定名与预设限定名相匹配时,返回待查找类型名以作为扫描结果。
单元段所在的基类对象中查找到待查找类型名时,验证待查找类型名的类型限定名;第三
判断模块,用于判断类型限定名是否与预设限定名相匹配;以及第二返回模块,用于在判断
出类型限定名与预设限定名相匹配时,返回待查找类型名以作为扫描结果。
理代码为符合预设规则的字符流,分析单元20用于对预处理代码中的字符序列进行词法分
析,得到词法单元序列。
编码字符流。
生成词法单元序列,其中,词法单元序列中的每个词法单元与词素一一对应。
数据流模型。
立数据流模型。
分可以运行在如图1所示的硬件环境中,可以通过软件实现,也可以通过硬件实现。
分可以运行在如图1所示的硬件环境中,可以通过软件实现,也可以通过硬件实现,其中,硬
件环境包括网络环境。
的发送装置),如图29所示,该终端还可以包括输入输出设备297。
模块,从而执行各种功能应用以及数据处理,即实现上述的数据处理方法。存储器293可包
括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或
者其他非易失性固态存储器。在一些实例中,存储器293可进一步包括相对于处理器291远
程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限
于互联网、企业内部网、局域网、移动通信网及其组合。
传输装置295包括一个网络适配器(Network Interface Controller,简称为NIC),其可通
过网线与其他网络设备与路由器相连从而可与互联网或局域网进行通讯。在一个实例中,
传输装置295为射频(Radio Frequency,简称为RF)模块,其用于通过无线方式与互联网进
行通讯。
词法单元序列,对词法单元序列和预设对象进行关联以建立全局符号表包括:对简化词法
单元序列和预设对象进行关联以建立全局符号表。
预设语法的数据对象的树形结构,对简化词法单元序列和预设对象进行关联以建立全局符
号表包括:根据树形语法结构对简化词法单元序列和预设对象进行关联以建立全局符号
表。
码文件中的别名指令并对代码文件中使用别名指令的代码执行处理,得到处理代码;在预
设全局对象列表中,根据处理代码将词法单元序列和与词法单元序列对应的预设对象执行
类型关联或者函数关联,得到全局符号表。
到的类型名符合预设条件,根据处理代码将词法单元序列和预设对象执行类型关联或者函
数关联。
型名;判断待查找类型名是否为预设类型名;如果判断出待查找类型名不为预设类型名,从
词法单元段所在的基类对象中查找待查找类型名;在从词法单元段所在的基类对象中未查
找到待查找类型名时,从全局符号表中查找待查找类型名;在从全局符号表中查找到待查
找类型名时,验证待查找类型名的类型限定名,其中,类型限定名为用于限定待查找类型名
的名称;判断类型限定名是否与预设限定名相匹配;以及如果判断出类型限定名与预设限
定名相匹配,返回待查找类型名以作为扫描结果。
名的类型限定名;判断类型限定名是否与预设限定名相匹配;以及如果判断出类型限定名
与预设限定名相匹配,返回待查找类型名以作为扫描结果。
设规则的字符流,对预处理代码中的字符序列进行词法分析,得到词法单元序列。
法单元序列;解析代码文件,得到预设对象;对词法单元序列和预设对象进行关联以建立全
局符号表,其中,全局符号表用于记录代码文件中的所有预设对象的数据信息;以及根据全
局符号表对代码文件执行静态代码扫描,得到扫描结果,其中,扫描结果至少包括对词法单
元序列的类型的查找结果,达到了对代码文件进行符号化处理的目的,从而实现了提高代
码扫描的准确性的技术效果,进而解决了相关技术中代码扫描的准确性低的技术问题。
Devices,MID)、PAD等终端设备。图29其并不对上述电子装置的结构造成限定。例如,终端还
可包括比图29中所示更多或者更少的组件(如网络接口、显示装置等),或者具有与图29所
示不同的配置。
中,存储介质可以包括:闪存盘、只读存储器(Read-Only Memory,ROM)、随机存取器(Random
Access Memory,RAM)、磁盘或光盘等。
词法单元序列进行简化,得到简化词法单元序列,对词法单元序列和预设对象进行关联以
建立全局符号表包括:对简化词法单元序列和预设对象进行关联以建立全局符号表。
中,树形语法结构为用于存储具有预设语法的数据对象的树形结构,对简化词法单元序列
和预设对象进行关联以建立全局符号表包括:根据树形语法结构对简化词法单元序列和预
设对象进行关联以建立全局符号表。
同关键字部分进行关联;获取代码文件中的别名指令并对代码文件中使用别名指令的代码
执行处理,得到处理代码;在预设全局对象列表中,根据处理代码将词法单元序列和与词法
单元序列对应的预设对象执行类型关联或者函数关联,得到全局符号表。
预设条件;以及如果判断出查找到的类型名符合预设条件,根据处理代码将词法单元序列
和预设对象执行类型关联或者函数关联。
素确定词法单元序列的待查找类型名;判断待查找类型名是否为预设类型名;如果判断出
待查找类型名不为预设类型名,从词法单元段所在的基类对象中查找待查找类型名;在从
词法单元段所在的基类对象中未查找到待查找类型名时,从全局符号表中查找待查找类型
名;在全局符号表中查找到待查找类型名时,验证待查找类型名的类型限定名,其中,类型
限定名为用于限定待查找类型名的名称;判断类型限定名是否与预设限定名相匹配;以及
如果判断出类型限定名与预设限定名相匹配,返回待查找类型名以作为扫描结果。
查找类型名时,验证待查找类型名的类型限定名;判断类型限定名是否与预设限定名相匹
配;以及如果判断出类型限定名与预设限定名相匹配,返回待查找类型名以作为扫描结果。
代码,其中,预处理代码为符合预设规则的字符流,对预处理代码中的字符序列进行词法分
析,得到词法单元序列。
每个词法单元与词素一一对应。
的执行流程的数据流模型。
光盘等各种可以存储程序代码的介质。
术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软
件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一
台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所
述方法的全部或部分步骤。
种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者
可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之
间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连
接,可以是电性或其它的形式。
网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目
的。
元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
视为本发明的保护范围。