CN115658508A - 提升源代码静态分析工具鲁棒性的方法 - Google Patents

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

Info

Publication number
CN115658508A
CN115658508A CN202211323819.2A CN202211323819A CN115658508A CN 115658508 A CN115658508 A CN 115658508A CN 202211323819 A CN202211323819 A CN 202211323819A CN 115658508 A CN115658508 A CN 115658508A
Authority
CN
China
Prior art keywords
analysis
robustness
grammar
analysis tool
compiling
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.)
Pending
Application number
CN202211323819.2A
Other languages
English (en)
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.)
Beijing Sunwise Information Technology Ltd
Original Assignee
Beijing Sunwise Information Technology 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 Beijing Sunwise Information Technology Ltd filed Critical Beijing Sunwise Information Technology Ltd
Priority to CN202211323819.2A priority Critical patent/CN115658508A/zh
Publication of CN115658508A publication Critical patent/CN115658508A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

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

Description

提升源代码静态分析工具鲁棒性的方法
技术领域
本发明涉及程序分析与测试技术领域,具体为提升源代码静态分析工具鲁棒性的方法。
背景技术
源代码静态分析工具是一种重要的软件测试工具,该类工具通过静态地分析被测软件的源代码从而发现软件编码中的违规和潜在的缺陷,已经广泛应用在各类软件的开发和测试中。静态分析工具的核心组成包括语法分析前端和检测器引擎,其中语法分析前端负责将被测软件的源代码解析形成中间数据结构,检测器引擎基于中间数据结构进行特定的规则检查。静态分析工具中的语法分析前端与编译器前端类似,一般要求按照编译的配置对被测软件代码进行完整编译,例如知名的静态分析工具Coverity和Klocwork、ClangStatic Analyzer等。
而在实际使用静态分析工具的场景中,用户经常难以获得完整的编译环境和编译配置,如编译链接选项、预定义宏、头文件搜索路径以及依赖的相关源代码,用户会采取两种方式解决:一是采用不完整的编译环境和编译配置,静态分析工具的语法分析前端出错使得最终分析结果大量缺失或不准确;二是花费大量的时间获得完整的编译环境和编译配置,然后在静态分析工具中进行配置、分析。无论哪种解决方式,都大大影响了用户使用这一工具的效果。导致这种情况的根本原因在于静态分析工具的鲁棒性不足,即不能在不完整编译配置下进行较准确的分析,具体体现在以下几个方面:
一是对头文件和宏定义缺失时,代码预处理的鲁棒性不够强。已有的对源程序进行预处理的方法通常是通过调用编译器的预处理命令,将预处理后的文件作为静态分析工具的输入。这导致错误处理能力不够,当调用编译器的预处理命令时,一旦找不到特定的头文件,就结束预处理,导致不能进行后续的静态分析;
二是代码解析错误恢复能力不够强。已有的方法用于解析代码的编译前端通常需要对源程序进行完整的类型检查,或者使用Parser Generator解析用户定义的语法文件。这些方法通常有比较弱的错误恢复能力,即在解析发生错误时,可能会直接导致解析模块崩溃,以至于无法进行后续的静态分析;
三是编译前端的方言兼容性不够强。已有的解析C语言程序的编译前端通常只支持单一的C语言标准和编译平台,例如C99标准,GNUC编译平台。这就导致一旦遇到新的编译平台/方言,就会解析出错,所以静态分析工具需要花费较大成本支持各种编译平台(例如C51,DSP,ARM,MS等)的C语言方言,当遇到一种此前未知的方言时就会不兼容。
发明内容
本发明的目的在于提供提升源代码静态分析工具鲁棒性的方法,以解决上述背景技术中提出的问题。
为实现上述目的,本发明提供如下技术方案:提升源代码静态分析工具鲁棒性的方法,包括以下步骤:步骤一,设计鲁棒性编译前端;步骤二,设计语法转译器;步骤三,提升原分析工具的鲁棒性;步骤四,添加零配置;
其中在上述步骤一中,包括以下步骤:
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结构,以此复用已有的静态代码分析模块,保证功能的稳定性;
其中在上述步骤三中,将步骤一中所设计的鲁棒性编译前端,以及步骤二中所设计的转译器模块添加到原分析工具的分析模块;
其中在上述步骤四中,完成步骤三后,在原分析工具中添加启用零配置分析的条件入口,对原分析工具完成鲁棒性分析的扩展支持,得到鲁棒性静态分析器。
优选的,所述步骤1.1中,词法分析模块的预处理功能包括以下三点:一是对于宏定义指令,利用宏定义解析器对其进行解析并保存到词法解析的上下文索引中,后续解析遇到可替换的宏标识符时,则查询已经记录的索引并进行宏替换;如果未查询到宏定义,则安全地将其作为一个标识符处理;二是对于头文件包含指令,按照被测文件所在目录的路径以及被包含头文件的字符串进行拼接,如果定位到头文件,则递归对该文件进行预处理和解析,否则记录编译错误信息,并安全地继续解析后续代码;三是对于条件编译指令,引用宏定义的上下文索引对其解释。
优选的,所述步骤1.2中,词法解析模块预留了nextToken接口可供子类实现。
优选的,所述步骤1.3中,语法解析模块兼容C 99/GNU C和C++ 11语法。
优选的,所述步骤1.3中,语法解析模块具备以下特性:一是歧义语法解析,即语法解析模块在解析时会遇到有歧义的语法,此时先将其记录,待整个语法解析结束时,根据已经解析的上下文符号信息进行推测,并对有歧义的语法结构进行重写;二是错误恢复,即遇到语法解析错误时,回溯到合理的语法结构,并记录解析错误信息;三是可扩展,即将C/C++语言公共的语法解析子程序作为顶层基类的实现,将C/C++语言特性相关的解析子程序交由子类去实现,并将递归下降子程序细化到相对小的方法单元,针对新的方言进行解析器扩展时,只需重写需要特殊处理的递归下降子程序,这样能够以较低成本完成对新方言的兼容。
优选的,所述步骤三中,具体为:
3.1扩展原分析工具代码解析接口,此接口输入为源文件,根据条件接入鲁棒性编译前端和语法转译器,输出原分析工具的AST;
3.2实例化鲁棒性编译前端。
与现有技术相比,本发明的有益效果是:本发明通过实现鲁棒性编译前端生成AST,并将该AST转译成原分析工具的AST,复用已有分析工具的代码分析能力,该编译前端内置了可扩展的预处理模块,拥有较强的编译错误恢复能力,较强的可扩展性,能够保证在复用已有代码资产的前提下,提高分析工具的鲁棒性,在被测软件不完整配置的分析条件下,仍能给出准确的分析结果,降低了静态分析工具使用者的门槛,提升工具的用户体验。
附图说明
图1为本发明的方法流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1,本发明提供的一种技术方案:
实施例:
提升源代码静态分析工具鲁棒性的方法,包括以下步骤:步骤一,设计鲁棒性编译前端;步骤二,设计语法转译器;步骤三,提升原分析工具的鲁棒性;步骤四,添加零配置;
其中在上述步骤一中,包括以下步骤:
1.1设计鲁棒性编译前端中词法分析模块的预处理功能,即语法解析模块根据不同的预处理指令,执行不同的流程;其中,词法分析模块的预处理功能包括以下三点:一是对于宏定义指令,利用宏定义解析器对其进行解析并保存到词法解析的上下文索引中,后续解析遇到可替换的宏标识符时,则查询已经记录的索引并进行宏替换;如果未查询到宏定义,则安全地将其作为一个标识符处理;二是对于头文件包含指令,按照被测文件所在目录的路径以及被包含头文件的字符串进行拼接,如果定位到头文件,则递归对该文件进行预处理和解析,否则记录编译错误信息,并安全地继续解析后续代码;三是对于条件编译指令,引用宏定义的上下文索引对其解释;
1.2设计鲁棒性编译前端中词法分析模块的词法分析功能,即根据预先设计的Token匹配状态机,词法分析模块将预处理后的字符流切分为Token流,每个Token为最小的一个语法单元;其中,词法解析模块预留了nextToken接口可供子类实现;
1.3设计鲁棒性编译前端中语法解析模块的语法解析功能,即语法解析模块能将词法解析的Token流作为输入,并利用递归下降的方法进行语法解析,生成抽象语法树AST;其中,语法解析模块兼容C 99/GNU C和C++ 11语法;语法解析模块具备以下特性:一是歧义语法解析,即语法解析模块在解析时会遇到有歧义的语法,此时先将其记录,待整个语法解析结束时,根据已经解析的上下文符号信息进行推测,并对有歧义的语法结构进行重写;二是错误恢复,即遇到语法解析错误时,回溯到合理的语法结构,并记录解析错误信息;三是可扩展,即将C/C++语言公共的语法解析子程序作为顶层基类的实现,将C/C++语言特性相关的解析子程序交由子类去实现,并将递归下降子程序细化到相对小的方法单元,针对新的方言进行解析器扩展时,只需重写需要特殊处理的递归下降子程序,这样能够以较低成本完成对新方言的兼容;
1.4实现上述步骤1.1、步骤1.2和步骤1.3的各模块功能后,得到鲁棒性编译前端;
其中在上述步骤二中,针对步骤1.3中生成的AST,实现一套访问者设计模式接口,语法转译器将AST作为输入,利用访问者设计模式,对该AST的每个语法结构进行转译处理,转换成已有分析工具编译前端的AST结构,以此复用已有的静态代码分析模块,保证功能的稳定性;
其中在上述步骤三中,将步骤一中所设计的鲁棒性编译前端,以及步骤二中所设计的转译器模块添加到原分析工具的分析模块,具体为:
3.1扩展原分析工具代码解析接口,此接口输入为源文件,根据条件接入鲁棒性编译前端和语法转译器,输出原分析工具的AST;
3.2实例化鲁棒性编译前端;
其中在上述步骤四中,完成步骤三后,在原分析工具中添加启用零配置分析的条件入口,对原分析工具完成鲁棒性分析的扩展支持,得到鲁棒性静态分析器。
试验例1:
利用上述实施例中得到鲁棒性静态分析器对C51平台项目和DSP2000平台项目进行静态分析,其中C51项目的编译配置为:不具备C51平台配置环境,没有平台头文件搜索目录;DSP2000项目的编译配置为:去除DSP平台所有的内置宏定义;具体分析过程如下:
1)将C51平台项目和DSP2000平台项目作为鲁棒性静态分析器的输入;
2)预处理模块开始处理,当鲁棒性编译前端不能找到C51项目平台的头文件时,不递归展开该头文件,而是记录错误信息,继续进行代码解析;对于识别到的头文件,则递归展开该头文件;例如,针对C51项目中出现的如下代码片段:
#include“global.h”
#include<internal.h>
在当前目录下能够搜索到global.h,而搜索不到internal.h,所以在预处理模块展开时,只展开global.h的代码;针对internal.h则记录错误信息“Unresolvedinclusion:<internal.h>”,并继续解析后面的代码;
3)语法解析模块以预处理模块展开的代码作为输入,根据C/C++语言的语法结构,能够同时解析C和C++语言,针对特定语法结构提供了子类重写的接口,使解析模块具备可扩展性,针对解析时出现的语法错误,不立即崩溃停止,而是回溯到特定的合理语法处,继续解析后续的代码,以尽量恢复得到合理的语句;例如,针对DSP2000中出现的如下2个中断函数:
Figure BSA0000287683130000071
Figure BSA0000287683130000081
在没有内置interrupt宏定义的情况下,它仍然能够正确地解析成2个函数定义(FunctionDefinition);
4)转译模块将鲁棒性前端生成的AST转换为静态分析工具原有的AST结构;
5)复用原有的静态分析模块,开始进行静态分析检查;
6)得到静态分析结果。
试验例2:
在完整配置的情况下,对上述实施例中得到鲁棒性静态分析器与原分析工具进行对比试验,分析工具代码库中已有单元测试1081个,鲁棒性静态分析器的分析前端通过率为98.12%,通过10个真实项目的对比测试,鲁棒性静态分析器889629个规则报警,相比原分析工具883420个规则报警误报率升高0.87%,漏报率升高0.30%,总体差异不大,基本无影响。
试验例3:
在不完整配置的情况下,对上述实施例中得到鲁棒性静态分析器与原分析工具进行对比试验,通过构造零配置实验场景,原分析工具因编译配置不正确导致不能正确分析出结果,而快速结束整个分析过程,鲁棒性静态分析器能够分析更多的代码和规则,与原分析工具对比,鲁棒性静态分析器的漏报率降低71.%,误报率升高18.99%,分析效率提升14.29%。
基于上述,本发明的优点在于,较之已有的分析工具,本发明提出的鲁棒性编译前端以及AST转译器具备更高的鲁棒性,通过基于原分析工具进行非侵入式的集成,能够完整复用已有的规则检查器,在不完整配置的情况下,检测出更多更准确的结果,在完整配置的情况下,分析结果基本无差异;本发明所提出的鲁棒性编译前端拥有较强的编译错误恢复能力,较强的可扩展性,能够保证在复用已有代码资产的前提下,提高分析工具的鲁棒性。
对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。

