APP下载

基于变量操作特征分析的软件缺陷模式研究

2018-11-01左万娟虞砺琨黄晨董

航天控制 2018年5期
关键词:软件缺陷特征分析遥测

左万娟 虞砺琨黄 晨董 燕

1.北京控制工程研究所,北京100190 2.北京轩宇信息技术有限公司, 北京 100190

软件缺陷指软件产品中存在的问题,最终表现为用户所需要的功能没有完全实现,不满足用户的需求[1]。从产品内部看,软件缺陷是软件产品开发或维护过程中存在的错误、毛病等各种问题;从产品外部看,软件缺陷是系统需要实现的某种功能的失效或违背[2]。

在目前的软件测试工程实践中,针对代码审查环节,一般都是通过对缺陷的分类、建模,形成代码检查单,并依据代码检查单开展代码审查活动,从而查找软件中的未知缺陷。其相关研究参见文献[3-13]。但是,通过该方式形成的代码检查单,大部分是面向全部代码的,缺乏与特定代码操作特征之间的关联性,导致在工程实践中,未能充分发挥检查单的最大效能。

从作为代码基本构成要素的变量出发,专注于研究基于变量操作特征分析的软件缺陷模式。通过对变量的共性操作特征以及分类操作特征的分析,分别提取与之相关联的缺陷模式,建立了缺陷模式与变量操作特征之间的关联性,构建了基于变量操作特征分析的软件缺陷模式集。依据该缺陷模式集,在软件测试的工程实践中,可以针对变量的特定操作开展分析,按图索骥,查找特定的缺陷,从而使软件测试活动更加有的放矢,提高测试质量和效率。在编码阶段,软件开发人员也可以参考该模式集,在编码阶段有效规避缺陷。

1 研究必要性分析

为使研究工作有的放矢,对中国空间技术研究院软件产品保证中心航天器软件第三方评测缺陷数据库[14]中的万余条软件缺陷的处理方式进行了统计分析,结果如表1。

表1 缺陷处理方式统计分析

从缺陷相关因素的角度,对表1中以修改程序方式更正的缺陷进行分类分析,结果如表2。

表2 修改程序缺陷分析

对表2中的缺陷相关因素说明如下:

1)需求相关:将文实不一致(即,代码实现与需求规定不符)、需求未实现、设计无依据等软件缺陷,均归类为需求相关缺陷。此类软件缺陷主要通过核对软件需求来识别;

2)变量相关:将与变量操作相关的软件缺陷,均归类为变量相关缺陷。此类软件缺陷主要通过分析变量操作来识别,缺陷本身与需求关联性较小。具体可见本文第2-3节的阐述;

3)逻辑相关:将与代码逻辑相关的软件缺陷,均归类为逻辑相关缺陷。比较典型的逻辑相关缺陷包括代码设计存在自相矛盾、if-else分支结构设计导致if和else工况并发时的处理缺失及循环计数变量的计数周期与循环处理函数调用周期不一致导致未能实现所有计数情况下的遍历处理,等等。此类软件缺陷主要通过分析代码逻辑来识别,缺陷本身与需求关联性较小;

4)其它:将无法归入以上3类的软件缺陷,归类为其它缺陷。

可以看出,除了需求相关缺陷之外,变量相关缺陷占比最大。因此,有必要针对变量相关的软件缺陷开展专题研究,建立软件缺陷与变量操作特征之间的关联性,以提高变量相关缺陷的检出效率,提高软件质量。

2 变量共性操作特征分析及缺陷建模

定义、初始化及读写操作,这些是所有变量都具有的共性操作。针对这些共性操作,需要根据其操作特点,分别加以分析。

2.1 变量共性操作特征分析

2.1.1 变量定义的操作特征分析

变量定义确定了变量的数据类型,个别变量定义时还指定了变量的绝对存储地址。针对变量定义,应重点分析如下操作特征:

1)变量定义的数据类型是否满足变量所要表示的数据范围和精度的要求;

