章六 检查代码
软件测试不仅仅限于白产品说明书和程序当做黑盒子来对待,如果具有编程经验,即使只有一点,也可以对软件的体系结构和代码进行测试。
在某些行业中,此类验证不如黑盒测试通用。然而,如果测试军队、金融、工业自动化、医药类软件,或者有幸在组织严格的开发模式下工作,在代码的级别验证产品就是例行公事。
如果在测试软件的安全问题,那么这是必须进行的。
一、静态白盒测试:检查设计和代码
静态测试是指测试非运行部分——检验和审查。
白盒(或者称为透明盒)测试是指访问代码,能够查看和审查。
静态白盒测试是在不执行软件的条件下有条理的仔细审查软件设计、体系结构和代码、从而找出软件缺陷的过程,有时称为结构化分析。
(1)进行静态白盒测试的首要原因是尽早发现软件缺陷,以找出动态黑盒测试难以发现或隔离的软件缺陷。在开发初期让测试小组集中精力进行软件设计的审查非常有价值。
(2)进行静态白盒测试的另外一个好处是,为黑盒测试员在接受软件进行测试时设计和应用测试用例提供思路。
对于静态白盒测试最不幸的就是常常不能善始善终。许多小组错误地认为这样耗时太多,费用太高,没有产出。
二、正式审查
1、正式审查(formal review):就是进行静态白盒测试的过程,正式审查的含义很广,从两个程序员之间的简单交谈,到软件设计和代码的明细、严格检查均属于此过程。
2、正式审查有4个基本步骤:
(1)确定问题。
审查的目的是找出软件的问题——不仅是出错的项目,还包括遗漏项目。
全部的批评应该直指代码或设计,而不是其设计实现者。
(2)遵守规则。
审查要遵守一套固定的规则,规则可能设定要审查的代码量(通常有数百行),花费多少时间(数小时),哪些内容要做评价等。
(3)准备。
每一个参与者都为审查做准备,并尽自己的力量。根据审查的类型,参与者可能扮演不同的角色。
(4)编写报告。
审查小组必须做出审查结果的书面总结报告,并使报告便于开发小组的成员使用。
进行正式审查要按照已经建立起来的过程执行。随意“聚在一起进行代码审查”是不够的,实际上还会造成危害。
如果过程随意,就会遗漏软件缺陷,参与者很可能感觉这样做是在浪费时间。
如果审查正确地进行,就可以证明这是早期发现软件缺陷的好方法。
3、除了发现问题,坚持正式审查还有一些间接效果:
(1)交流
正式报告中未包含的信息得以交流。
(2)质量
程序员的代码经过逐个功能、逐行代码仔细复查,常常会使程序员变得更加仔细。
(3)小组同志化
如果审查正确进行,就会建立软件测试员和程序员对双方技艺的相互尊重,并且更好地了解相互的工作及需求。
(4)解决方案
尽管是否讨论解决方案取决于审查的规则,但是解决方案应该用于处理严重问题。
4、同事审查
召集小组成员进行初次正式审查最简单的方法是通过同事审查的方式,这是要求最低的正式方法,有时称为伙伴审查。
同事审查常常仅在编写代码或设计体系结构的程序员,以及充当审查者的其它一两个程序员和测试员之间进行。
5、走查
走查(Walkthrough)是比同事审查更正规化的下一步。
走查中编写代码的程序员向5人小组或者其它程序员和测试员组成的小组做正式陈述。
审查人员应该在审查之前接到软件拷贝,以便检查并编写备注和问题,在审查过程中提问。
审查人员之中至少有一位资深程序员是很重要的。
6、检验
检验(inspections)是最正式的审查类型,具有高度组织化,要求每一个参与者都接受训练。
检验和同事审查和走查的不同之处在于表述代码的人——表述者(presenter)或者宣读者(reader)——不是原来的程序员。
其余的参与者称为检验员(inspector),其职责是从不同的角度审查代码。
有些检验员还同时被委任为会议协调员(moderator)和会议记录员(recorder),以保证检验过程遵守规则及审查有效进行。
三、编码标准和规范
在正式审查中,检验员查找代码中的问题和缺漏,这些是典型的言行不一的软件缺陷,最佳方式是通过仔细代码分析发现。
标准是建立起来、经过修补和必须遵守的规则——做什么和不做什么。
规范是建议最佳做法、推荐更好的方式。
标准没有例外情况。
有三个重要的原因要坚持标准或规范:
(1)可靠性
事实证明按照某种标准或规范编写的代码比不这样做的代码更加可靠和安全。
(2)可读性/维护性
符合设备标准和规范的代码易于阅读、理解和维护。
(3)移植性
代码经常需要在不同的硬件中运行,或者使用不同的编译器编译。
1、编程标准和规范示例
标准由四个主要部分组成:
(1)标题:描述标准包含的主题;
(2)标准(或者规范):描述标准或规范内容,解释哪些允许哪些不允许;
(3)解释说明:给出标准背后的原因;
(4)示例;给出如何使用标准的简单程序示例。
2、风格
有标准,有规范,然后就有风格。从软件质量和测试的角度看,风格不是问题。
风格是代码的外表和感觉。
风格的差异不是软件缺陷。
3、获取标准
可从以下获得计算机的标准:
(1)美国国家标准协会(ANSI):www.ansi.org
(2)国际工程协会(IEC):www.iec.org
(3)国际标准化组织(ISO):www.iso.org
(4)信息技术标准国家委员会(NCITS):www.ncits.org
(5)美国计算机协会(ACM):www.acm.org
(6)电子电气工程协会(IEEE):www.ieee.org
四、通用代码审查清单
这些清单将代码与标准或规范比较,确保代码符合项目的设计要求。
1、数据引用错误:是指未经正确声明和初始化的变量、常量、数组、字符串或记录而导致的软件缺陷。
注意:数据引用错误是缓冲区溢出的主要原因——一个造成许多软件安全问题的缺陷。
2、数据声明错误:其产生的原因是不正确地声明或使用变量和常量。
3、计算错误:实质上是糟糕的数学问题。
4、比较错误
小于、大于、等于、不等于、真、假。比较和判断错误很可能是由于边界条件问题。
5、控制流程错误
控制流程错误的原因是编程语言中循环等控制结构未按预期方式工作,它们通常由计算或者比较错误直接或间接造成。
6、子程序参数错误
来源是软件子程序不正确的传递数据。
7、输入/输出错误
包括文件读取、接受键盘或者鼠标输入以及向打印机或者屏幕等输出设备写入错误。
8、其它检查
软件的扩展字符?编码?是否移植?兼容性?警告/提示信息?
五、小结
检查代码——静态白盒测试——被证实是早期发现软件缺陷最有效的方法。
现在有很多能自动执行大量静态白盒测试工作的商业软件,即静态分析程序。
该程序读入程序的源文件,并根据公开标准和自定义规范进行检查。
编译器也提高了能力,如果启用所有等级的错误检查,它将捕捉到前面通用代码审查清单列出的许多问题,有些编译器甚至不允许使用具有安全问题的函数。