处理路径敏感符号定义的源代码静态缺陷分析器及其方法

文档序号:6432158阅读:151来源:国知局
专利名称:处理路径敏感符号定义的源代码静态缺陷分析器及其方法
技术领域
本发明涉及计算机领域,尤其涉及一种处理路径敏感符号定义的源代码静态缺陷分析器及其方法。
背景技术
随着软件工程的规模越来越大,源代码文件越来越多,源代码文件间的调用关系也是日趋复杂。单纯依靠编译器不足以发现代码中存在的所有问题,越来越多的开发者使用源代码静态缺陷分析器工具作为编译器的有效补充来发现和解决程序中可能存在的问题,如语义错误、安全缺陷等。图1显示了源代码静态缺陷分析器的常规框图。由源代码开发人员或测试人员将源代码输入源代码静态缺陷分析器中,首先由源代码解析模块进行处理,它将源代码转换为精简的中间代码交给缺陷分析模块,缺陷分析模块对中间代码进行分析并将分析数据,如语义分析、数据流分析等提交给结果输出模块,结果输出模块使用分析数据并结合缺陷规则库中定义的缺陷生成结果文件。目前,针对程序源代码进行静态缺陷分析的技术和工具很多,但绝大多数都集中于传统开发语言,如C、c++、Java等。这种语言的特点是静态性、编译性较好,而当前比较流行的脚本语言,如Ruby、Python、PHP,通常具有动态性和解释性特点。下文为一个PYTHON代码中变量符号定义的例子 def system (cmd)
#some stuff def hello (cmd) #some stuff system (command)^
if b == 1:
from os import * os. system (command) else b == 2:
system = hello else b == 3:
system = 1 else: i = 1
system = i print system undef system print system
-个名字为system的函数
一个全名为os. system的函数 -一个名字为hello的函数的别名一个值为1的整型常量
-一个从变量i取值的整型变量 -到底是什么?
-什么都不是
在代码中使用到某一变量时根据执行路径的不同,其定义情况、类型都可能不同。如上例中代码中的变量system,根据执行的路径不同,可以是函数、函数别名、整型变量和未定义的符号。下面是Ruby语言的包含符号定义的代码片段 while true
var = true break end ρ var
for i in 1. . 3
var = true end ρ var
下面是Python语言的包含符号定义的代码片段 #!/usr/bin/env python # — * — conding utf ——8 一氺一 def test (χ) if χ:
a = 1234
print hex ( id (a) ) , locals () print hex( id (a) ) , locals ( ) , a text (True)
在Ruby和Python语言中,对符号赋值即被视为完成一个定义(特殊情况除外,如Ruby 中的迭代语句),此定义在后续执行路径中一直有效(除非遇到对此符号的重新定义或删除),也就是说其定义原则不同于C/JAVA等符号定义路径不敏感的语言(这些语言都有严格的名字空间约束符号的定义)。这种符号定义的方式极大的增强了语言的灵活性,但对于源代码静态缺陷分析来说,如果不进行精确的符号定义分析,就很难确定在代码中某一位置符号的类型和其他属性信息,也就无从进行相应的分析工作。已知的源代码静态缺陷分析器忽略符号定义在不同执行路径中的不同定义情况, 遇到这种情况,处理办法通常是使用所有取值的集合来进行笼统的分析或放弃复杂情况的分析,这些处理办法都会导致大量的误报和漏报。

