
第2章 程序静态分析
2.1 程序静态分析概述
程序静态分析是指在不运行程序的前提下,仅通过分析或检查程序的语法、结构、过程、接口等对程序进行分析的过程,其主要目的在于检测软件中的缺陷。统计表明,在整个软件开发生命周期中,30%~70%的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。在程序静态分析过程中,要尽可能多地发现代码中的逻辑错误,让代码符合正确逻辑,并进一步满足高效性、清晰性、规范性、一致性等要求。
程序静态分析通过分析源程序的语法、结构、过程和接口等来检查和验证程序的正确性。其中,语法错误检查是最基本的程序静态分析工作之一,该检查通常由编译器完成。如图2-1所示,编写完成的程序会交由编译器逐行分析,找出程序中存在的语法错误。当程序中语法错误被修正后,研发人员还需借助人工或其他静态方法来进一步检测程序中的非语法类型缺陷,如不匹配的参数、不适当的循环嵌套和分支嵌套、不允许的递归、未使用过的变量、空指针的引用以及可疑计算等。其中,代码评审、结构分析是常用的程序静态分析方法。

图2-1 程序静态分析示意图
2.1.1 代码评审
表2-1中给出了常见的代码评审项目。与动态测试只能发现错误外部征兆不同,在代码评审过程中一旦发现错误,通常能对其进行精确定位,由此可以降低错误修正的成本。此外,在代码评审时,有时可以发现成批的错误,如分散在多处的同一类型错误,而动态测试通常只能检测到单个错误。代码评审法主要通过桌面检查、代码审查和代码走查等方式对软件代码进行检查。
表2-1 常见的代码评审项目

(1)桌面检查
桌面检查是指开发人员通过阅读程序、对照错误列表、推演测试数据等方式对代码进行缺陷检测的方法,是一种常用的代码评审方法。
与其他代码评审方法相比,桌面检查的效率是比较低的,这主要是因为桌面检查随意性较大,除非有严格的管理和技术规范约束,否则检查内容、检查方式、检查强度等内容基本都取决于开发人员个人意志,而一般情况下开发人员通常难以发现自己代码中的问题。对此,在实践中可以采用交叉桌面检查的方法:两个开发人员交换各自的程序进行检查,而不是自己检查自己的程序。
(2)代码审查
代码审查是指由若干开发人员和测试人员组成审查小组,通过阅读、讨论、评价和审议等,对程序进行静态分析的过程。代码审查通常分为两步:第1步,小组负责人把设计规格说明书、控制流程图、程序文本及有关要求和规范分发给小组成员,作为审查的依据;第2步,召开程序审查会,通过会议和集体讨论、评价和审议,以集体的智慧从不同的角度分析程序中的问题。
代码审查也是软件开发中常用的手段,同其他测试手段相比更容易发现程序中与架构、时序相关的问题。同时,代码审查还可以帮助团队成员提高编程技能,统一编程风格。
(3)代码走查
代码走查是指由人扮演计算机的角色,把数据代入程序并模拟代码的运行,观察程序是否正常运行的过程。在代码走查时,研发人员需要不断观察程序运行状态和运行结果来判断程序实现是否符合预期。与代码审查相同,代码走查过程也分为两步:第1步,小组负责人把材料先发给走查小组的每个成员,让他们认真研究程序;第2步,组织代码走查会议。与代码审查不同,与会人员不仅需要阅读程序和对照错误检查表进行检查,还需要模拟代码的运行,共同分析和检查程序的运行过程和结果。
代码审查与代码走查等方法都以小组为单位进行。但与代码审查不同,代码走查着重于模拟程序的运行,它需要开发人员预先准备一批测试用例,推演每个测试用例的运行过程和结果,把测试数据沿程序的运行逻辑走一遍,过程和中间状态记录在纸张或白板上以供监视检查。
2.1.2 结构分析
静态结构分析是帮助测试人员理解软件整体架构的有效方法。如图2-2所示,借助于面向系统结构、数据结构、数据接口、内部控制逻辑等内部组织结构的测试分析工具,程序可被转化为文件调用关系图、模块控制流图、类间依赖关系图、函数调用关系图等图表文件,从而使得测试人员可以更好地宏观把握、微观分析程序文件,更有效地发现程序当中的问题或者不合理的地方,便于进一步分析和定位缺陷。表2-2给出了常用的静态结构分析方法。根据分析结果表现形式的不同,可将其进一步分为基于表、基于图和其他类型的静态结构分析方法。

图2-2 静态结构分析示意图
表2-2 常用的静态结构分析方法
