摘要:本文描述了软件代码审查的作用、代码审查内容、代码审查过程,并列举一些常见代码审查问题。 关键词:软件测试;代码审查; 一、引言 软件测试常用方法可分为动态测试和静态测试,只有动态测试和静态测试有效结合,才能更好的完成软件测试工作。代码审查是软件静态测试中常用的软件测试方法之一,代码审查时,只要测试人员方法得当、足够细心,往往能够产生意想不到的效果。 二、代码审查的作用 代码审查是在不执行软件的条件下有条理的仔细审查软件代码,从而找出软件缺陷的过程。 代码审查可以找出动态测试难以发现或隔离的软件缺陷。在开发过程初期让测试人员集中精力进行软件代码审查非常有价值:可以提高代码质量;在项目的早期发现缺陷,将损失降至最低;促进团队沟通、促进知识共享、共同提高。 代码审查还可以为动态测试时设计和执行测试用例提供思路。通过代码审查,可以确定有问题或者容易产生软件缺陷的特性范围。 三、代码审查的过程 代码审查过程可分为:代码审查策划阶段、代码审查实施阶段以及代码审查总结阶段。 (一)代码审查策划阶段 1、项目负责人分配代码审查任务; 2、确定代码审查策略:依据软件开发文档,确定软件关键模块,作为代码审查重点;将复杂度高的模块也作为代码审查的重点; 3、项目负责人确定代码审查单,审查内容一般可包括: (1)可追溯性: ――代码是否遵循详细设计? ――代码是否与需求一致?
(2)逻辑: ――表示优先级的括号用法是否正确? ――代码是否依赖赋值顺序? ――“if…else”和“switch”使用是否正确清晰? ――循环能否结束? ――复合语句是否正确地被花括号括起来? ――case语句是否所有可能出现的情况均已考虑? ――“goto”是否使用?
(3)数据: ――变量在使用前是否已初始化? ――变量的声明是否按组划分为外部的和内部的? ――除最明显的声明外,是否所有声明都有注释? ――每个命名是否仅用于一个用途? ――常量名是否都大写?
――常量是否都是通过“#define”定义的? ――用于多个文件中的常量是否在一个头文件中定义? ――头文件中是否存在可执行的代码? ――定义为指针的变量是否作为指针使用(而不是作为整数)? ――指针是否初始化? ――释放内存后是否将指针立即设置为NULL(或0)? ――传递指针到另一个函数的代码是否首先检查了指针的有效性? ――通过指针写入动态分配内存的代码是否首先检查了指针的有效性? ――宏的命名是否都大写? ――数组是否越界?
(4)接口: ――在所有的函数及过程调用中,参数的个数都正确吗? ――形参与实参类型匹配吗? ――参数顺序正确吗? ――如果访问共享内存,是否具有相同的共享内存结构模式?
(5)文档: ――软件文档是否与代码一致?
(6)注释: ――注释与代码是否一致? ――用于理解代码的注释是否提供了必要的信息? ――是否对数组和变量的作用进行了描述?
(7)异常处理: ――是否所有可能的错误都已加以考虑?
(8)内存: ――在向动态分配的内存写入之前是否检查了内存申请是否成功? ――若采用动态分配内存,内存空间分配是否正确? ――当内存空间不再需要时,是否被明确的释放?
(9)其它: ――是否检查了函数调用返回值? ――所有的输入变量都用到了吗? ――所有的输出变量在输出前都已赋值了吗?
4、确定代码审查进度安排,项目负责人负责安排代码审查的进度。 (二)代码审查实施阶段 1、代码讲解:软件开发人员详细向测试人员讲解如何以及为何这样实现,测试人员提出问题和建议。通过代码讲解,测试人员对被审查的软件有了一个全面的认识,为后续代码审查打下良好的基础。 2、静态分析:一般采用静态分析工具进行,主要分析软件的代码规模、模块数、模块调用关系、扇入、扇出、圈复杂度、注释率等软件质量度量元。静态分析在代码审查时应优先进行,有利于软件测试人员在后续代码审查时对软件建立宏观上认识,在审查中容易做到有的放矢,更易于发现软件代码中的缺陷。 3、规则检查:采用静态分析工具对源程序进行编码规则检查,对于工具报出的问题再由人工进行进一步的分析以确认软件问题,是一种比较有效的方法。 4、正式代码审查:代码审查可分两步进行:独立审查和会议审查。根据情况,这两步可以反复进行多次。 (1)独立审查:测试人员根据项目负责人的工作分配,独自对自己负责的软件模块进行代码审查。测试人员根据代码审查单,对相关代码进行阅读、理解和分析后,记录发现的错误和疑问。 (2)会议审查:项目负责人主持召开会议,测试人员和开发人员参加;测试人员就独立审查发现的问题和疑问与开发人员沟通,并讨论形成一致意见;对发现的问题汇总,填写软件问题报告单,提交开发人员处理。 5、更改确认:开发人员对问题进行处理,代码审查人员对软件的处理情况进行确认,验证更改的正确性,并防止出现新的问题。 (三)代码审查总结阶段 代码审查工作结束后,项目负责人总结代码审查结果;编写测试报告,对软件代码质量进行评估,给出合理建议。 把代码审查提出的所有问题、亮点及最终结论详细的记录下来,供其他软件项目代码审查借鉴。必要时,可建立常见软件代码缺陷数据库,为软件代码审查人员培训和执行代码审查提供数据支持,也可以为软件编码规则制定规范提供实践依据。 四、代码审查中的常见问题 如果软件测试人员熟悉常见的软件代码审查问题,对代码审查效率是很有帮助的。笔者根据自己的应验,列举部分常见软件代码审查问题如下(仅供参考): (1)浮点数相等比较:可能造成程序未按设计的路径执行; (2)因设计原因导致某些代码不能执行:如逻辑表达式永远为真(或假)造成某分支不能执行、代码前面有return语句、某模块从未被调用等; (3)switch语句没有break语句(有意如此设计时除外); (4)数组越界使用:数组越界容易发生在数组下标是计算得到的情况下,而且审查时很难发现这种代码缺陷,应加以重视; (5)变量未初始化就使用或者是条件赋值就使用; (6)程序中存在未使用的多余变量; (7)复合逻辑表达式没有使用括号造成运算顺序错误; (8)有返回值的函数中return没有带返回值; (9)逻辑判别的表达式不是逻辑表达式; (10)动态分配的内存没有及时释放:忘记写内存释放代码或由于其它逻辑缺陷导致内存释放代码未得到执行; (11)没有对缓冲区溢出进行必要的防护; (12)访问空指针,即指针未初始化就使用; (13)指针指向的内存释放后,未将指针置为NULL:其它函数访问该指针时,判断指针不为空,当作有效指针使用,会造成内存访问错误; (14)注释说明与程序代码实现不一致,甚至相反; (15)循环存在不能跳出的可能,程序中没有相应的保护机制。 五、结束语 软件代码审查是重要的软件测试方法之一,软件测试单位应建立完善的代码审查规程,规范代码审查过程。代码审查人员应善于使用软件静态分析工具,善于总结代码审查经验。软件代码审查工作做得扎实,可以发现很多软件编码隐含的缺陷,提高软件的可靠性,为后续的动态测试打下良好的基础。
|