软件运行时错误测试工具评析

时间:2022-08-02 02:31:09

软件运行时错误测试工具评析

摘要:从减少软件开发成本和缩短软件开发周期的角度考虑,尽可能的在软件编码时期发现软件缺陷无疑是最佳选择,但软件运行时错误是所有的软件缺陷中最具风险的,发现该类错误最有效的手段就是专用测试工具。通过对几种主流的软件运行时错误测试工具的对比分析,探讨了各个工具的优缺点及选择的诸多因素,对于软件测试人员如何选择合适的该类测试工具,具有实际参考价值。

关键词:软件测试;运行时错误;语义分析技术

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)07-1575-03

随着软件规模越发庞大,软件中存在的缺陷也越来越多,软件测试工作所肩负的责任日趋繁重。通常我们通过软件测试来确保软件的可靠性,通过软件测试我们可以在软件交付用户之前尽量找到软件中存在的BUG,而在所有类型的软件BUG中运行时错误的危害性是最大的。欧洲航天局阿里亚纳501号火箭的爆炸,就是因为在其控制飞行姿态的一段代码中蕴含有一个变量溢出的运行错误。正是这个错误的溢出变量控制着火箭急速转向而过载。

根据IBM-Berkeley调查统计:在每一千行的代码中大约就会发现一个运行时错误,而且在软件的维护阶段所检测到的错误中有30%-40%是运行时错误,可见运行时错误对软件质量的影响是多么大。该文对几种常用的可以发现软件运行时错误的测试工具进行评析。

1 什么是软件运行时错误(Run-Time Errors)

运行时错误(Run-Time Errors)是所有的软件错误中最具风险的错误。它主要发生在软件动态运行的过程中。我们在日常家庭用的Windows操作系统或者其他软件工具时也会时常出现运行时错误,一般情况下出现运行时错误后无论怎么操作,程序都会关闭。上述软件出现问题并不会产生太大的影响,但是对于对安全等级要求很高的系统,比如汽车、航天、军用领域,发生这种错误所从带来的负面影响或许是十分巨大的。由ANSI C定义的运行时错误是指那些能导致预定义之外的不正确结果或者处理器停机的错误,它的风险等级在所有软件错误中是最高的,由它引起的后果可能为:数据崩溃、安全保密被破坏、处理器停机等;它也可能导致给外部设备发送非受控命令,引起不可预测、不确定的行为。

典型的运行时错误包括:引用越界指针和空指针、读未初始化变量、类型转换非法、访问超界数组、浮点数和整数下/上溢出、不合法的算数运算 (如:负数开平方错误,除零错误)、代码不可达等。

在软件之中广泛存在运行时错误,对软件的安全性产生潜在的风险。因此针对运行时错误测试技术的研究是当前最重要的课题之一,而发现运行时错误最直接有效的手段就是专用测试工具。

2 软件运行时错误测试工具

2.1 语义分析技术

目前,测试软件的运行时错误所用的工具都是基于语义分析技术。这种技术主要是通过数学定理所提供的规则动态分析软件的行为。语义分析技术并非通过穷举法,它有能力在更为普通的模式下来表达程序所处的状态,它还能提供巧妙的规则来对它进行处理。当运行时错误在执行检测的时候,为了尽可能早的发现程序中运行时错误,语义分析技术会详细的分析所有危险的操作。

运行时错误的语义分析检查主要有以下几点:

1) 控制流检查:控制流程序要控制程序跳转到合法代码段。例如:C语言中的break语句,控制程序退出该程序段的最内层for、switch或while语句。否则应报错。

2) 类型检查:若操作符被用作不相容的操作数,应报错。

3) 相关名字检查:当同样的一个名字需要出现大于等于两次的时候,必须要对这几个地方使用的名字是否一致进行检查。

4) 作用域分析:分析元素的作用范围,保证元素不会出现使用问题。

5) 一致性检查:绝大部分情况下只能定义一次对象。

2.2 测试工具分析

2.2.1 Klocwork

Klocwork公司综合应用近年来最先进的多种静态分析技术,基于其专利分析引擎技术,开发了Klocwork测试工具。Klocwork是一款非常优秀的软件静态分析软件。

它最主要的特点如下:

1) 发现软件缺陷的种类覆盖面广,既包含安全漏洞缺陷,又同时包含软件质量缺陷,还能对编程规则、软件架构的违反情况进行分析;

2) 支持多种开发语言,可以分析Java和C++/C程序;

3) 可以对软件的各种度量进行分析(包含Halstead程序度量、McCabe复杂度);

4) 可以全面的分析软件,既能对可视化的架构进行优化、分析,又能对软件的缺陷进行分析;

5) 可以对千万级代码行的超大程序进行分析。

6) 可以对多种主流的IDE开发环境提供集成;