发明内容
本发明要解决的技术问题是如何使源代码静态缺陷分析器能够更加准确有效的分析处理路径敏感的符号定义。为了解决上述问题,本发明提供了一种处理路径敏感符号定义的源代码静态缺陷分析方法,包括
A、根据输入的源代码文件产生中间代码;
B、遍历所述中间代码中的各路径,逐条分析语句,得到分析数据;如果语句是符号定义类型语句则进行步骤C ;各路径都已遍历完后进行步骤D ;C、将该符号定义类型语句中所定义的符号记录在当前遍历的路径下,将该符号的当前定义指向当前遍历的路径中的定义;返回步骤B,分析下一条语句;
D、根据所述分析数据及预定的缺陷规则生成缺陷分析结果。进一步地,所述步骤C包括
Cl、判断该符号定义类型语句中所定义的符号对应的符号结构是否已建立,如未建立则建立对应的符号结构后进行步骤C2 ;如已建立则判断该符号是否在当前遍历的路径的符号定义列表中,如果不在则进行步骤C2,如果在则进行步骤C3 ;
C2、将该符号加入当前遍历的路径的符号定义列表,标记符号的当前状态,进行步骤
C3 ;
C3、根据当前遍历的路径中对该符号的定义创建新定义的实例,将该新定义的实例保存在该符号对应的符号结构中,将该符号的当前定义指向该新定义的实例;返回步骤B,分析下一条语句。进一步地,所述步骤C3中将新定义的实例保存在该符号的符号结构中是指 将该新定义的实例压入该符号对应的符号结构的定义实例堆栈中。进一步地,所述步骤B中还包括
当一条路径中的语句都分析完时,将该路径的符号定义列表中的符号回滚到该符号上一个标记状态;回滚方法为将该符号对应的符号结构的定义实例堆栈中的实例依次出栈, 直到该定义实例堆栈恢复到最近一次标记该符号时的情况。本发明还提供了一种处理路径敏感符号定义的源代码静态缺陷分析器,包括 源码解析模块,用于根据输入的源代码文件产生中间代码;
结果输出模块,用于根据所述分析数据及预定的缺陷规则生成缺陷分析结果; 缺陷分析模块;
其特征在于,还包括符号定义处理模块;
所述缺陷分析模块用于遍历所述中间代码中的各路径,逐条分析语句,得到分析数据; 如果语句是符号定义类型语句则发送给所述符号定义处理模块;各路径都已遍历完后将分析数据发送给所述结果输出模块;
所述符号定义处理模块用于将所接收的符号定义类型语句中所定义的符号记录在当前遍历的路径下,将该符号的当前定义指向当前遍历的路径中的定义;通知所述缺陷分析模块分析下一条语句。进一步地,所述符号定义处理模块包括 添加单元、实例单元;
创建单元,用于判断该符号定义类型语句中所定义的符号对应的符号结构是否已建立,如未建立则建立对应的符号结构后指示所述添加单元工作;如已建立则判断该符号是否在当前遍历的路径的符号定义列表中,如果不在则指示所述添加单元工作,如果在则指示所述实例单元工作;
所述添加单元用于将该符号加入当前遍历的路径的符号定义列表,标记符号的当前状态,然后指示所述实例单元工作;
所述实例单元用于根据当前遍历的路径中对该符号的定义创建新定义的实例,将该新定义的实例保存在该符号对应的符号结构中,将该符号的当前定义指向该新定义的实例,然后通知所述缺陷分析模块分析下一条语句。进一步地,所述实例单元将新定义的实例保存在该符号的符号结构中是指 所述实例单元将该新定义的实例压入该符号对应的符号结构的定义实例堆栈中。进一步地,所述缺陷分析模块还用于当一条路径中的语句都分析完时,将该路径的符号定义列表中的符号回滚到该符号上一个标记状态;回滚方法为将该符号对应的符号结构的定义实例堆栈中的实例依次出栈,直到该定义实例堆栈恢复到最近一次标记该符号时的情况。本发明的技术方案在解析源代码的过程中准确定位符号的类型和取值等信息,解决了当前源代码静态缺陷分析器中无法在路径敏感的分析中准确跟踪、定位符号定义信息的情况,可以使得基于此符号的静态缺陷分析精度得到提高,可以有效降低漏报率和误报率,提高了当前源代码静态缺陷分析器的检测精度。


