第6章基于缺陷模式的软件测试26.1概述缺陷模式必须满足下列几个条件:该模式下的缺陷是符合实际的。基于该模式的缺陷数目是可以容忍的。该模式下的缺陷是可以测试的。应该存在一个算法可以检测出这些缺陷。3概述基于缺陷模式的软件测试技术具有如下特点:针对性强:如果说某种模式的缺陷是经常发生的,并且在被测软件中是存在的,则面向缺陷的测试可以检测出此类缺陷。基于缺陷模式的软件测试技术往往能发现其他测试技术难以发现的故障,如内存泄漏缺陷,空指针引用缺陷。工具自动化程度高以及测试效率高。缺陷定位准确:对测试所发现的缺陷能够准确定位。易学、易使用。46.2缺陷模式缺陷模式概述故障模式安全漏洞模式缺陷模式56.2.1缺陷模式概述缺陷模式是和语言本身相关的,不同的语言有着不同的缺陷模式。以C++语言和Java语言为背景来描述其缺陷模式,将软件的缺陷模式分为四个层次故障模式漏洞模式缺陷模式规则模式61.故障模式此类缺陷是故障,一经产生,会导致系统出错。内存泄露模式资源泄漏模式指针使用错误模式数组越界模式非法计算模式使用未初始化变量模式死循环结构模式死锁模式72.安全漏洞模式此类缺陷会给系统留下安全隐患,为攻击该系统开了绿灯。缓冲区溢出模式被感染的数据模式竞争条件模式风险操作模式83.缺陷模式此类缺陷是不应该发生的,它未必会造成系统的错误,但可能会隐含某些故障,或者是由初级软件工程师不理解造成的。性能缺陷模式:此类缺陷会降低系统的性能疑问代码模式:让人费解的代码94.规则模式软件开发总要遵循一定的规则,某个团队也有一些开发规则,违反这些规则也是不允许的。代码规则复杂性规则控制流规则命名规则可移植性规则资源规则106.2.2故障模式故障模式中给出的故障描述,是程序中可能存在的故障,这些故障一旦出现,就会使系统发生错误。111.内存泄漏的故障模式内存泄漏故障(MemoryLeakFaults,MLF):设在程序的某处申请了大小为M的空间,凡在程序结束时M或者M的一部分没被释放、或者多次释放M或M的一部分,都是内存泄漏故障。MLF有三种形式:遗漏故障:是指申请的内存没有被释放。不匹配故障:是指申请函数和释放函数不匹配。不相等的释放错误:是指释放的空间和申请的空间大小不一样。122.数组越界故障模式数组越界故障:设某数组定义为Array[minmax],若引用Array[i]且imin或imax都是数组越界故障。在C++中,若i0或imax是数组越界故障。13数组越界故障模式(1)对程序中任何出现Array[i]的地方,都要判断i的范围,可能有三种情况:若i是在数组定义的范围内,则是正确的;若i是在数组定义的范围外,则是OBAF;若i是不确定的,则Array[i]是否是OBAF则不确定。(2)字符串拷贝过程中存在的数组越界故障。(3)在结构类型中,由于结构体中的成员变量是连续存放的,在数组的拷贝过程中,多余的数据会自动的存放在后面所定义的成员变量中,这种情况,数组并不产生越界错误。143.使用未初始化变量故障模式使用未初始化变量故障:存在一个路径,在该路径上使用前面没有被赋初值的变量是使用未初始化变量故障。4.空指针使用故障空指针使用故障:引用空指针或给空指针赋值的都是空指针使用故障。155.非法计算类故障非法计算类故障:是指计算机不允许的计算。一旦非法计算类故障产生,系统将强行退出。例如:除数为0故障。对数自变量为0或负数故障。根号内为负数的故障。166.死循环结构模式在控制流图中,对任何一个循环结构,包括:FOR语句中的死循环结构;WHILE语句中的死循环结构;DO-WHILE语句中的死循环结构;GOTO语句中的死循环结构;函数循环调用造成的死循环结构。要分析控制循环变量的开始条件、结束条件、步长变化,检查该循环能否结束,若不能则会形成死循环。177.资源泄漏故障资源泄漏故障:在Java程序中,当一个资源被打开后,如果并不是在所有的可执行路径上都对其进行了显式的释放操作,则是一个资源泄漏故障。188.并发故障模式该模式主要是针对程序员对多线程的编码机制、各种同步方法、Java存储器模式和java虚拟机的工作机制不清楚,而且由于线程启动的任意性和不确定性使用户无法确定所编写的代码具体何时执行而导致对公共区域的错误使用。这类模式主要包括不正确的同步、死锁、多线程应用中方法调用时机或方式不正确、同一变量的双重验证、相互初始化的类和临界区内调用阻塞函数等。196.2.3安全漏洞模式安全漏洞模式为他人攻击软件提供可能。而一旦软件被攻击成功,系统就可能发生瘫痪,所造成的危害较大,因此,此类漏洞应当尽量避免。下面以C++为基础,介绍基于安全漏洞检测的缺陷模式。201.缓冲区溢出漏洞模式当程序要在一个缓冲区内存储比该缓冲区的大小还要多的数据时,即会产生缓冲区溢出漏洞。缓存区溢出主要有2种类型:数据拷贝造成的缓冲区溢出格式化字符串造成的缓冲区溢出212.被污染的数据模式程序从外部获取数据时,这些数据可能含有具有欺骗性或者是不想要的垃圾数据,如果在使用这些数据前不进行合法性检查则将威胁到程序的安全,造成一个被污染的数据缺陷。被污染的数据可能会导致程序不按原计划执行,也有可能直接或间接地导致缓冲区溢出缺陷。被污染的数据模式主要有两种类型:使用的数据来自外部的全局变量使用的数据来自输入函数223.竞争条件如果程序中有两种不同的I/O调用对同一文件进行操作,而且这两种调用是通过绝对路径或相对路径引用文件的,那么就易出现RaceCondition问题。在两种操作进行的间隙,黑客可能改变文件系统,那么将会导致对两个不同的文件操作而不是同一文件进行操作。这种典型的问题发生在用户拥有不同的权限运行的程序中(例如:setuid程序、数据库和服务器程序等)。234.风险操作如果不恰当地使用了某些标准库函数,可能会带来安全隐患。甚至在某些情况下,某些函数一经被使用,就可能会带来安全隐患。例如像rand()和random()这样的随机数生成函数,它们在生成伪随机值的时候表现出来的性能是非常差的,如果用它们来生成默认的口令,这些口令将很容易被攻击者猜测到。246.2.4缺陷模式1.低性能模式该模式导致软件运行效率低下,因此建议采用更高效的代码来完成同样的功能。这类模式主要包括使用低效函数/代码、使用多余函数、Java中显式垃圾回收、冗余代码、头文件中定义的静态变量、不必要的文件包含、字符串低效操作和有更简单的运算可以替代等。25缺陷模式2.代码国际化模式该模式主要是在对语言进行国际化的过程中,可能造成本地设置和程序需求不符的情况,造成匹配错误。3.疑问代码模式该模式主要指代码中容易引起歧义、让人迷惑的编写方式。