Claims (6)

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中,词法分析模块的预处理功能包括以下三点:一是对于宏定义指令,利用宏定义解析器对其进行解析并保存到词法解析的上下文索引中,后续解析遇到可替换的宏标识符时,则查询已经记录的索引并进行宏替换;如果未查询到宏定义,则安全地将其作为一个标识符处理;二是对于头文件包含指令,按照被测文件所在目录的路径以及被包含头文件的字符串进行拼接,如果定位到头文件,则递归对该文件进行预处理和解析,否则记录编译错误信息,并安全地继续解析后续代码;三是对于条件编译指令,引用宏定义的上下文索引对其解释。
3.根据权利要求1所述的提升源代码静态分析工具鲁棒性的方法,其特征在于:所述步骤1.2中,词法解析模块预留了nextToken接口可供子类实现。
4.根据权利要求1所述的提升源代码静态分析工具鲁棒性的方法,其特征在于:所述步骤1.3中,语法解析模块兼容C 99/GNU C和C++ 11语法。
5.根据权利要求1所述的提升源代码静态分析工具鲁棒性的方法,其特征在于:所述步骤1.3中,语法解析模块具备以下特性:一是歧义语法解析,即语法解析模块在解析时会遇到有歧义的语法,此时先将其记录,待整个语法解析结束时,根据已经解析的上下文符号信息进行推测,并对有歧义的语法结构进行重写;二是错误恢复,即遇到语法解析错误时,回溯到合理的语法结构,并记录解析错误信息;三是可扩展,即将C/C++语言公共的语法解析子程序作为顶层基类的实现,将C/C++语言特性相关的解析子程序交由子类去实现,并将递归下降子程序细化到相对小的方法单元,针对新的方言进行解析器扩展时,只需重写需要特殊处理的递归下降子程序,这样能够以较低成本完成对新方言的兼容。
6.根据权利要求1所述的提升源代码静态分析工具鲁棒性的方法,其特征在于:所述步骤三中,具体为:
3.1扩展原分析工具代码解析接口,此接口输入为源文件,根据条件接入鲁棒性编译前端和语法转译器,输出原分析工具的AST;
3.2实例化鲁棒性编译前端。
CN202211323819.2A 2022-10-28 2022-10-28 提升源代码静态分析工具鲁棒性的方法 Pending CN115658508A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211323819.2A CN115658508A (zh) 2022-10-28 2022-10-28 提升源代码静态分析工具鲁棒性的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211323819.2A CN115658508A (zh) 2022-10-28 2022-10-28 提升源代码静态分析工具鲁棒性的方法