结合附图参考详细描述,可以更容易且更好的领会和理解本发明的前述方面, 图1是典型的源代码静态缺陷分析器的功能框图2是实施例二的处理路径敏感符号定义的源代码静态缺陷分析器的功能框图; 图3是实施例二的处理路径敏感符号定义的源代码静态缺陷分析器的工作流程示意图。
具体实施例方式下面将结合附图及实施例对本发明的技术方案进行更详细的说明。需要说明的是,如果不冲突,本发明实施例以及实施例中的各个特征可以相互结合,均在本发明的保护范围之内。另外,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。实施例一、一种处理路径敏感符号定义的源代码静态缺陷分析方法,包括
A、根据输入的源代码文件产生中间代码;
B、遍历所述中间代码中的各路径,逐条分析语句,得到分析数据;如果语句是符号定义类型语句(如函数定义、类定义、变量定义等)则进行步骤C ;各路径都已遍历完后进行步骤 D ;
C、将该符号定义类型语句中所定义的符号记录在当前遍历的路径下,将该符号的当前定义指向当前遍历的路径中的定义;返回步骤B,分析下一条语句;
D、根据所述分析数据及预定的缺陷规则生成缺陷分析结果。本实施例中,所述步骤A、E可以但不限采用和现有技术相同的方案实现;步骤B中对非符号定义类型语句的分析也可以但不限于按照现有技术中的方案实现。本实施例的步骤B中,遍历各路径时可采用任何路径敏感的遍历算法。绝大多数情况下,在某一执行路径中某一确定位置符号的定义信息都可以在源代码实际运行前确定下来,因此可以用于精确的缺陷分析;语言中提供灵活的定义符号的方法是为了提高语言的灵活性,采用本实施例的方法后,在进行其他语句的分析时将使用到正确的对应执行路径的符号定义信息,从而能够分析源代码中路径敏感的符号定义,避免了代码中多路径对同一符号的多次不同定义带给缺陷分析器的困惑。本实施例中,所述步骤C具体可以包括
Cl、判断该符号定义类型语句中所定义的符号对应的符号结构是否已建立,如未建立则建立对应的符号结构后进行步骤C2 ;如已建立则判断该符号是否在当前遍历的路径的符号定义列表中,如果不在则进行步骤C2,如果在则进行步骤C3 ;
C2、将该符号加入当前遍历的路径的符号定义列表,标记符号的当前状态,进行步骤
C3 ;
C3、根据当前遍历的路径中对该符号的定义创建新定义的实例,将该新定义的实例保存在该符号对应的符号结构中,将该符号的当前定义指向该新定义的实例;返回步骤B,分析下一条语句。本实施例中,所述步骤C3中将新定义的实例保存在该符号的符号结构中可以但不限于是指将该新定义的实例压入该符号对应的符号结构的定义实例堆栈中;实际应用中也不排除采用其它方式保存。本实施例中,所述步骤B中还可以包括
当一条路径中的语句都分析完时,将该路径的符号定义列表中的符号回滚到该符号上一个标记状态;回滚方法为将该符号对应的符号结构的定义实例堆栈中的实例依次出栈, 直到该定义实例堆栈恢复到最近一次标记该符号时的情况。实施例二、一种处理路径敏感符号定义的源代码静态缺陷分析器,如图2所示,包括
缺陷分析模块、符号定义处理模块、结果输出模块; 源码解析模块,用于根据输入的源代码文件产生中间代码;
所述缺陷分析模块用于遍历所述中间代码中的各路径,逐条分析语句,得到分析数据; 如果语句是符号定义类型语句则发送给所述符号定义处理模块;各路径都已遍历完后将分析数据发送给所述结果输出模块;
所述符号定义处理模块用于将所接收的符号定义类型语句中所定义的符号记录在当前遍历的路径下,将该符号的当前定义指向当前遍历的路径中的定义;通知所述缺陷分析模块分析下一条语句;
所述结果输出模块用于根据所述分析数据及预定的缺陷规则生成缺陷分析结果。本实施例中,所述缺陷分析模块对对非符号定义类型语句的分析得到分析数据的方案、以及结果输出模块的实现方案可以但不限采用和现有技术相同的方案实现;其中预定的缺陷规则可以但不限于保存为缺陷规则库,可以保存在结果输出模块中,也可以保存在其它模块中。本实施例在原有源代码静态缺陷分析框架的基础上设置了一个符号定义分析处理模块,该模块基于缺陷检测模块的路径敏感的遍历,嵌入缺陷分析处理过程,目的能完整、准确的记录、替换和恢复符号定义信息,保证在对中间代码进行缺陷分析时能够使用到正确的定义信息,该过程可能进行多次入栈、出栈、前进、回滚等操作,取决于代码中控制流路径的数量,直到所有中间代码都被缺陷检测模块分析处理为止。其它处理流程与典型的源代码静态缺陷分析器一致,如前所述。
本实施例中,所述缺陷分析模块遍历各路径时可采用任何路径敏感的遍历算法。本实施例中,所述符号定义处理模块具体可以包括 添加单元、实例单元;
创建单元,用于判断该符号定义类型语句中所定义的符号对应的符号结构是否已建立,如未建立则建立对应的符号结构后指示所述添加单元工作;如已建立则判断该符号是否在当前遍历的路径的符号定义列表中,如果不在则指示所述添加单元工作,如果在则指示所述实例单元工作;
所述添加单元用于将该符号加入当前遍历的路径的符号定义列表,标记符号的当前状态,然后指示所述实例单元工作;
所述实例单元用于根据当前遍历的路径中对该符号的定义创建新定义的实例,将该新定义的实例保存在该符号对应的符号结构中,将该符号的当前定义指向该新定义的实例, 然后通知所述缺陷分析模块分析下一条语句。本实施例中,所述实例单元将新定义的实例保存在该符号的符号结构中可以但不限于是指所述实例单元将该新定义的实例压入该符号对应的符号结构的定义实例堆栈中;实际应用中也不排除采用其它方式保存。本实施例中,所述缺陷分析模块还可以用于当一条路径中的语句都分析完时,将该路径的符号定义列表中的符号回滚到该符号上一个标记状态;回滚方法为将该符号对应的符号结构的定义实例堆栈中的实例依次出栈,直到该定义实例堆栈恢复到最近一次标记该符号时的情况。本实施例中,所述源代码静态缺陷分析器的工作流程如图3所示,包括如下步骤 首先,源码解析模块根据输入的源代码文件,产生当前源代码文件的中间代码形式,然
后进入缺陷分析模块。缺陷分析模块使用路径敏感的遍历算法来对中间代码进行逐句分析。进入新路径后,如果当前语句为符号定义类型语句(如函数定义、类定义、变量定义等),则转发给符号定义处理模块;如果是其它类型语句,则可按照常规方式处理,处理完成后则分析下一条语句;在分析下一条语句前先判断当前遍历的路径中语句是否已分析完,如果没有则分析下一条语句;如果本路径中语句已分析完,则将该路径的符号定义列表中的符号依次回滚到上一个标记状态,然后退出路径;之后判断中间代码中的路径是否已遍历完,没有遍历完就进入新路径,继续逐条分析语句;如果所有路径都已遍历完,则通知源代码静态缺陷分析器的缺陷分析模块继续后面的工作。符号定义处理模块接收到符号定义类型语句后,判断该语句中所定义的符号对应的符号结构是否已建立,如未建立则创建新的符号结构,将该符号加入当前路径的符号定义列表,标记符号的当前状态;如已建立,则在当前路径的符号定义列表中搜索该符号是否存在,如不存在则将该符号加入当前路径的符号定义列表,标记符号的当前状态;如果存在,或是将该符号加入符号定义列表并标记符号的当前状态后,根据当前遍历的路径中对该符号的定义创建新定义的实例,并将其压入该符号对应的符号结构的定义实例堆栈中, 同时将该符号的当前定义的指针指向该新加入的实例;完成后通知所述缺陷分析模块继续分析下一条语句;
其它实现细节可参加实施例一。
本领域普通技术人员可以理解上述方法中的全部或部分步骤可通过程序来指令相关硬件完成,所述程序可以存储于计算机可读存储介质中,如只读存储器、磁盘或光盘等。可选地,上述实施例的全部或部分步骤也可以使用一个或多个集成电路来实现。相应地,上述实施例中的各模块/单元可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。本发明不限制于任何特定形式的硬件和软件的结合。当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明的权利要求的保护范围。
权利要求
1.一种处理路径敏感符号定义的源代码静态缺陷分析方法,包括A、根据输入的源代码文件产生中间代码;B、遍历所述中间代码中的各路径,逐条分析语句,得到分析数据;如果语句是符号定义类型语句则进行步骤C ;各路径都已遍历完后进行步骤D ;C、将该符号定义类型语句中所定义的符号记录在当前遍历的路径下,将该符号的当前定义指向当前遍历的路径中的定义;返回步骤B,分析下一条语句;D、根据所述分析数据及预定的缺陷规则生成缺陷分析结果。
2.如权利要求1所述的方法,其特征在于,所述步骤C包括Cl、判断该符号定义类型语句中所定义的符号对应的符号结构是否已建立,如未建立则建立对应的符号结构后进行步骤C2 ;如已建立则判断该符号是否在当前遍历的路径的符号定义列表中,如果不在则进行步骤C2,如果在则进行步骤C3 ;C2、将该符号加入当前遍历的路径的符号定义列表,标记符号的当前状态,进行步骤C3 ;C3、根据当前遍历的路径中对该符号的定义创建新定义的实例,将该新定义的实例保存在该符号对应的符号结构中,将该符号的当前定义指向该新定义的实例;返回步骤B,分析下一条语句。
3.如权利要求2所述的方法,其特征在于,所述步骤C3中将新定义的实例保存在该符号的符号结构中是指将该新定义的实例压入该符号对应的符号结构的定义实例堆栈中。
4.如权利要求3所述的方法,其特征在于,所述步骤B中还包括当一条路径中的语句都分析完时,将该路径的符号定义列表中的符号回滚到该符号上一个标记状态;回滚方法为将该符号对应的符号结构的定义实例堆栈中的实例依次出栈, 直到该定义实例堆栈恢复到最近一次标记该符号时的情况。
5.一种处理路径敏感符号定义的源代码静态缺陷分析器,包括源码解析模块,用于根据输入的源代码文件产生中间代码;结果输出模块,用于根据所述分析数据及预定的缺陷规则生成缺陷分析结果;缺陷分析模块;其特征在于,还包括符号定义处理模块;所述缺陷分析模块用于遍历所述中间代码中的各路径,逐条分析语句,得到分析数据; 如果语句是符号定义类型语句则发送给所述符号定义处理模块;各路径都已遍历完后将分析数据发送给所述结果输出模块;所述符号定义处理模块用于将所接收的符号定义类型语句中所定义的符号记录在当前遍历的路径下,将该符号的当前定义指向当前遍历的路径中的定义;通知所述缺陷分析模块分析下一条语句。
6.如权利要求5所述的源代码静态缺陷分析器,其特征在于,所述符号定义处理模块包括添加单元、实例单元;创建单元,用于判断该符号定义类型语句中所定义的符号对应的符号结构是否已建立,如未建立则建立对应的符号结构后指示所述添加单元工作;如已建立则判断该符号是否在当前遍历的路径的符号定义列表中,如果不在则指示所述添加单元工作,如果在则指示所述实例单元工作;所述添加单元用于将该符号加入当前遍历的路径的符号定义列表,标记符号的当前状态,然后指示所述实例单元工作;所述实例单元用于根据当前遍历的路径中对该符号的定义创建新定义的实例,将该新定义的实例保存在该符号对应的符号结构中,将该符号的当前定义指向该新定义的实例, 然后通知所述缺陷分析模块分析下一条语句。
7.如权利要求6所述的源代码静态缺陷分析器,其特征在于,所述实例单元将新定义的实例保存在该符号的符号结构中是指所述实例单元将该新定义的实例压入该符号对应的符号结构的定义实例堆栈中。
8.如权利要求7所述的源代码静态缺陷分析器,其特征在于所述缺陷分析模块还用于当一条路径中的语句都分析完时,将该路径的符号定义列表中的符号回滚到该符号上一个标记状态;回滚方法为将该符号对应的符号结构的定义实例堆栈中的实例依次出栈,直到该定义实例堆栈恢复到最近一次标记该符号时的情况。
全文摘要
本发明公开了一种处理路径敏感符号定义的源代码静态缺陷分析器及其方法;方法包括A、根据输入的源代码文件产生中间代码;B、遍历所述中间代码中的各路径,逐条分析语句,得到分析数据;如果语句是符号定义类型语句则进行步骤C;各路径都已遍历完后进行步骤D;C、将该符号定义类型语句中所定义的符号记录在当前遍历的路径下,将该符号的当前定义指向当前遍历的路径中的定义;返回步骤B,分析下一条语句;D、根据所述分析数据及预定的缺陷规则生成缺陷分析结果。本发明能使源代码静态缺陷分析器更加准确有效的分析处理路径敏感的符号定义。
文档编号G06F11/36GK102279800SQ20111025602
公开日2011年12月14日 申请日期2011年8月31日 优先权日2011年8月31日
发明者吴世忠, 张普含, 曹明, 朱钱杭, 董国伟, 蔡晶晶, 郝永乐, 陈宇 申请人:中国信息安全测评中心, 北京启明星辰信息安全技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1