针对软件运行时错误,Klocwork能识别数组越界、非法指针引用、非法浮点数操作、不可达代码、无限循环等。

2.2.2 Polyspace

Polyspace是世界上首家自动检测嵌入式软件运行错误的工业化工具,不需要代码执行和修改,不需要运行耗时的测试用例。其主要特点有:

1) 高效:可以在代码评审和测试阶段确定运行错误;

2) 质量:彻底标识所有可能导致运行时错误的操作,并用不同的颜色标出来;

3) 安全:处理所有的正确条件。总是考虑最坏的情景,并指出可能的运行错误;

4) 产品化:PolySpace是非侵入式的和基于源代码的。在开发过程中,使用PolySpace尽可能在单元和集成时检测运行错误,从而节约确认阶段的时间,不必更改过程。

可以通过PolySpace自动检查的错误为:浮点数和整数的下/上溢出、读未初始化变量、访问超界的数组、引用越界指针和空指针、算数运算非法(例如:负数开平方,除零错误)、转换类型不合法、代码不可达、多线程应用中访问未保护数据的时候发生冲突。

2.2.3 Astree

Astree是一个可参数化设置的基于抽象解释的静态分析工具,其目标是证明用C语言写的程序中不存在运行时错误。其主要特点有:

1) 在编译阶段就能测出软件的运行错误。只要是代码可编译的,就可将代码放在Astrée测试环境下,经过简单配置后,便可自动检查错误;

2) 测试时不需要写测试用例。传统的覆盖率测试需要花费大量精力去开发测试用例,而使用Astrée就不需再写用例;

3) 测试时无须更多的代码插装,也不必改变开发过程;

4) 分析准确性高,通过参数化设置等,可以实现“零误报”;

5) 分析速度快。

Astree当前可以报告的错误包括:数组范围越界,整数被零除,浮点溢出和非法操作,整数运算的wrap around行为(主要由溢出引起),以及类型转换导致的wrap around行为(目标类型太小无法表达转换值),以及用户关于软件定义的任何断言。另外,,Astrée能够指出未分析(不可达的)的代码并且对没有终止的代码进行告警。

通过多次测试项目的实际使用,对Klocwork、Polyspace、Astree的分析结果比较如表1。

从表1的分析结果可以看出,专用测试工具在发现软件运行时错误时发挥着重要作用,但是测试工具并不是完美的,各个工具所使用的分析技术导致它们都只适用于部分缺陷的测试。在软件运行稳定性的保证及软件测试质量的提高方面,我们认为软件运行时错误测试工具的作用是功不可没的,但在看到测试工具优点的同时也要注意到各个测试工具的短板。

软件运行时错误测试工具的优点:

1) 分析只需要代码,不会改变软件开发的过程,可以在软件开发任何阶段进行;

2) 有助于软件开发的早期发现软件运行时错误。方便修改,能有效的提高软件开发效率,降低软件开发周期;

3)不需要设计测试用例,不需要代码插装,节约时间;

4)有助于开发人员及时自查,及时纠正开发人员编码风格缺陷。

5) 对发现的错误直接定位,相比动态测试发现该错误,节省了错误定位时间;

软件运行时错误测试工具的缺点:

1) 分析结果需要人工确认;

2) 有可能存在误报和漏报的情况,影响测试正确率;

3)由于算法的片面性,不能发现所有的问题。

3 结束语

在软件开发的任意一个阶段都可以借助软件运行时错误测试工具及时的发现错误,对软件成本的控制及软件开发效率的提升方面非常有帮助。鉴于该类测试工具功能的日益完善,软件开发人员对其依赖的程度逐渐增加。但开发人员时刻都要意识到,工具也会有算法片面性及漏报、误报的因素,仅仅依靠静态测试来发现运行时错误是不够的,需要在软件生命周期的晚期阶段实施动态测试。动态测试和静态测试相结合,从而提高测试的有效性。不同的软件运行时错误测试工具各有优势与不足,如何选择适合的测试工具,需要结合实际情况对诸多因素综合权衡。

参考文献:

[1] 肖庆,张威,宫云战,等.内存泄漏的一种静态分析方法[J].装甲兵工程学院学报,2004,18(2):23-26.

[2] 韩柯,杜旭涛. 软件测试[M].北京:机械工业出版社,2003.

[3] 杨宇,张健.程序静态分析技术与工具[J].计算机科学2004,31(2):171-174.

[4] 蒋鹏.基于Astree的软件运行时错误检测[Z].2012.

[5] 周涛.航天型号软件测试[M]. 北京:宇航出版社,1999.

[6] 康一梅,张永革,李志军,等.嵌入式软件测试[M].北京:机械工业出版社,2008.

[7] 周伟明.软件测试实践[M].北京:电子工业出版社,2008.

上一篇:如何解决ASP中session失效问题 下一篇:浅析企业办公自动化系统应用