一、 介绍 静态测试是软件测试的一种形式,而软件实际上并没有被使用。这与动态测试不同。它通常不是详细的测试,而是主要检查代码、算法或文档的完整性。它主要是对代码进行语法检查,或者手工读取代码或文档以查找错误。这种类型的测试可以被单独编写代码的开发人员使用。代码审查、检查和演练也被使用。 从黑盒测试的角度来看,静态测试包括对需求或规范的审查。这样做的目的是为了完成手头的任务的完整性或适当性。这是验证和验证的验证部分。 在这个开发阶段发现的bug比在开发周期中更便宜。 二、 静态代码分析 静态代码分析是对计算机软件的分析,它是在没有实际执行从该软件构建的程序的情况下执行的(在执行程序上执行的分析称为动态分析)。在大多数情况下,分析是在某些版本的源代码中执行的,而在另一些情况下则是某种形式的对象代码。这个术语通常应用于一个自动化工具进行的分析,而人类分析被称为程序理解或程序理解。 工具所执行的分析的复杂程度不同于只考虑单个语句和声明的行为,以及在分析中包含程序的完整源代码的那些。从分析中获得的信息的使用,从强调可能的编码错误(例如,lint工具)到正式的方法,这些方法在数学上证明了给定程序的属性(例如,它的行为与它的规范相匹配)。 有些人认为软件度量和逆向工程是静态分析的形式。 静态分析越来越多的商业用途是在对安全关键计算机系统中使用的软件的属性进行验证,并定位潜在的易受攻击的代码。 三、 正式的方法 正式的方法是应用于软件(和硬件)分析的术语,其结果纯粹是通过使用严格的数学方法获得的。所使用的数学技术包括denot语义、公理语义、操作语义和抽象解释。 已经证明,除非一些假设项目是有限的和小的状态空间,寻找可能的运行时错误,或者更一般的任何违反规范程序的最终结果,是不可判定的,没有固定的方法能如实回答是否一个给定的程序可能会或可能不会出现运行时错误。这个结果可以追溯到20世纪30年代的教堂、哥德和图灵的作品(见停止的问题和赖斯的定理)。就像大多数不可判定的问题一样,人们仍然可以尝试给出有用的近似解。 正式静态分析的一些实现技术包括: l 模型检查考虑的是具有有限状态的系统,或者可以通过抽象将其简化为有限状态; l 抽象解释模拟了每个语句对抽象机器状态的影响(例如,它根据每个语句和声明的数学属性“执行”软件)。这个抽象的机器高估了系统的行为:抽象系统因此变得更简单,以牺牲不完整性为代价(不是原始系统的每一个属性都是真实的抽象系统)。但是,如果正确地完成了,抽象的解释是合理的(抽象系统的每一个属性都可以映射到原始系统的真实属性)。 l 在程序代码中使用声明,这是Hoare逻辑首先提出的。有一些编程语言的工具支持(例如,SPARK编程语言(Ada的子集)和Java建模语言——JML——使用esc/Java和esc/java2)。
|