Publications (1)

Publication Number Publication Date
CN115658508A true CN115658508A (zh) 2023-01-31

Family

ID=84992599

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211323819.2A Pending CN115658508A (zh) 2022-10-28 2022-10-28 提升源代码静态分析工具鲁棒性的方法

Country Status (1)

Country Link
CN (1) CN115658508A (zh)

Similar Documents

Publication Publication Date Title
US8875110B2 (en) Code inspection executing system for performing a code inspection of ABAP source codes
US9122540B2 (en) Transformation of computer programs and eliminating errors
CN109857641B (zh) 对程序源文件进行缺陷检测的方法及装置
CN106843849B (zh) 一种基于文档的库函数的代码模型的自动合成方法
CN106371997B (zh) 一种代码检查方法及装置
Annamaa et al. An interactive tool for analyzing embedded SQL queries
Zhang et al. Automatically generating test templates from test names (n)
CN116450616A (zh) 一种基于解析树的通用异构关系型数据库sql迁移方法
Drain et al. Deepdebug: Fixing python bugs using stack traces, backtranslation, and code skeletons
US20210089284A1 (en) Method and system for using subroutine graphs for formal language processing
Wang et al. {NLP-EYE}: Detecting Memory Corruptions via {Semantic-Aware} Memory Operation Function Identification
CN116431476A (zh) 一种基于代码上下文变异的jvm模糊测试方法
CN111966578A (zh) 一种安卓兼容性缺陷修复效果的自动化评估方法
CN117113347A (zh) 一种大规模代码数据特征提取方法及系统
CN115658508A (zh) 提升源代码静态分析工具鲁棒性的方法
CN109471637B (zh) 电路图的审查脚本调试方法
US11119740B2 (en) Parsability of code snippets
CN112631944A (zh) 基于抽象语法树的源码检测方法及装置、计算机存储介质
CN114385491A (zh) 一种基于深度学习的js转译器缺陷检测方法
Arusoaie et al. Automating abstract syntax tree construction for context free grammars
Grigorev et al. String-embedded language support in integrated development environment
Palanisamy et al. Modelica based parser generator with good error handling
CN115469875B (zh) 基于遥控作业的领域专用语言dsl的编译方法及装置
Fédèle et al. Towards a toolkit for building language implementations
Savitskii et al. Fast analysis of source code in C and C++

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