2)指针变量所指向的地址区域是否满足指针变量的使用要求。比如,软件利用指针变量实现外部RAM区自检,但是定义该指针变量指向内部RAM区,导致外部RAM区自检未实现;

3)变量定义时所指定的绝对存储地址是否正确。比如,绝对地址相互覆盖导致变量被意外改写、绝对地址定义顺序与遥测组包顺序不符导致按地址顺序取数组包后遥测结果错误,等等。

2.1.2 变量初始化的操作特征分析

变量初始化是正确使用变量的前提,针对变量初始化,应重点分析如下操作特征:

1)变量使用前是否被赋予了特定的初值。即代码中不应存在变量未初始化就使用的情况;

2)初值设置是否合理。某些情况下,变量的初值不是由需求规定的,而是由变量的使用逻辑所决定。此类情况下,初值设置应与变量使用逻辑相符。比如,当需要根据上位机指令驱动执行某项功能时,则应初始化设置标志变量为FALSE,在收到上位机指令后再修改标志变量为TRUE,从而在指令驱动下使能该项功能的执行。

2.1.3 变量读写的操作特征分析

读写操作是对变量的基本操作,针对变量读写,应重点分析如下操作特征:

1)操作完整性:代码中应当有对变量的读和写操作。仅读和仅写是典型的操作不完整的体现;

2)操作位置准确性:代码中应在恰当的位置对变量进行读、写操作,以正确实现变量所承载的物理意义。比如,状态变量设置位置不当,导致变量未能正确记录软件运行状态,等等;

3)操作衔接性:变量均承载了特定的物理意义。特殊情况下,当一个变量承载多个物理意义时,要求操作上必须做好衔接,避免因多个物理意义导致的操作混乱。

2.2 变量共性操作缺陷模式集

通过上述变量共性操作的特征分析,建立与变量共性操作特征相关联的缺陷模式集如表3。

表3 基于变量共性操作特征的缺陷模式集

3 变量分类操作特征分析及缺陷建模

本节从变量的使用特点及其所承载的物理意义出发,对变量进行了分类,并基于各类变量的操作特征,进行了分析及缺陷建模。

3.1 变量分类操作特征分析

3.1.1 标志变量的操作特征分析

标志变量指用于表征软件特定运行条件、或运行状态是否有效的变量,在代码中通常表现为2种状态:有效和无效。针对标志变量,应重点分析如下操作特征:

1)标志变量设置位置分析:标志变量应在恰当的位置被设置为有效,以正确表征软件运行状态;

2)标志变量清除位置分析:标志变量的有效状态应在恰当的位置被予以清除,以正确表征软件运行状态;

3)标志变量读状态分析:通过对标志变量写操作的全局分析,确认标志变量读操作时是否可以读到相应的状态。比如,标志变量的置TRUE与置FALSE操作存在相互覆盖,导致读变量时读到的始终是TRUE、或始终是FALSE;

4)标志变量操作完整性分析:一般来说,针对标志变量,代码中应进行置TRUE、置FALSE和判断设计。否则,极有可能存在设计缺陷。

3.1.2 计数变量的操作特征分析

计数变量是指用于实现特定条件下计数功能的变量。针对计数变量,应重点分析如下操作特征:

1)计数条件是否具备:不具备计数条件,意味着计数变量未实现设计目的。比如,计数操作在定时器中断中完成,由于初始化阶段尚未开启定时器中断,即,计数条件不具备,计数未能累加,导致初始化阶段以计数阈值作为while循环退出条件的设计失效;

2)计数条件与计数操作是否匹配:即,是否在特定条件下执行了特定的计数操作;

3)是否进行了必要的清零设计:多数情况下,计数变量需要在特定条件下清零;

4)清零设计是否合理:计数变量的清零操作是否满足特定条件;

5)是否采取了计数溢出的保护措施:计数溢出必将导致对计数变量的判断结果错误,因此,必须分析计数溢出的可能性并设计必要的保护措施。

