发明内容
本发明的目的提供了一种源代码缺陷检测方法及装置具有高度的可扩展性、可维护性强和模块化等特点。
为实现上述发明目的,本发明所提供的技术方案的基本构思如下:IV09-175
本发明提供一种高可扩展性和可维护性的源代码缺陷检测方法,其特殊之处在于:包括下列操作步骤:
(1)将用户配置好的需要进行检测的源代码转化成抽象语法树以及控制流图,送入分析引擎,该分析引擎开始工作;
(2)根据抽象语法树以及控制流图,对源代码进行流不敏感的分析,把分析结果提交给缺陷报告模块,然后进入步骤3,进行路径敏感的分析;
(3)根据抽象语法树以及控制流图对源代码进行各种路径敏感的建模和分析,生成缺陷原始信息;
(4)根据缺陷原始信息,对缺陷路径进行还原、精简、报告给用户。
所述步骤(3)对源代码进行各种路径敏感的建模和分析由循环的工作队列算法执行,所述循环的工作队列算法由控制要素控制。
所述工作队列算法的操作如下:(31)根据不同的语句类别,调用传输函数中相应的访问函数对语句进行处理和求值;(32)处理分支语句:判断当前分支上的约束条件是否可以满足,如果可满足则执行当前分支,如果不可满足则不执行当前分支;处理赋值语句:更新赋值语句中被赋值变量的值;处理函数调用语句语句:计算被调用函数的副作用和返回值;(33)对每一个执行状态用hash算法计算该执行状态的hash值,hash值对每一个不同的执行状态都是唯一的;如果一个执行状态的hash值跟已有的执行状态的hash值相等,则表明该执行状态是一个重复出现的状态,则不再存储状态,如果hash值不相等,则顺序执行后续操作;(34)存储所有的执行状态;(35)对存储的执行状态进行建模;(36)对执行状态进行各种检测,生成缺陷原始信息。
所述控制要素包括:根据抽象语法树以及控制流图对源代码建立所有执行路径的执行状态图,并驱动检测器对执行状态图进行遍历;对源程序的每个分支进行遍历;控制源程序的循环语句的循环执行的最大次数;
所述执行状态图为一个基于函数控制流图的程序执行图,记录函数每条可能执行路径上的执行情况。
所述步骤(33)一个执行状态包括:所有已求值的表达式的值,所有变量和动态分配的内存块的值,所有符号的相关约束信息,所有检查器所需要的信息。
所述步骤(36)中各种检测的内容包括:变量的值是否有定义,除数是否为0,被解引用的指针是否为空,整数运算是否溢出,数组下标是否越界,指针算术是否合法;在路径结束时还要检测:动态分配的内存是否有泄漏,获得的锁是否释放。
一种高可扩展性和可维护性的源代码缺陷检测装置,其特殊之处在于:所述源代码缺陷检测器包括有下述三个功能模块:
编译器前端,负责将程序源代码转化成抽象语法树以及控制流图,然后送入分析引擎,为后续分析提供便利;
分析引擎,由分别完成各自功能的六个子功能模块:执行引擎、状态管理器、存储管理器、约束管理器、检测器及传输函数组成,对源代码进行各种建模和分析,生成缺陷的原始信息;
缺陷报告模块,根据缺陷原始信息,对缺陷路径进行还原,精简,报告给用户。
所述分析引擎中六个子模块的功能是:
执行引擎,对程序进行各种分析,根据需求调用相应的其它五个子模块完成相应的功能;
状态管理器,存储和管理所有的执行状态。
存储管理器,负责对程序的存储状态进行建模,
约束管理器,负责存储和求解程序路径中出现的各种约束条件。
检测器,对执行状态进行各种检测,生成缺陷原始信息。
传输函数,对程序中的各种语句进行处理和求值,传播执行状态。
所述执行引擎对程序进行各种分析包括:对源代码建立所有执行路径的执行状态图,并驱动检测引擎对执行状态图进行遍历;对程序的每个分支进行遍历;控制循环执行的最大次数;根据不同的语句类型,调用相应的访问函数对语句进行处理和求值;调用约束管理器判断当前分支上的约束条件是否满足;
所述状态管理器利用hash算法计算每一个执行状态的hash值,并检测执行状态的hash值是否重复;
所述存储管理器存储执行状态的信息包括:保存每一块模拟的内存块到其当前值的映射,以及每个内存块的大小,分配释放信息。
与现有的技术相比,本发明具有以下优点及有益效果:
1、本发明的源代码缺陷检测方法及装置具有高度的可扩展性、可维护性强和模块化等特点。
2、本发明的各个部分被划分为相互独立的模块。模块与模块之间的交互只通过良好定义的接口进行。这意味着可以在不改变其他模块的条件下,对某一模块进行替换,试验不同的实现。并且可以隔离bug,方便调试。
3、可扩展性好意味着可以方便的对一个模块进行功能的增加,比如利用良好的接口可以方便的增加检测器的个数。
4、在核心分析引擎中,可以进行多种不同复杂度和精确度的分析,包括从流不敏感的抽象语法树的线性遍历,到对程序路径的执行进行完整建模的符号模拟分析。
5、状态管理器在存储每一个状态前,都用hash算法计算该状态的hash值,这个值对每一个不同的状态都是唯一的。如果一个状态的hash值跟已有的状态hash值相等,则表明该状态是一个重复出现的状态,则不再次存储该状态。这样积极的检测重复状态的出现不仅能够减少存储消耗,更重要的是对状态空间进行消减,降低检测的时间消耗。
6、本发明使用计算状态hash值的方法消除重复状态,解决了建立执行状态图时遇到状态过多导致存储爆炸的问题。
7、传输函数对程序中的各种语句进行求值,传播执行状态。根据检测要求的不同,工具需要对语句进行不同的处理,有的要求对语句进行完整的模拟执行,有的则只需要粗略的模拟,有的甚至可以直接忽略。把它们放在单独的模块中,由执行引擎根据配置需求来调用,则大大提高了检测工具的灵活度。
8、将检测工具进行模块化划分,使得工具的开发变得相对简单,不易出错。增强了工具的灵活性,可以非常方便的对工具进行各种配置和调整。
具体实施方式
下面结合附图,对本发明作进一步说明。
参见图1至图3:
本发明提供一种高可扩展性和可维护性的源代码缺陷检测方法,其特殊之处在于:包括下列操作步骤:
(1)将用户配置好的需要进行检测的源代码转化成抽象语法树以及控制流图,送入分析引擎,该分析引擎开始工作;
(2)根据抽象语法树以及控制流图,对源代码进行流不敏感的分析,把分析结果提交给缺陷报告模块,然后进入步骤3,进行路径敏感的分析;
(3)根据抽象语法树以及控制流图对源代码进行各种路径敏感的建模和分析,生成缺陷原始信息;
所述步骤(3)对源代码进行各种路径敏感的建模和分析由循环的工作队列算法执行,所述循环的工作队列算法由控制要素控制,所述工作队列算法的操作如下:(31)根据不同的语句类别,调用传输函数中相应的访问函数对语句进行处理和求值;(32)处理分支语句:判断当前分支上的约束条件是否可以满足,如果可满足则执行当前分支,如果不可满足则不执行当前分支;处理赋值语句:更新赋值语句中被赋值变量的值;处理函数调用语句语句:计算被调用函数的副作用和返回值;(33)对每一个执行状态用hash算法计算该执行状态的hash值,hash值对每一个不同的执行状态都是唯一的;如果一个执行状态的hash值跟已有的执行状态的hash值相等,则表明该执行状态是一个重复出现的状态,则不再存储状态,如果hash值不相等,则顺序执行后续操作;一个执行状态包括:所有已求值的表达式的值,所有变量和动态分配的内存块的值,所有符号的相关约束信息,所有检查器所需要的信息;(34)存储所有的执行状态;(35)对存储的执行状态进行建模;(36)对执行状态进行各种检测,生成缺陷原始信息;
所述控制要素包括:根据抽象语法树以及控制流图对源代码建立所有执行路径的执行状态图,并驱动检测器对执行状态图进行遍历;执行状态图为一个基于函数控制流图的程序执行图,记录函数每条可能执行路径上的执行情况;对源程序的每个分支进行遍历;控制源程序的循环语句的循环执行的最大次数;
(4)根据缺陷原始信息,对缺陷路径进行还原、精简、报告给用户。
所述步骤(36)中各种检测的内容包括:变量的值是否有定义,除数是否为0,被解引用的指针是否为空,整数运算是否溢出,数组下标是否越界,指针算术是否合法;在路径结束时还要检测:动态分配的内存是否有泄漏,获得的锁是否释放。
一种高可扩展性和可维护性的源代码缺陷检测装置,将检测工具进行模块化划分,使得工具的开发变得相对简单,不易出错。增强了工具的灵活性,可以非常方便的对工具进行各种配置和调整,包括有下述三个功能模块:
编译器前端,负责将程序源代码转化成抽象语法树以及控制流图,然后送入分析引擎,为后续分析提供便利。
缺陷报告模块,根据缺陷原始信息,对缺陷路径进行还原,精简,报告给用户。所述缺陷原始信息往往只是一个数据结构,其中包含缺陷在源代码中的位置,缺陷的类别,缺陷的触发路径和状态信息,缺陷报告模块需要根据这些信息,将缺陷在源程序的代码中显示出来,并提供相关用户。
分析引擎,对源代码进行各种建模和分析,生成缺陷的原始信息;所述执行引擎对程序进行各种分析包括:对源代码建立所有执行路径的执行状态图,并驱动检测引擎对执行状态图进行遍历;对程序的每个分支进行遍历;控制循环执行的最大次数;根据不同的语句类型,调用相应的访问函数对语句进行处理和求值;调用约束管理器判断当前分支上的约束条件是否满足。
分析引擎由分别完成各自功能的六个子功能模块组成:
执行引擎其功能是:对源程序进行各种分析,根据需求调用相应的其它五个子模块完成相应的功能。
状态管理器其功能是:存储和管理所有的执行状态,存储执行状态的信息包括:保存每一块模拟的内存块到其当前值的映射,以及每个内存块的大小,分配释放信息,利用hash算法计算每一个执行状态的hash值,并检测执行状态的hash值是否重复;具体的说状态管理器在存储每一个状态前,都用hash算法计算该状态的hash值,这个值对每一个不同的状态都是唯一的。如果一个状态的hash值跟已有的状态hash值相等,则表明该状态是一个重复出现的状态,则不再次存储该状态。这样积极的检测重复状态的出现不仅能够减少存储消耗,更重要的是对状态空间进行消减,降低检测的时间消耗。
存储管理器其功能是:负责对程序的存储状态进行建模;约束管理器其功能是:负责存储和求解程序路径中出现的各种约束条件;检测器其功能是:对执行状态进行各种检测,生成缺陷原始信息。
传输函数其功能是:对程序中的各种语句进行处理和求值,传播执行状态;在核心分析引擎中,可以进行多种不同复杂度和精确度的分析,包括从流不敏感的抽象语法树的线性遍历,到对程序路径的执行进行完整建模的符号模拟分析;传输函数根据检测要求的不同,工具需要对语句进行不同的处理,有的要求对语句进行完整的模拟执行,有的则只需要粗略的模拟,有的甚至可以直接忽略。把它们放在单独的模块中,由执行引擎根据配置需求来调用,则大大提高了检测工具的灵活度。
分析引擎各个部分被划分为相互独立的模块,模块与模块之间的交互只通过良好定义的接口进行,这意味着可以在不改变其他模块的条件下,对某一模块进行替换;可以方便的对一个模块进行功能的增加,比如利用良好的接口可以方便的增加检测器的个数。
所述源代码缺陷检测器能够检测出来的软件缺陷包括以下类型:
返回堆栈地址、返回未定义的变量、使用未定义的值作为分支判定条件、向未定义的地址赋值、使用未定义的值作为函数参数、使用NULL指针作为指定了nonnull属性的函数参数、解引用未定义的指针、解引用NULL指针、通过未定义或为NULL的函数指针调用函数、声明长度可能为0的可变长度数组、使用值为0的表达式作为除数、非法的指针算术、内存泄漏、数组下标越界、非法字符串操作。
最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解:依然可以对本发明的具体实施方式进行修改或者等同替换,而未脱离本发明精神和范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求范围当中。