代码级自动化测试方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
代码级自动化测试方法—程序静态分析技术及实践
作者:网络转载发表于:[ 2011/4/19 10:09:27 ]
程序静态分析(Program Static Analysis)是指在不运行代码的方式下,通过词法分析、语法分析、控制流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。它可以帮助软件开发人员、质量保证人员查找代码中存在的结构性错误、安全漏洞等问题,从而保证软件的整体质量。
本文首先对程序静态分析的特点、常用静态分析技术、静态分析实现方式进行描述,然后通过一个实例讲解了程序静态分析的执行过程。
一、静态分析特点
程序静态分析是与程序动态分析相对应的代码分析技术,它通过对代码的自动扫描发现隐含的程序问题,主要具有以下特点:
(1)不实际执行程序。动态分析是通过在真实或模拟环境中执行程序进行分析的方法,多用于性能测试、功能测试、内存泄漏测试等方面。与之相反,静态分析不运行代码只是通过对代码的静态扫描对程序进行分析。
(2)执行速度快、效率高。目前成熟的代码静态分析工具每秒可扫描上万行代码,相对于动态分析,具有检测速度快、效率高的特点。
(3)误报率较高。代码静态分析是通过对程序扫描找到匹配某种规则模式的代码从而发现代码中存在的问题,例如可以定位strcpy()这样可能存在漏洞的函数,这样有时会造成将一些正确代码定位为缺陷的问题,因此静态分析有时存在误报率较高的缺陷,可结合动态分析方法进行修正。
二、常用静态分析技术
(1)词法分析:从左至右一个字符一个字符的读入源程序,对构成源程序的字符流进行扫描,通过使用正则表达式匹配方法将源代码转换为等价的符号(Token)流,生成相关符号列表,Lex为常用分析工具。
(2)语法分析:判断源程序结构上是否正确,通过使用上下文无关语法将相关符号整理为语法树,Yacc为常用工具。
(3)抽象语法树分析:将程序组织成树形结构,树中相关节点代表了程序中的相关代码,目前已有javacc等抽象语法树生成工具。
(4)语义分析:对结构上正确的源程序进行上下文有关性质的审查。
(5)控制流分析:生成有向控制流图,用节点表示基本代码块,节点间的有向边代表控制流路径,反向边表示可能存在的循环;还可生成函数调用关系图,表示函数间的嵌套关系。
(6)数据流分析:对控制流图进行遍历,记录变量的初始化点和引用点,保存相关数据信息。
(7)污点分析:基于数据流图判断源代码中哪些变量可能受到攻击,是验证程序输入、识别代码表达缺陷的关键。
三、静态分析实现方式
(1)基于规则的代码静态分析
通过自动化逐行扫描程序代码,从中查找是否存在与事先构建好的规则模式相匹配的代码,如果发现相匹配的代码,则报告相应错误。基于规则的静态分析方式可以预防非法代码的出现,既可满足业界标准(如:MISRA,JSF,ELLEMTEL)也可满足企业内部自定义规范,同时可以增强团队编码规范的一致性。通过基于规则的代码静态分析可以及时发现并修复违规代码,为后续工作节省大量测试及调试时间—大大降低引入违规代码所导致的成本,可以预防内存泄漏、资源泄漏、安全性漏洞等问题的发生,据统计通过基于规则的静态分析可以预防大约60%的代码缺陷发生。
(2)基于数据流的代码静态分析
通过静态模拟应用程序的执行路径,帮助用户找到运行时才能暴露的一些严重错误,如资源泄漏、空指针异常、SQL注入以及其它的安全性漏洞等潜在的运行时错误。这些严重的错误往往通过一般的静态规则扫描难以查找,此时需要数据流分析技术,也叫BugDetective。这使得在后期需要数周的时间才能发现的严重错误能够尽早被发现或修复。该技术对于嵌入式环境测试尤其有效,原因很简单,嵌入式环境往往需要整个项目代码初步实施完成,相应的硬件测试环境准备充分,方可测试一些运行时错误,而通过数据流分析技术,可以在项目开始的初期即引入测试,及早发现一些严重错误。
基于规则的静态分析和数据流静态分析的主要区别是,使用基于规则的静态分析,只要你发现并修复了引发某个缺陷的编码结构后,你就能保证这一类错误不会再发生。数据流静态分析发现的错误则是在实际的程序路径运行时才会发生的,而不仅仅是危险的编码结构。但是,你一定要意识到,只使用数据流分析也会忽略某些错误,同时相比较基于规则的静态分析,数据流分析的误报率可能更高一些。
四、静态分析实例
下面以一个基于规则的程序静态分析案例为例,简要介绍代码静态分析的过程,假设我们针对SwitchStmtsShouldHaveDefault(Switch语句块应该包含一条Default语句)规则对源码进行检测,被测代码如下:
public class Foo {
public void bar() {
int x = 2;
switch (x){
case 2:int j = 8;
}
}
}
首先对被测程序进行语法分析、词法分析生成被测程序的抽象语法树,在此可借助PMD框架中的Javacc和JJtree工具产生抽象语法树,生成的语法树,在生成抽象语法树后,对抽象语法树进行遍历,定位关于Switch语句相关节点,针对上述程序,可定位SwitchLabel节点,SwitchLabe节点代表Switch 语句块中的一种判断情况,针对SwitchLabe节点的Default属性进行判断,如果Default属性的值为True,证明Switch语句块包含Default语句,如果值为False代表不包含Default语句,对于这种情况,记下语句所在文件名、所在行号,标记为错误,将结果返回用户,完成检测流程。
五、结束语
本文对程序静态分析技术的相关内容做了简要的概括,做为一项成熟的技术,程序静态分析必将收到软件质量保证人员的关注,帮助相关人员找出代码中存在的缺陷和安全漏洞,提高软件产品质量。