3.1.3 运算变量的操作特征分析

运算变量是指参与加、减、乘和除等各类数学运算的变量。针对运算变量,应重点分析如下操作特征:

1)参与运算的数据与变量数据类型是否匹配:数据类型不匹配将导致运算结果未实现既定的设计目的。比如,对32位无符号变量进行溢出保护设计时,引入4294967295.0参与运算,导致运算结果自动提升为浮点型、溢出保护设计失效,此时应引入4294967295(即0xFFFFFFFF)参与运算;

2)参与运算的多个变量的数据类型是否匹配:变量数据类型不匹配将导致运算结果未实现既定的设计目的;

3)运算是否溢出:运算溢出常见于无符号变量的小数减大数操作、乘除运算顺序设计不当等;

4)变量数据类型是否满足运算过程及运算结果的表示范围;

5)运算过程是否导致精度受损:运算过程设计不当将导致运算结果达不到预期的精度要求。比如,先对整型变量进行除法运算,再将运算结果转换为浮点数,导致运算精度受损;

6)是否存在除0运算:代码中存在除法运算时,应分析除数是否存在等于0的情况。

3.1.4 位操作变量的操作特征分析

位操作变量是指参与移位、位与、位或等操作的变量。针对位操作变量,应重点分析如下操作特征:

1)移位操作是否导致结果溢出。

2)位与、位或操作是否破坏了不应被改变的位值。

3)有符号变量移位结果是否达到预期设计目的。比如,变量取值为负时,右移操作后高位填1,这可能不是预期的设计结果。

3.1.5 遥测变量的操作特征分析

遥测变量是指需要按照遥测协议组包后通过遥测通道下传至地面的变量。针对遥测变量,应重点分析如下操作特征:

1)遥测拼接分析:大规模软件,受遥测通道的限制,经常需要将多个变量拼接为一路遥测(比如,8bit字节,或16bit字)后下传。针对遥测拼接设计,首先要分析拼接结果是否包含了各个拼接变量的有效位,其次要分析拼接过程是否存在各个变量有效位之间的相互覆盖;

2)遥测量纲/当量分析:为满足遥测分配及地面解析的需要,遥测量纲/当量经常与参与运算及控制过程的变量量纲/当量不同,因此需要特别加以分析;

3)遥测组包时机分析:遥测组包时机应确保能取到预期的遥测变量值;

4)遥测设计合理性分析:比如,当多个遥测变量共用一路遥测时,通常会引发遥测状态的混淆;

5)多路组合遥测分析:当多路遥测之间具有关联性时,应确保关联性不被破坏。

3.1.6 条件变量的操作特征分析

条件变量是指变量的不同取值分别代表不同的物理意义、且代码中有对该变量的条件判断设计。针对条件变量,应重点分析如下操作特征:

1)条件判断设计应确保涵盖变量不同取值所对应的所有物理意义,即,针对变量物理意义的条件判断设计应具有完整性的特征;

2)条件判断设计应与变量取值相匹配;

3)条件判断设计逻辑应合理,不会导致判断结果始终为真或始终为假。

3.1.7 地址变量的操作特征分析

地址变量是指所承载的物理意义为地址的变量,多见于内存修改、内存下传、程序修改等相关功能处理,涉及到的变量物理意义多为起始地址、结束地址、操作长度等。针对地址变量,应重点分析如下操作特征:

1)结束地址计算是否正确:当指定起始地址和操作长度的情况下,应加强对结束地址计算的正确性分析;

2)地址有效范围判断设计是否合理:为确保操作地址在有效范围内,应根据起始地址、操作长度、结束地址的物理关联性设计合理的地址合法性判断条件;

3)地址是否为4字节对齐:在字长为32bit的CPU代码中,一般要求操作地址应为4字节对齐。

3.1.8 量纲变量的操作特征分析

量纲变量是指所承载的物理意义带有指定量纲的变量。针对量纲变量,应重点分析如下操作特征:

