论文部分内容阅读
随着计算机多核技术的发展,Java多线程技术的优势体现得越来越明显。多线程技术不仅能够提高程序的运行效率,而且能提高程序的实时响应性,从而提升了用户体验,目前推出的软件产品大多都使用多线程的方式实现。然而,多线程技术在为程序带来这些优势的同时,由于其执行时的复杂性和不确定性,也给程序编写带来了新的难度。在程序编写时,程序员需要额外地对各个线程中的工作进行同步管理,保持数据的一致性,否则就可能引发程序并发错误,会对软件的质量造成重大影响,并且这类错误较难被检测和修复。不变式检测方法作为目前最为有效的并发错误检测手段,以提取正确程序行为的方式自动识别程序并发错误,较之传统分析方法在精度和效率上都有一定的优势。但现有的不变式检测工具主要为C/C++语言设计,未考虑到Java的程序特性,故对Java程序的并发错误检测无法达到预期的目的。本文通过对Java语言特性的分析后指出,可从以下两方面对Java程序的不变式检测进行改进。1)以对象粒度层面的操作记录和分析程序行为,为Java的不变式检测带来了新的机会。使用对象的操作信息代替原有的字段的操作信息,可以降低程序的交叉存取次数,减少需要记录的信息。同时,因为对象的读写依赖能够反映同一对象中多个关联变量间的依赖关系,所以对象粒度能够用于检测传统工具难以检测的多变量并发错误。2)以上下文敏感的方式进行Java程序的不变式检测,解决Java程序中包装函数所带来的影响。由于Java的封装特性,程序中存在着大量包装函数。而现有的不变式工具以静态语句区分程序点,这种方式无法区分在包装函数中具有不同调用关系的程序语句,进而遗漏一部分Java程序并发错误。基于以上两点发现,本文设计并实现了一个基于对象粒度且上下文敏感的不变式检测工具Jacob:一方面,Jacob使用对象粒度进行不变式提取与检测,能够检测多变量引发的并发错误;另一方面,Jacob是上下文敏感的,能更好的区分程序点,提高对与包装函数相关的并发错误的检测能力。同时,本文对Jacob进行了优化,使其在提高检测能力的前提下,不影响训练敏感度和性能开销,并只引入很少的假阳性。最后,通过对7个现实Java应用的测试表明,Jacob具有更强的Java程序并发错误检测能力,包括能检测原有不变式工具无法检测的与多变量和包装函数相关的并发错误类型。