静态测试是通过分析代码来发现错误,所依据的只能是数据和代码的自然属性,对业务属性则 一无所知。静态测试并不需要执行软件,通过审查软件的设计、体系结构和代码,从而找出软件缺 陷的过程,有时也称为结构化分析。 这就是这类方法的极限,即静态测试方法做到极致,也只能发现一小部分错误。另外,静态分 析只能基于现有代码,不能发现代码缺失造成的错误。 静态测试常用的方法有:代码走查、数据流分析、控制流分析和信息流分析。
代码走查 代码走查(code walkthrough)是开发人员与架构师集中讨论代码的过程,检查代码的逻辑和 语法是否正确。 代码走查的作用主要包括以下几个方面: 检查是否符合编辑规范; 检查代码逻辑是否存在问题; 对源代码进行重构; 分享开发经验。 代码走查过程中需要注意的是,不应该匆匆忙忙地完成一次代码走查,需要充分地、认真地对 待,同时在代码走查过程中可以学习其他工程师的经验。在走查过程中不能用自己的编程思维看待 代码,代码走查的目的是确定代码是否正确。控制流分析 控制流分析方法主要是将程序流程图转换为控制流程图,通过控制流程图来分析程序中可能存 在的问题,通过分析控制流程图主要发现以下几类问题: (1)转向并不存在的标号。 (2)没有用的语句标号。 (3)从程序入口进入后无法达到的语句。 (4)不能达到停机语句的语句。 在控制流程图中只有以下两种图形符号: (1)结点:以标为编号的圆圈表示,它代表了程序流程图中矩形框所表示的处理、菱形所表 示的两个或多个出口判断以及两至多条流线相交的汇合点。 (2)控制流线或弧:以箭头表示,它与程序流程图中的流线是一致的,表明了控制的顺序。 为方便记录,一般会在控制流线上标有名字,如 a、b、c 等。 控制流分析步骤如下: (1)确定所有程序元素。 (2)根据程序元素之间的相互关系得到控制流程图。 (3)将控制流程图转换成控制流矩阵。 (4)通过数据结构的形式把控制流矩阵表示出来。 (5)借助算法对控制流进行分析,找出存在的问题。 【实例】根据代码画出的控制流程图如图 10-5 所示。
根据控制流程图画出的控制流矩阵见表 10-2。
通过分析控制流矩阵判断程序是否存在控制流分析方法所关注的几类问题,该实例是正确的, 不存在那四类问题。
数据流分析 数据流分析最初是随着编译系统要生成有效的目标码而出现的,这类方法主要用于代码优化。 近年来数据流分析方法在确认系统中也得到成功的运用。通过数据流分析可以查找代码中引用但未 定义的变量等错误,查找以前未使用的变量再次赋值等数据流异常的情况。数据流分析法的关键是 数据的定义和引用。 数据的定义:如果程序中某一语句执行时能改变某程序变量 M 的值,则称 M 是被该语句定 义的。 数据的引用:如果语句的执行引用了内存中变量 N 的值,则称该语句引用变量 N。 数据流分析方法主要是发现以下两种错误: (1)变量未定义但被引用。 (2)变量定义但未被引用。 数据流分析方法使用步骤如下: (1)根据代码画出控制流程图。 (2)根据控制流程图画出数据流表。 (3)分析数据流表。 (4)根据分析结果对代码进行修正和优化。 【实例】根据代码画出的控制流程图如图 10-6 所示。
根据控制流程图画出的数据流表见表 10-3。
对数据流分析表进行分析,可以发现以下问题: (1)语句 2 中使用的变量 M 在之前的语句中并未定义。 (2)语句 5 中定义的变量 N,在后面一直未使用。 (3)语句 7 中定义的变量 Z,在语句 8 中被重新定义了,这样会出现异常警告。 10.2.4 信息流分析 信息流分析主要是验证程序变量间信息的传输。程序的信息关系可以通过输入变量与语句关 系、语句与输出变量关系和输入变量与输出变量关系三个表来导出。
输入变量与语句关系:输入变量直接或间接影响语句的执行。 语句与输出变量关系:语句执行直接或间接影响变量的输出。 输入变量与输出变量关系:输入变量直接或间接影响输出变量。 信息流分析的步骤如下: (1)根据代码得到三个关系表:输入变量与语句关系表、语句与输出变量关系表、输入与输 出变量关系表。 (2)分析输入变量与语句关系表,查看对未定义的变量所有可能的引用,根据语句的执行情 况来判断是哪个输入变量未定义。 (3)分析语句与输出变量关系表,查看所有可能会影响输出变量取值的语句,根据语句的执 行情况来判断是哪条语句导致输出变量错误。 (4)分析输入变量与输出变量关系表,查看所有可能影响输出变量取值的输入变量,判断输 出变量会不会由一些非法的变量导出。 信息流主要分析以下内容: (1)能够列出对输入变量的所有可能的引用。 (2)在程序的任何指定点检查其执行可能影响某一输出变量值的语句。 (3)输入输出关系提供一种检查,看每个输出值是否由相关的输入值而不是其他值导出。 【实例】如以下代码段(此代码为伪代码):
根据代码分析出输入变量与语句关系表、语句与输出变量关系表和输入变量与输出变量关系 表,如图 10-7 所示。
图 10-7 输入变量、语句、输出变量关系表 输入变量与语句关系表中,由于输入变量 M、N 的大小直接影响 while 语句的循环次数,所以 输入变量与语句 3、4、5 是有关系的。
语句与输出变量关系表中,语句 1、2、3 和 4 与输出变量的关系比较容易理解,较难理解的是 语句 5 与输出变量 Q 和 R 都有关系,因为语句影响输出变量 R 的值,而 R 的值又影响 while 语句 的循环次数,所以间接影响输出变量 Q 的值。 输入变量与输出变量的关系表比较容易理解,输入变量 M、N 决定输出变量 Q 和 R 的大小。