一种基于代码替换和正则表达式的静态分析工具改进方法技术

技术编号:12988571 阅读:96 留言:0更新日期:2016-03-09 20:42
本发明专利技术公开了一种基于代码替换和正则表达式的静态分析工具改进方法,静态分析工具采用预处理模块对源代码进行预处理,生成中间代码;采用语法分析模块对中间代码进行语法分析最终获得双向token链表;采用缺陷模式匹配模块用于将双向token链表与缺陷模式进行对比,找到其中匹配的部分,处理获得静态分析结果;在预处理模块中对源代码进行预处理时,将i++替换为(i=i+1)-1,将++i替换为i=i+1,将i--换为(i=i-1)+1,将--i替换为i=i-1;在缺陷模式匹配模块中增加如下正则表达式:if(%var%=%num%);if(%any%&%any%);scanf(%str%,%var%);其中%var%、%num%、%any%、%any%、%str%以及%var%均为变量。本发明专利技术可以提高整形溢出问题的准确度,降低漏报率,少人工检查的成本。

【技术实现步骤摘要】

本专利技术属于计算机编程
,具体涉及。
技术介绍
当前的静态分析工具的处理流程可以分为四个部分:预处理模块、语法分析模块、缺陷模式匹配模块、缺陷模式处理模块。待检测的工程文件或文件夹中的源代码首先经过预处理器的处理得到便于检测的中间代码。中间代码经过语法分析模块的处理,生成抽象语法树。然后缺陷模式匹配模块将已知的缺陷模式和抽象语法树进行匹配,检测其中的缺陷。检测到的缺陷通过缺陷定位和输出模块形成格式化的输出,根据用户的要求生成运行结果。其中各个模块的工作过程具体如下:预处理模块对源代码的处理主要包括三个部分:遍历各级目录获取待检测的包含源代码的文件列表,组合头文件和源代码文件,对宏定义进行预处理。其中第一个步骤是可选的,只有在输入是文件夹时才会启用。语法分析模块的主要功能是对经过预处理器处理过之后的代码进行语法分析,语法分析模块的主要工作包括词法分析、语法分析和语义分析三大部分。经过处理后的中间代码首先经过词法分析切割成一个个被称为“token”的最小化有意义的单位,然后通过语法分析建立起不同“token”之间的关系,建立起一个双向的“token”链表,最终针对“token”的双向链表进行语义分析,构造抽象语法树。缺陷模式匹配模块的主要功能是对经过语法分析模块处理之后生成的“token”双向链表进行分析,通过将在工业生产和软件开发中总结出来的多种缺陷模式与“token”双向列表进行对比,找到其中匹配的部分,并且将结果交给缺陷处理模块进行处理。缺陷处理模块的主要功能,是针对缺陷模式匹配模块匹配到的缺陷模式以及“token”信息进行处理,生成用户能够直观看出或者用户自定义格式的缺陷报告。该模块的主要工作包括两点,其中一点是根据缺陷模式匹配模块匹配到的缺陷模式以及“token”信息提取相关的缺陷类型、缺陷位置和缺陷相关变量等。另一点则是需要能够对上一步骤提取的缺陷类型、缺陷位置和缺陷相关变量进行处理,按照直观或者用户指定的格式来进行缺陷报告的生成,供用户对缺陷模式检测的结果进行分析。现有的静态分析工具在检测涉及自增自减操作的整形溢出问题上存在不足,漏报率较高,导致一些严重的缺陷不能及时发现,影响系统的稳定性。除此之外,当前的静态分析工具没有考虑到可能错误的键入这类问题,这类问题在日常编程中非常常见且无法被编译器检测出来,也不容易人工检查,所以由静态分析工具来实现这类问题的检查是非常有必要的。
技术实现思路
有鉴于此,本专利技术提供了,本专利技术的目的是利用表达式替换来提高整形溢出问题的准确度,降低漏报率,同时使用正则表达式来匹配可能错误的键入的代码,降低因为疏忽写错代码带来的影响,减少人工检查的成本。为了达到上述目的,本专利技术的技术方案为:静态分析工具包括预处理模块、语法分析以及缺陷模式匹配模块,预处理模块用于对源代码进行预处理,生成中间代码;语法分析模块用于对中间代码进行语法分析最终获得双向token链表;缺陷模式匹配模块用于将双向token链表与缺陷模式进行对比,找到其中匹配的部分,处理获得静态分析结果;其特征在于,在预处理模块中对源代码进行预处理时,对源代码中出现的自增操作i++、++i与自减操作i—、—i进行如下替换:将i++替换为(i = i+l)_l,将++i替换为i = i+1,将i—换为(i = i_l)+l,将一i替换为i = i_l ;其中i为自增操作或者自减操作的变量。在缺陷模式匹配模块中增加如下正则表达式:if (% var% = % num% ) ;if (%any % &% any % ) ;scanf (% str % , % var % );其中%var%、% num% n % any % ^ % any % ^ % str % 以及 % var % 均为变量;if为源代码中的if语句,scanf为源代码中的scanf语句。进一步地,预处理模块接收外部输入的包含源代码的文件,首先将文件中的头文件和源代码进行组合,然后对源代码中出现的自增操作i++、++i与自减操作1--、一i进行替换之后,再对宏定义进行预处理,最终获得中间代码。进一步地,语法分析模块包括如下步骤:对中间代码首先进行词法分析,是将由字符串序列组成的源代码划分创建一个用于存储token的双向token链表,然后逐字节地读入源代码中的每个字符,并将其划分为一个个完整的具有明确含义的最小化的单位token,然后将按照token在源代码中出现的顺序将所有的token添加到双向token链表中。进一步地,缺陷模式包括在工业生产和软件开发中总结出来的多种缺陷模式。有益效果:本专利技术的目的是利用表达式替换来提高整形溢出问题的准确度,降低漏报率,同时使用正则表达式来匹配可能错误的键入的代码,降低因为疏忽写错代码带来的影响,减少人工检查的成本。【具体实施方式】下面举实施例,对本专利技术进行详细描述。步骤(1)、预处理预处理模块的主要功能是针对用户指定的工程文件或工程文件夹中的源代码进行预处理,生成便于进行语法分析的中间代码。预处理模块对源代码的处理主要包括四个部分:遍历各级目录获取待检测的包含源代码的文件列表,组合头文件和源代码文件,对自增自减操作进行替换,对宏定义进行预处理。其中第一个步骤是可选的,只有在输入是文件夹时才会启用。第三个步骤的替换方案如下:i++ = >((i = i+l)-l)++i = >(i = i+1)i— = > ((i = 1-1) +1)—i = > (i = 1-1)以i++替换为((i = i+1) -1)为例说明,假设i = 3,i++表不先使用i,再让i加一,即如果有赋值语句a = i++,则执行该语句后a = 3,i = 4,再看a = ((i = i+l)_l)这个式子,先处理(i = i+1),此时i的值为4,之后将该值减一赋值给a,即a = 3,此时并当前第1页1 2 本文档来自技高网
...

