提升源代码静态分析工具鲁棒性的方法技术

技术编号:36540153 阅读:27 留言:0更新日期:2023-02-01 16:36
本发明专利技术公开了提升源代码静态分析工具鲁棒性的方法,包括以下步骤:步骤一,设计鲁棒性编译前端;步骤二,设计语法转译器;步骤三,提升原分析工具的鲁棒性;步骤四,添加零配置;所述步骤1.2中,词法解析模块预留了nextToken接口可供子类实现;本发明专利技术通过实现鲁棒性编译前端生成AST,并将该AST转译成原分析工具的AST,复用已有分析工具的代码分析能力,该编译前端内置了可扩展的预处理模块,拥有较强的编译错误恢复能力,较强的可扩展性,能够保证在复用已有代码资产的前提下,提高分析工具的鲁棒性,在被测软件不完整配置的分析条件下,仍能给出准确的分析结果,降低了静态分析工具使用者的门槛,提升工具的用户体验。提升工具的用户体验。提升工具的用户体验。

【技术实现步骤摘要】
提升源代码静态分析工具鲁棒性的方法


[0001]本专利技术涉及程序分析与测试
,具体为提升源代码静态分析工具鲁棒性的方法。

技术介绍

[0002]源代码静态分析工具是一种重要的软件测试工具,该类工具通过静态地分析被测软件的源代码从而发现软件编码中的违规和潜在的缺陷,已经广泛应用在各类软件的开发和测试中。静态分析工具的核心组成包括语法分析前端和检测器引擎,其中语法分析前端负责将被测软件的源代码解析形成中间数据结构,检测器引擎基于中间数据结构进行特定的规则检查。静态分析工具中的语法分析前端与编译器前端类似,一般要求按照编译的配置对被测软件代码进行完整编译,例如知名的静态分析工具Coverity和Klocwork、Clang Static Analyzer等。
[0003]而在实际使用静态分析工具的场景中,用户经常难以获得完整的编译环境和编译配置,如编译链接选项、预定义宏、头文件搜索路径以及依赖的相关源代码,用户会采取两种方式解决:一是采用不完整的编译环境和编译配置,静态分析工具的语法分析前端出错使得最终分析结果大量缺失或不准确;二是花费大量的时间获得完整的编译环境和编译配置,然后在静态分析工具中进行配置、分析。无论哪种解决方式,都大大影响了用户使用这一工具的效果。导致这种情况的根本原因在于静态分析工具的鲁棒性不足,即不能在不完整编译配置下进行较准确的分析,具体体现在以下几个方面:
[0004]一是对头文件和宏定义缺失时,代码预处理的鲁棒性不够强。已有的对源程序进行预处理的方法通常是通过调用编译器的预处理命令,将预处理后的文件作为静态分析工具的输入。这导致错误处理能力不够,当调用编译器的预处理命令时,一旦找不到特定的头文件,就结束预处理,导致不能进行后续的静态分析;
[0005]二是代码解析错误恢复能力不够强。已有的方法用于解析代码的编译前端通常需要对源程序进行完整的类型检查,或者使用Parser Generator解析用户定义的语法文件。这些方法通常有比较弱的错误恢复能力,即在解析发生错误时,可能会直接导致解析模块崩溃,以至于无法进行后续的静态分析;
[0006]三是编译前端的方言兼容性不够强。已有的解析C语言程序的编译前端通常只支持单一的C语言标准和编译平台,例如C99标准,GNUC编译平台。这就导致一旦遇到新的编译平台/方言,就会解析出错,所以静态分析工具需要花费较大成本支持各种编译平台(例如C51,DSP,ARM,MS等)的C语言方言,当遇到一种此前未知的方言时就会不兼容。

技术实现思路

