尽管现在已经有了很多自动识别Bug的静态分析技术,这些技术可以帮助识别空指针引用类型的Bug。但是极少有技术可以做到分析这类型Bug是否应该修复,及该如何修复。修复这些Bug有时不彻底,因为有其他相关的Bug没有得到修复。在这篇论文中,我们定义了“Bug的完全修复”,它是指要修复由一个程序传递到另一个程序的无效值,包含空指针引用。在Java程序中,这种分析建立在“Bug邻域(Bug neighborhood)”的定义上,“bug邻域”包含一定范围内的一组无效值,文章展示了一种自动分析技术。假设程序开发中有两个版本P和P',我们将采用的动态分析,在第二个版本P'中,识别出应当被修复的Bug,并判断出这些Bug是否彻底被修复了。最后以空指针引用为例,源代码采用开源的工程,应用这项技术进行分析。分析结果表明,在这个工程中,许多的错误并没有完全被修复,因此程序在以后的执行中可能出现失败。
一 、总体介绍
Java程序经常包含许多Bug,例如对空值的引用,数组下标不正确,导致Java虚拟机抛出运行时异常。这些Bug包含一组无效值,由一个程序传递到另一程序,从而导致运行时异常。尽管许多自动化监测技术可以静态地发现这些Bug,但是极少有技术可以做到分析这类型Bug是否应该修复,及该如何修复。一种修复该错误的尝试可能只修复了表面的错误,而未能彻底的完成修复,从而可能导致另外一次运行中出错。
以空指针引用异常为例来说明,这个异常是由于将空指针分配(null-pointerassignment, NPA)导致一个空指针引用(null-pointer dereference,NPR)。NPA一般是由于一个空值的声明造成的,常包括下面三种情况:X=null; return null; foo(null);。而NPR是在一个声明中,引用的变量为空。在图1中,左边灰色的方框描述在程序P中出现的空指针异常,NPA1导致了NPR1。NPR2代表由NPA1所导致的,可能在p'中出现的错误,NPR2是否出现,取决于NPA1如何被修复。而NPR3代表NPA1所导致的其他空指针引用,它在P和P'的另外一次运行中出现。
……………………
查看全文请点击下载:http://www.51testing.com/html/02/n-227802.html
这种技术的最大优势在于它可以自动发现未完成的bug修复,高亮标志出应当引起注意的代码,这项技术可以应用于交互式调错工具(debugging tool),对于一个bug,当开发在修复时,可以给出建议如何才能彻底修复,因此,使用这种工具可以让bug修复变得更为有效。
这篇文章的主要贡献包括:
1、提供一种方法来帮助开发定位bug是否得到了完全修复,提供相关信息帮助其完全修复bug。
2、技术上实现了空引用bug的定位
3、实验证明,“bug 领域”的范围是非常大的,(NPA, NPR)组也存在多种变化,所以很多bug修复都是不彻底的。