【技术保护点】
一种基于代码替换和正则表达式的静态分析工具改进方法,所述静态分析工具包括预处理模块、语法分析以及缺陷模式匹配模块,所述预处理模块用于对源代码进行预处理,生成中间代码;所述语法分析模块用于对中间代码进行语法分析最终获得双向token链表;所述缺陷模式匹配模块用于将所述双向token链表与缺陷模式进行对比,找到其中匹配的部分,处理获得静态分析结果;其特征在于,在所述预处理模块中对源代码进行预处理时,对源代码中出现的自增操作i++、++i与自减操作i‑‑、‑‑i进行如下替换:将i++替换为(i=i+1)‑1,将++i替换为i=i+1,将i‑‑换为(i=i‑1)+1,将‑‑i替换为i=i‑1;其中i为自增操作或者自减操作的变量;在所述缺陷模式匹配模块中增加如下正则表达式:if(%var%=%num%);if(%any%&%any%);scanf(%str%,%var%);其中%var%、%num%、%any%、%any%、%str%以及%var%均为变量;if为源代码中的if语句,scanf为源代码中的scanf语句。

【技术特征摘要】

【专利技术属性】
技术研发人员:胡昌振单纯于泽群蔡弘非王勇
申请(专利权)人:北京理工大学
类型:发明
国别省市:北京;11

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

1