面向程序代码的软件缺陷分类法_第1页
面向程序代码的软件缺陷分类法_第2页
面向程序代码的软件缺陷分类法_第3页
面向程序代码的软件缺陷分类法_第4页
面向程序代码的软件缺陷分类法_第5页
已阅读5页,还剩4页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向程序代码的软件缺陷分类法

0错误分类方法interpersonal众所周知,软件故障对软件可靠有重要影响。软件错误是一种人为错误,一个软件错误必定产生一个或多个软件缺陷。当一个软件缺陷被激活时,便产生一个软件故障。软件故障如果没有得到有效、及时的处理,便不可避免地导致软件失效。因此,分析不同软件故障对软件可靠性的影响,是软件可靠性研究的重要内容之一。由于软件错误和缺陷是软件失效的源头,人们对此进行了大量的研究工作,提出了多种软件缺陷分类法。由于观察问题的角度不同,其分类也各有不同,下面是几种有代表性的软件缺陷分类:(1)Putnam等人从软件生存周期的角度提出的分类方法,将软件缺陷分为六类:需求缺陷、设计缺陷、文档缺陷、算法缺陷、界面缺陷和性能缺陷。(2)Thayer软件错误分类方法按错误性质分类,它利用测试人员在软件测试过程填写的问题报告和用户使用软件过程反馈的问题报告作为错误分类的信息,包括16大类,164个子类。这16个大类分别是计算错误、逻辑错误、I/O错误、数据加工错误、操作系统和支持软件错误、配置错误、接口错误、用户需求改变(指用户在使用软件后提出软件无法满足的新要求产生的错误)、预置数据库错误、全局变量错误、重复的错误、文档错误、需求实现错误(指软件偏离了需求说明产生的错误)、不明性质错误、人员操作错误、问题(指软件问题报告中提出的需要答复的问题)。该分类方法特别适用于指导开发人员的缺陷消除和软件改进工作。通过对错误进行分类统计,可以了解错误分布状况,对错误集中的位置重点加以改进。该方法分类详细,适用面广,当然分类也较为复杂。该分类方法没有考虑造成缺陷的过程原因,不适用于软件过程改进活动。(3)电气和电子工程师学会制定的软件异常分类标准(IEEEStandardClassificationforAnomalies1044-1993)对软件异常进行了全面的分类,该标准描述了软件生命周期各个阶段发现的软件异常的处理过程。分类过程由识别、调查、行动计划和实施处理四个步骤组成,每一步骤包括三项活动:记录、分类和确定影响。异常的描述数据称为支持数据项,分类编码由两个字母和三个数字组成,如果需要进一步的分类可以添加小数。其中调查步骤将异常类型分为逻辑问题、计算问题、接口/时序问题、数据处理问题、数据问题、文档问题、文档质量问题和强化问题,共八个大类,每一个大类又分为数量不等的小类。分类细致深入,准确说明了异常的类型。(4)正交缺陷分类ODC(OrthogonalDefectsClassification)是IBM公司提出的缺陷分类方法。缺陷类型被分为七大类:赋值、检查、算法、时序、接口、功能、关联。该分类方法提供一个从缺陷中提取关键信息的测量范例,用于评价软件开发过程,提出正确的过程改进方案。该分类方法分类细致,适用于缺陷的定位、排除、原因分析和预防活动。缺陷特征提供的丰富信息为缺陷的消除、预防和软件过程的改进创造了条件。它的缺点在于分类复杂,难以把握分类标准,缺陷分析人员的主观意见会影响属性的确定。(5)马里兰大学/NASA软件工程实验室缺陷分类法。它从缺陷的最初来源,缺陷修复时间,缺陷发现方法,缺陷发现的模块这四个因素入手开展缺陷分析。该分类法仅从缺陷产生的原因分析,没有从缺陷发生的角度分析,仅是ODC方法实现的一部分。(6)优利系统公司错误分类方案。1984年优利系统公司实行的错误分类方案通过填写软件变更报告,搜集软件变更原因、问题适合的发现和隔离方式、软件开发人员最初编写的代码是否正在被修补、隔离和修改花费的时间、修改的模块等客观问题,以及问题原因判断、理由两个主观问题的答案。这些问题的回答帮助将缺陷从“错误主要分类”、“错误类型”、“限定”、“用途”四个方面分类。该分类从软件开发过程中多个角度实现了有价值的分析,但分类不够清晰。(7)IBM的缺陷预防方案。1990年IBM研究中心的R.G.Mays等人提出的缺陷预防方案是采用因果分析方法对缺陷进行分析,包括三个步骤:1)将缺陷归类于疏忽、教育、交流不当、文字错误等问题;2)分析缺陷起因及引入的时间,并讨论如何防止类似缺陷再次出现;3)查找剩余残留缺陷,并消除所有存在的缺陷并改进开发过程。该方法和根源分析法类似,人为执行因果分析时容易受到过多主观因素的影响,分析结果不客观。以上是当前有代表性的几种软件缺陷分类方式,但这些分类法都是宏观地考虑整个软件开发过程,并没有从代码的角度对软件缺陷进行分类。1常用错误事件使用程序变异方法注入故障,首先必须从程序代码的角度对软件缺陷进行分类。在分析、研究了已有的各种分类方法的基础上,针对C++语言,我们提出了面向程序代码的软件缺陷分类法。该方法将软件缺陷分为以下五类:(1)赋值缺陷主要指由变量未赋值和赋值不正确引起的故障。这类软件故障主要包括:变量未初始化就使用错误;数组变量的越界错误;数组元素使用错误;指针变量使用错误;指针越界;数据类型不匹配的错误;算术表达式优先级错误;非法算术运算错误(除数0,负数开方);整数和浮点数的上溢下溢错误;非法类型转换错误;引用赋值与内容赋值使用错误等。这类故障常发生于函数的开头部分。(2)分支缺陷主要发生在分支的判断体及分支结构部分。这类软件缺陷主要包括:等于运算符使用错误;边界值被忽略;逻辑运算符与位运算符的误用;逻辑运算符使用错误;if-else匹配错误;缺少默认情况;逻辑表达式优先级错误;引用比较与内容比较使用错误等。(3)循环缺陷主要发生在循环条件及循环结构部分。这类软件缺陷主要包括:边界值错误;等于运算符使用错误;循环变量使用错误;多循环嵌套时,因大括号位置错误引起的循环体不完整;break语句与continue语句使用错误;永不循环错误等。(4)接口缺陷主要指用户、构件、函数之间的信息交换错误。这里所说的接口表现为函数调用、参数传递、函数返回值及共享的全局变量。这类软件缺陷主要包括:函数调用参数传递错误;多出口函数中某个return语句的丢失错误;return语句返回值错误;函数调用错误;函数调用丢失;响应延迟;响应丢失类故障;发送/接受错误消息;多用户冲突引起的系统异常;同步异常等。其中,响应延迟、响应丢失类故障、发送/接受错误消息、多用户冲突引起的系统异常和同步异常主要发生在分布式软件中。(5)类缺陷主要指与面向对象特征相关的错误。这类软件缺陷主要包括:访问控制错误;状态可见性异常;状态定义不一致;状态定义异常;异常处理错误;构造函数行为异常;构造函数不完整;类型使用不一致;重载函数实现错误;重载函数使用错误等。2基于程序变异的变异算子测试程序变异作为一种软件实现的故障注入方法,最早在20世纪70年代末期由DeMillo等人提出。它能够系统地模拟软件中存在的各种缺陷,并构造较为完备的测试用例集。虽然该技术具有较强的排错能力,但它对资源的消耗也是不容忽视的。程序变异是指根据软件缺陷定义一系列的变异算子,并将变异算子作用于程序代码,从而改变程序句法以达到故障注入的目的。程序变异理论基于两个基本假设:一是程序员的能力假设,即假设程序不存在功能型错误,只存在一些代码编写的失误;二是组合效应假设,即复杂错误是简单错误的组合。程序变异常用于软件测试阶段,它的基本原理是使用变异算子每次对被测试程序做一处微小的合乎语法的改动,从而产生大量的新程序,我们称之为变异体,然后根据已有的测试数据运行变异体,比较变异体和原程序的运行结果,如果两者不同,就称测试数据将该变异体杀死。这样做的目的是不断提高测试数据集的测试充分度。变异测试是一种行之有效的测试方法,具有排错能力强、灵活性好、自动化程度高等优点。但它也存在一些缺点,如需要大量的计算机资源来产生、存储、运行变异体,并且需要大量的人工操作。在程序变异中,变异算子的设计一直是人们研究的重点。针对不同类型的软件缺陷,研究人员设计出不同类型的变异算子。按照模拟软件缺陷的类型不同,可将程序变异分为以下四种:(1)传统变异在早期程序变异的研究中,变异算子的设计主要集中在对操作数和运算符的变异上。有代表性的研究成果是Mothra测试工具集。它针对Fortran语言定义了22种变异算子,这些变异算子源自程序员的错误。(2)接口变异它模拟集成错误,在模块的接口处作用变异算子产生变异体。变异算子的设计主要针对函数调用、参数传递、函数返回值、共享的全局变量。文献针对C语言设计了分别作用于被调用函数内部和调用函数内部的两组接口变异算子。文献的实验结果表明接口变异不仅产生较少的变异体,消耗较少的资源,而且揭错率也维持在较高的水平。(3)类变异是传统变异测试的一个延伸,它针对面向对象软件的特殊性质,模拟类、对象、继承、封装、信息隐蔽、多态、动态绑定等方面的软件缺陷。文献针对Java语言定义类变异算子,通过类变异算子植入与Java面向对象特征相关的错误。这些变异算子包括:更改访问控制符;删除隐藏变量;插入隐藏变量;删除覆盖方法;改变覆盖方法调用位置;重名命覆盖方法;删除super关键词;删除父类构造函数的显式调用;将子类型对象的声明替换为父类型;子类对象替换参数中的父类对象;兼容类型对象的赋值替换;改变重载方法的内容;删除重载方法;删除异常处理;修改异常处理;引用赋值和内容赋值之间的替换;引用比较和内容比较之间的替换。(4)合约变异它是针对功能规约的变异测试,发现由于规约被错误理解或实现所导致的程序中的错误。与传统变异测试相比,合约的规模小于程序,其产生的变异体数目较小。此外,还可以通过定义有效的变异算子来减少合约变异体的数量,从而降低变异测试的计算代价。3变异体检测我们用变异算子模拟软件中将会出现的各类软件缺陷,通过程序变异的方法将软件故障注入到代码中。程序变异的同时,在变异体中插入故障检测代码,实现对故障的自动检测。按照第1节的软件缺陷分类,为每一类软件缺陷设计了一些变异算子来进行模拟。在设计变异算子时,我们遵循变异算子的两个设计原则:第一,程序的改动必须是微小的;第二,改动必须是符合语法规则的,也就是编译时不报错,程序能够正常执行。表1是为这五类软件缺陷所设计的变异算子。3.1配置缺陷为了模拟赋值故障,设计了五种变异算子。当被赋值的变量与原变量的值不一致时,认为故障发生。(1)变量初始化dvi通过删除局部变量的第一次赋值,模拟变量未初始化就使用错误。(2)形变量的赋值错误通过用随机数赋值给当前整形变量,模拟整形变量的赋值错误。在变量的使用过程中,整形变量的使用是最为频繁的,因此我们单独设计变异算子来模拟整形变量的赋值错误。(3)阵列长度替换矩阵标lrs通过用数组长度的值代替当前数组元素的下标,模拟数组越界错误。(4)优化组合使用错误通过随机选择数组中的元素替换当前元素,模拟数组元素使用错误。与RIR算子相同,使用C语言的库函数rand()产生一个随机数,再通过求余运算,即可得到数组长度范围内的随机数。(5)float模式转换为int模式rci通过float型变量强制转换为int型,模拟非法类型转换错误。3.2支线缺陷为了模拟分支故障,设计了三种变异算子。当变异体的执行路径与原程序的执行路径不一致时,认为故障发生。(1)在分行结构中,值运算符的变换等于等于相关运算符acb在分支结构的判断条件处,经常会发生“==”与“=”的误用,这类错误主要由于程序员的疏忽所致。(2)逻辑运算符lrb的变换通过在分支结构的判断条件中,用“&&”替换“‖”,或者用“‖”替换“&&”,模拟分支结构中逻辑运算符使用错误。(3)删除对象dpb通过删除嵌套的if语句中的括号,模拟if-else的匹配错误。3.3算符替换、变换、重复替换为了模拟循环故障,设计了以下三种变异算子。当变异体的循环判断条件的真假值与原程序的不一致时,认为故障发生。(1)循环结构中赋值运算符替换等于关系运算符(ACL)通过将循环条件中“==”替换为“=”的方法,模拟循环结构中的等于运算符使用错误。(2)循环结构中逻辑运算符替换(LRL)通过在循环条件中,用“&&”替换“‖”,或者用“‖”替换“&&”,模拟循环结构中逻辑运算符使用错误。(3)改变循环变量(CVL)通过用相同类型的变量替换循环变量,模拟循环变量使用错误。这种变异也常会伴随引入变量未初始化就使用错误。3.4基于兼容性型变随机变动力的模型检验为了模拟接口故障,设计了以下四种变异算子:(1)改变调用参数顺序(POC)通过改变函数调用中兼容类型参数的顺序,模拟函数参数传递错误。这种类型的错误通常由于程序员的疏忽所致。(2)兼容型变量替换参数(VPR)通过用兼容型的变量替换被调用函数参数,同样可模拟函数参数传递错误。另外,此变异若发生在Socket中的Send函数时,可模拟发送错误消息。(3)删除调用语句(FCD)通过删除一个不在赋值语句中的函数调用,模拟函数调用丢失。(4)删除return语句(RSD)在有多个出口的函数中,通过删除其中一个出口的return语句,模拟return语句丢失。3.5删除派生类一般作用于类的头文件为了模拟类故障,设计了以下五种变异算子:(1)改变访问控制符(AMC)通过改变成员变量的访问控制符模拟访问控制错误。该类故障依赖于软件特性,一般不易发生。此变异一般作用于类的头文件。(2)删除隐藏变量(IHD)通过删除派生类中与基类同名同类型的变量,模拟因隐藏变量引起的状态定义不一致错误。此变异一般作用于类的头文件。(3)声明基类成员变量(MDB)通过用基类声明一个派生类的对象,模拟类型使用不一致错误。(4)删除派生类覆盖函数(OMD)通过删除派生类中的覆盖函数,模拟因覆盖引起的状态定义异常。(5)改变被覆盖函数的调用位置(OCC)有些情况下派生类的覆盖函数需要调用基类的函数,通过改变被调用的基类函数的位置,模拟状态可见性异常。4软件缺陷对软件可依赖的影响分析4.1实验方法与设计选取经过充分测试后的软件作为实验对象,其缺陷数为0,软件可靠性为1。用程序变异的方法将上述变异算子分别作用于该实验对象,估计软件的可靠性,分析比较这些故障对可靠性的影响。实验的具体步骤如下:(1)从实验对象中选取待注入故障的构件。因为在C++语言中程序代码以CPP格式的文件存放,所以我们选择待注入故障的构件所在的CPP文件。(2)从上一节选择变异算子,将其作用于步骤(1)中所选的CPP文件,生成多个变异体。变异体的命名采用“原文件名+变异算子+流水号”。例如“CImageView_DVI_5.cpp”表示DVI变异算子作用于CImageView.cpp文件后所产生的第五个变异体。(3)选择一个步骤(2)中产生的变异体替换原文件,达到故障注入的目的。此时的实验对象中已包含了产生该变异体的变异算子所模拟的故障。(4)使用改进后的Cheung模型估计上一步得到的含有故障的软件的可靠性,具体步骤如下:①根据分布式软件在实际使用中各功能与数据的出现频率,建立操作剖面。频率必须从大样本中获取,以确保统计数据的有效性。②为分布式软件划分构件,确定构件间的连接件。将每台主机上的通信模块定义为一个连接件,该主机的其余模块定义为一个构件。根据各构件之间的调用关系,建立分布式软件体系结构及转移概率矩阵。③根据耦合性最小的原则,并为每个构件划分子构件。根据子构件之间的调用关系,建立该构件的转移概率矩阵。④从操作剖面中选择一个操作序列,通过执行分布式软件,收集失效数据。⑤取一个构件,根据步骤④得到的失效数据,计算其中每个子构件的可靠性。⑥根据步骤③中所得到的该构件的转移概率矩阵与步骤⑤中得到的子构件的可靠性,计算当前构件的可靠性。⑦从步骤⑤开始重复执行,直到所有构件的可靠性都已计算完成。⑧根据步骤④得到的失效数据,计算每个连接件的可靠性。⑨根据步骤②、⑥、⑧所得到的分布式软件转移概率矩阵、构件可靠性、连接件可靠性,修正分布式软件的转移概率矩阵,计算当前操作序列下的软件可靠性。⑩从步骤④开始重复执行,直到所有操作序列下的软件可靠性均计算完成。根据步骤①、⑨得到的操作剖面与各操作序列下的软件可靠性,计算最终的分布式软件可靠性。(5)重复执行步骤(3)、(4),记录所有的软件可靠性的值,分析比较实验结果,得出结论。按照设计好的实验步骤,漫游系统实验选取文献中提到的立方体全景图虚拟场景漫游系统(简称漫游系统)作为实验对象。该系统是在VC++6.0集成环境下,基于文档视图结构开发的可以在单机上运行的软件,属于集中式软件。它包含2017行代码,提供了水平、垂直方向的360度旋转漫游及场景的缩放功能。4.2c/s系统可靠性的统计分析选择第3节中的变异算子作用于漫游系统的CImageView.cpp文件,估计软件可靠性,我们用图形来表示注入各故障后漫游系统的可靠性,其中横轴表示各变异体,纵轴表示含有该变异体的软件可靠性。图1-图5分别表示五种类型故障对漫游系统可靠性的影响程度。根据上述数据可以得到注入各类故障后系统可靠性的分布区间和平均值,如表2所示。从表2中我们可以看到,含有赋值故障的软件可靠性的平均值最小,并且其分布较为集中,故认为赋值故障对该软件可靠性影响最大;含有类故障的软件可靠性的平均值最大,并且其分布区间也相对集中,所以我们可以得出类故障对软件可靠性的影响最小;除类故障外,含有接口故障的软件可靠性的平均值较大,其次是含有循环故障的软件和含有分支故障的软件。总体来看,可以得出这五类故障对漫游系统可靠性的影响由大到小依次为赋值故障、分支故障、接口故障、类故障。由于含有循环故障的软件可靠性分布区间较宽,且较散乱,因此其平均值并不能说明该类故障对软件可靠性的影响程度,但我们可以得出该类故障会因变异体的个体差异而对软件可靠性造成不同的影响。赋值故障一般发生在程序中函数的开头部分,后续的语句会直接或间接的使用到这些变量,故障的扩散性较强,因此该类故障对软件可靠性的影响较大。分支故障仅会发生在分支型结构的某个分支上,当程序在分支结构中的执行路

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论