论文导读:0引言软件测试是信息系统开发过程中不可缺少的一个重要步骤,随着信息技术的发展,软件变得日益复杂,软件测试也变得越来越重要。2Insure++运行环境2.1运行平台Insure++支持多种MSWindows和Unix平台(包括某些64位平台)。3两种基本工作模式3.1监护模式监护模式不需要任何重新编译和链接或改变环境变量,直接检测现有的执行程序,包括:检查一个进程所产生的所有数据内存引用,检测并报告读取未初始化内存、内存读写越界和内存泄露等分配错误,检测未释放的内存块。
关键词:Insure++,软件测试,内存
0 引言软件测试是信息系统开发过程中不可缺少的一个重要步骤,随着信息技术的发展,软件变得日益复杂,软件测试也变得越来越重要。软件测试的工具是提高测试效率的重要手段,也是软件理论和技术发展的重要标志。本文将介绍一种针对C/C++程序代码进行自动检测的白盒测试工具Insue++。
1Insure++简介Insure++是美国Parasoft公司出品的一个针对C/C++应用的运行时错误自动检测工具,能够快速准确地指出算法异常、程序错误和缺陷。主要特性如下:
·检测众多不同类型的错误,如内存破坏、内存泄露、内存分配错误、变量初始化错误、变量定义冲突、指针错误、库错误、逻辑错误和算法错误等等;
·精确定位引起内存泄露的代码位置,不仅是泄露的内存位置;
·支持所有流行的编译器,如CC、gcc和acc等等;
·能够检查第三方库和函数以及非C语言所写的模块接口。
2 Insure++运行环境2.1运行平台Insure++支持多种MS Windows和Unix平台(包括某些64位平台)。
·Windows NT/2000;
·UNIX,包括:DEC(Alpha 4.x,TruUnix64 5),HP (HPUX 10.x & 11.x),IBM (AIX4.3.x),Linux(glibc 2.2.4 or higher),SGI(Irix 6.5),Solaris/Sparc(7,8)以及Solaris x86(7,8)。
2.2 编译器Insure++支持各种流行的编译器。
·Windows:集成于Visual C++6.0;
·UNIX:包括CC、gcc和HP C++等编译器。
3 两种基本工作模式3.1 监护模式监护模式不需要任何重新编译和链接或改变环境变量,直接检测现有的执行程序,包括:检查一个进程所产生的所有数据内存引用,检测并报告读取未初始化内存、内存读写越界和内存泄露等分配错误,检测未释放的内存块。
当监护模式下检测到不正常的行为,Insure++报告一个错误信息,指出错误的类型和出现的地方。不正常的行为包括任何对逻辑上未分配区域的存取,读(或更新)已分配但尚未写入的字节,以及malloc/free使用问题,如试图两次释放同一内存块。
3.2 源码插入模式3.2.1变异测试变异测试的本意是建立更有效的测试数据。通过建立更有效的测试数据,测试人员会更有把握是否对程序进行了充分测试。免费论文参考网。传统的变异测试方法首先建立程序的多个版本,每个版本是一个“变形”以引入一个故障。这些“变形”程序然后运行对应的测试数据,每当一个测试数据导致一个故障版本失败,该变形程序的使命就结束了,并且将该测试数据保存下来。当所有的变形程序完成后,保存的测试数据就组成了一个测试数据集合,用于测试原来的程序。这种方法对建立测试数据非常有用,但很繁琐,同时对于在原始程序中找出错误帮助不大。
Insure++采取全新的变异测试方法,将焦点从测试数据转移到程序本身,建立多个“等价”(而非“故障”)变形版本。这种技术能够进行更有效的错误检查,并能发现源代码中可能存在的多义性,然后Insure++的源码加工(SCI)专利技术提供深层次的调试信息,使得开发人员能够快速、方便地发现和改正错误。
不同于传统的故障变异测试,“功能等价”的变形版本在检测错误时就像源代码一样运行。“等价变形版本”期望的是通过,而不是失败。如果原始程序是正确的,那么变形版本就不取消;如果某变异版本被取消掉,则意味着原始程序中存在一个错误必须被改正,同时自动报告故障及相关代码行。
3.2.2运行时指针跟踪该技术使用一个有关指针和内存块的综合数据库检查对内存的每一次读写操作。当执行诸如malloc、new、delete和free等内存管理指令时,Insure++更新内存使用数据库,精确性跟踪对所有内存段的内存存取操作,其结果是不但能检测到内存错误,还能指出何时、在哪一行代码上造成了这个错误。免费论文参考网。
4 测试实例分析4.1 内存引用错误实例1,考虑下列C程序:
1: /*
2: * File:hello.c
3: */
4: main(argc, argv)
5: int argc;
6: char *argv[];
7: {
8: char str[16];
9: int i;
10:
11: str[0] = '';
12: for(i=0; i<argc; i++) {
13: strcat(str, argv[i]);
14 if(i < (argc-1)) strcat(str, ' ');
15: }
16: printf('You entered: %s ', str);
17: }
正常编译执行,得到预期结果:
$ hello cruel world
You entered: hello cruel world
同Insure++一起编译,输入“hello cruel world”将产生错误,因为连接后的字符串长度超过16个字节(在第8行分配)。
**WRITE_OVERFLOW** [hello.c:13]
>> strcat(str, argv[i]); ←检测到问题的源代码行
Writing overflows memory: str ←问题描述和不正确的表达式
bbbbbbbbbbbbbbbbbbbbbb
| 16 | 2 | ←多写了2个字节(b-目标块,w-写入)
wwwwwwwwwwwwwwwwwwwwwwwwww
Writing (w): 0xf7fff8a8 thru 0xf7fff8b9(18 bytes) ←内存块的位置
To block (b): 0xf7fff8a8 thru 0xf7fff8b7(16 bytes)
str, declared at hello.c, 8
Stack trace where the error occurred: ←引起问题的代码行
strcat() (interface)
main() hello.c, 13
**Memory corrupted. Program may crash!!**
**READ_OVERFLOW** [hello.c:16]
>> printf('You entered: %s ', str);
String is not null terminated within range: str
Reading : 0xf7fff8a8 thru 0xf7fff8b9 (18 bytes)
From block : 0xf7fff8a8 thru 0xf7fff8b7 (16 bytes)
str,declared at hello.c, 8
main() hello.c, 16
You entered: hello cruel world
1/2 1 2 下一页 尾页 |