[0007]本专利技术的目的在于提供提升源代码静态分析工具鲁棒性的方法,以解决上述
技术介绍
中提出的问题。
[0008]为实现上述目的,本专利技术提供如下技术方案:提升源代码静态分析工具鲁棒性的
方法,包括以下步骤:步骤一,设计鲁棒性编译前端;步骤二,设计语法转译器;步骤三,提升原分析工具的鲁棒性;步骤四,添加零配置;
[0009]其中在上述步骤一中,包括以下步骤:
[0010]1.1设计鲁棒性编译前端中词法分析模块的预处理功能,即语法解析模块根据不同的预处理指令,执行不同的流程;
[0011]1.2设计鲁棒性编译前端中词法分析模块的词法分析功能,即根据预先设计的Token匹配状态机,词法分析模块将预处理后的字符流切分为Token流,每个Token为最小的一个语法单元;
[0012]1.3设计鲁棒性编译前端中语法解析模块的语法解析功能,即语法解析模块能将词法解析的Token流作为输入,并利用递归下降的方法进行语法解析,生成抽象语法树AST;
[0013]1.4实现上述步骤1.1、步骤1.2和步骤1.3的各模块功能后,得到鲁棒性编译前端;
[0014]其中在上述步骤二中,针对步骤1.3中生成的AST,实现一套访问者设计模式接口,语法转译器将AST作为输入,利用访问者设计模式,对该AST的每个语法结构进行转译处理,转换成已有分析工具编译前端的AST结构,以此复用已有的静态代码分析模块,保证功能的稳定性;
[0015]其中在上述步骤三中,将步骤一中所设计的鲁棒性编译前端,以及步骤二中所设计的转译器模块添加到原分析工具的分析模块;
[0016]其中在上述步骤四中,完成步骤三后,在原分析工具中添加启用零配置分析的条件入口,对原分析工具完成鲁棒性分析的扩展支持,得到鲁棒性静态分析器。
[0017]优选的,所述步骤1.1中,词法分析模块的预处理功能包括以下三点:一是对于宏定义指令,利用宏定义解析器对其进行解析并保存到词法解析的上下文索引中,后续解析遇到可替换的宏标识符时,则查询已经记录的索引并进行宏替换;如果未查询到宏定义,则安全地将其作为一个标识符处理;二是对于头文件包含指令,按照被测文件所在目录的路径以及被包含头文件的字符串进行拼接,如果定位到头文件,则递归对该文件进行预处理和解析,否则记录编译错误信息,并安全地继续解析后续代码;三是对于条件编译指令,引用宏定义的上下文索引对其解释。
[0018]优选的,所述步骤1.2中,词法解析模块预留了nextToken接口可供子类实现。
[0019]优选的,所述步骤1.3中,语法解析模块兼容C 99/GNU C和C++ 11语法。
[0020]优选的,所述步骤1.3中,语法解析模块具备以下特性:一是歧义语法解析,即语法解析模块在解析时会遇到有歧义的语法,此时先将其记录,待整个语法解析结束时,根据已经解析的上下文符号信息进行推测,并对有歧义的语法结构进行重写;二是错误恢复,即遇到语法解析错误时,回溯到合理的语法结构,并记录解析错误信息;三是可扩展,即将C/C++语言公共的语法解析子程序作为顶层基类的实现,将C/C++语言特性相关的解析子程序交由子类去实现,并将递归下降子程序细化到相对小的方法单元,针对新的方言进行解析器扩展时,只需重写需要特殊处理的递归下降子程序,这样能够以较低成本完成对新方言的兼容。
[0021]优选的,所述步骤三中,具体为:
[0022]3.1扩展原分析工具代码解析接口,此接口输入为源文件,根据条件接入鲁棒性编译前端和语法转译器,输出原分析工具的AST;
[0023]3.2实例化鲁棒性编译前端。
[0024]与现有技术相比,本专利技术的有益效果是:本专利技术通过实现鲁棒性编译前端生成AST,并将该AST转译成原分析工具的AST,复用已有分析工具的代码分析能力,该编译前端内置了可扩展的预处理模块,拥有较强的编译错误恢复能力,较强的可扩展性,能够保证在复用已有代码资产的前提下,提高分析工具的鲁棒性,在被测软件不完整配置的分析条件下,仍能给出准确的分析结果,降低了静态分析工具使用者的门槛,提升工具的用户体验。
附图说明
[0025]图1为本专利技术的方法流程图。
具体实施方式
[0026]下面将结合本专利技术实施例中的附图,对本专利技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本专利技术一部分实施例,而不是全本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.提升源代码静态分析工具鲁棒性的方法,包括以下步骤:步骤一,设计鲁棒性编译前端;步骤二,设计语法转译器;步骤三,提升原分析工具的鲁棒性;步骤四,添加零配置;其特征在于:其中在上述步骤一中,包括以下步骤:1.1设计鲁棒性编译前端中词法分析模块的预处理功能,即语法解析模块根据不同的预处理指令,执行不同的流程;1.2设计鲁棒性编译前端中词法分析模块的词法分析功能,即根据预先设计的Token匹配状态机,词法分析模块将预处理后的字符流切分为Token流,每个Token为最小的一个语法单元;1.3设计鲁棒性编译前端中语法解析模块的语法解析功能,即语法解析模块能将词法解析的Token流作为输入,并利用递归下降的方法进行语法解析,生成抽象语法树AST;1.4实现上述步骤1.1、步骤1.2和步骤1.3的各模块功能后,得到鲁棒性编译前端;其中在上述步骤二中,针对步骤1.3中生成的AST,实现一套访问者设计模式接口,语法转译器将AST作为输入,利用访问者设计模式,对该AST的每个语法结构进行转译处理,转换成已有分析工具编译前端的AST结构,以此复用已有的静态代码分析模块,保证功能的稳定性;其中在上述步骤三中,将步骤一中所设计的鲁棒性编译前端,以及步骤二中所设计的转译器模块添加到原分析工具的分析模块;其中在上述步骤四中,完成步骤三后,在原分析工具中添加启用零配置分析的条件入口,对原分析工具完成鲁棒性分析的扩展支持,得到鲁棒性静态分析器。2.根据权利要求1所述的提升源代码静态分析工具鲁棒性的方法,其特征在于:所述步骤1.1中,词法分析模块的预处理功能包括以下三点:一是对于宏定义指令,利用宏定义解析器对其进行解析并保存到词法解析的上下文索引中,后续解析遇到可替换的宏标识符时,则查询已经记录的索...

【专利技术属性】
技术研发人员:陈睿王峥贾春鹏丁戈肖志恒王博祥于婷婷高栋栋
申请(专利权)人:北京轩宇信息技术有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1