1)量纲的一致性分析:参与运算或比较的多个变量的量纲应一致;

2)量纲转换的正确性分析:当参与运算或比较的多个变量的量纲不一致时,代码中是否进行了正确的量纲转换。

3.1.9 指针变量的操作特征分析

指针变量是指定义为指针类型的变量。针对指针变量,应重点分析如下操作特征:

1)指针变量赋值是否正确:应确保指针变量指向正确的操作地址;

2)指针代数运算是否正确:当代码中利用指针代数运算进行特定地址访问时,必须确保指针代数运算的正确性。

3.1.10 数组变量的操作特征分析

数组变量是指定义为数组的变量。

针对数组变量,重点分析数组下标的取值是否会导致对数组的读写访问越界,要注意分析各个操作场景下数组下标的所有可能取值情况。数组访问越界比较常见于如下3种情况:

1)初始化数组元素个数超过数组大小;

2)以立即数为数组下标时,立即数取值超过数组大小;

3)以变量为数组下标时,对变量取值范围未采取合理的限定措施导致变量取值超过数组大小。

3.1.11 宏定义变量的操作特征分析

宏定义变量是指通过宏定义方式定义的变量。代码设计中使用宏定义的最大好处是利于代码维护。针对宏定义变量,应重点分析如下操作特征:

1)宏定义是否与使用相匹配:比如,宏定义TRUE为0x55、FALSE为0xAA,函数返回TRUE/FALSE,代码中判断函数返回值是否为0,从而导致判断结果唯一(始终不为0),条件判断设计失效;

2)已有宏定义则不应再使用立即数:主要为了避免后期修改宏定义后未同步修改立即数而导致立即数使用错误;

3)不应混用取值相同的宏定义:主要为了避免修改其中一个宏定义时,引发不良后果。

3.1.12 相似变量的操作特征分析

相似变量指具有相似的物理意义、且定义名称相似的变量。

相似变量的设计缺陷多由克隆代码引入。相似变量使用混淆问题在代码中屡见不鲜。

3.2 变量分类操作缺陷模式集

通过上述变量分类操作的特征分析,建立与变量分类操作特征相关联的缺陷模式集(见表4)。

表4 基于变量分类操作特征的缺陷模式集

续表4 基于变量分类操作特征的缺陷模式集

4 应用分析

为检验本文所构建的基于变量操作特征分析的软件缺陷模式集在软件测试实践中的应用效果,对3个不同专业背景的软件开展了应用前、后的测试效果比对,比对结果如表5。

表5 应用前后变量相关缺陷数目对比

可见,将本文所构建的基于变量操作特征分析的软件缺陷模式集应用于工程实践后,测试过程中发现的变量相关缺陷的数目得到了提升。

目前,该缺陷模式集已在航天器软件第三方评测的工程实践中推广使用。

5 结束语

从作为代码基本构成要素的变量出发,研究构建了基于变量操作特征分析的软件缺陷模式集,这种与变量操作特征相关联的软件缺陷建模思路在国内外的相关研究中尚属首例。通过工程实践应用证明,本文研究成果提高了变量相关缺陷的检出效率,从而有效提高了软件缺陷的整体检出效率。后续工作中,将以本文研究成果为基础,研究开发基于变量操作特征分析的自动化缺陷检测工具,从而进一步提高软件测试的效率。

猜你喜欢

软件缺陷特征分析遥测
基于源文件可疑度的静态软件缺陷检测方法研究
自适应模糊PID控制的遥测方舱温度调节方法
某小型无人机遥测软件设计
基于NPE-SVM的软件缺陷预测模型
2012 年南海夏季风特征分析
开源程序的软件缺陷分布特征的量化分析研究
浅谈如何提高遥测状态估计合格率
基于PowerPC的脉内特征分析算法的工程实现
软件缺陷管理方案分析
利用VBA处理邻近气象站的相关遥测数据