Skip to main content
QUICK REVIEW

[论文解读] NPEFix: Automatic Runtime Repair of Null Pointer Exceptions in Java

Benoit Cornu, Thomas Durieux|arXiv (Cornell University)|Dec 23, 2015
Software Testing and Debugging Techniques参考文献 14被引用 24
一句话总结

NPEFix 是一种基于动态代码转换的运行时修复方法,通过在检测到有害空指针异常(NPE)时应用9种替代执行策略(如注入默认对象或跳过有问题的代码),自动修复 Java 程序中的空指针异常。该方法成功修复了11个真实现场错误中的10个,以及519个人工植入的NPE中的318个,其中方法级跳过策略表现最为有效。

ABSTRACT

Null pointer exceptions, also known as null dereferences are the number one exceptions in the field. In this paper, we propose 9 alternative execution semantics when a null pointer exception is about to happen. We implement those alternative execution strategies using code transformation in a tool called NPEfix. We evaluate our prototype implementation on 11 field null dereference bugs and 519 seeded failures and show that NPEfix is able to repair at runtime 10/11 and 318/519 failures.

研究动机与目标

  • 为解决 Java 和基于 C 的系统中导致崩溃的最常见原因——空指针异常(NPE)这一普遍问题,通过实现自动运行时修复而非静态预防。
  • 设计并评估一组9种运行时修复策略,当即将发生空指针解引用时,提供替代的执行语义。
  • 实现一个原型工具 NPEFix,利用源代码转换在运行时插入检测和修复钩子。
  • 通过实证评估这些策略在真实世界现场错误和人工植入的空指针解引用失败上的有效性。

提出的方法

  • NPEFix 使用源代码转换,在运行时插入检查逻辑,以在异常触发前检测潜在有害的空指针解引用。
  • 通过维护一个动态的 try-catch 块栈模型,区分被捕获和未被捕获的空指针异常,仅将未被捕获的异常视为有害。
  • 实现了九种不同的修复策略:四种用于对象注入(本地/全局、复用/新建),四种用于跳过(语句/方法级别),以及一种用于返回默认值。
  • 根据空指针解引用的上下文,动态地在运行时配置并激活这些策略。
  • 对 Java 源代码应用代码转换,以插入检测逻辑并接入修复机制。
  • 评估在11个来自开源项目的实际现场NPE错误和519个人工植入的NPE错误上进行,方法是移除所有空检查并运行测试套件。

实验结果

研究问题

  • RQ1是否可以通过可配置的执行策略实现空指针异常的自动运行时修复,从而避免应用程序崩溃?
  • RQ2在提出的九种修复策略中——对象注入、跳过语句或跳过方法——哪种在实践中最为有效?
  • RQ3与人工植入的失败相比,NPEFix 方法在修复真实世界现场报告的空指针异常方面的有效性如何?
  • RQ4修复策略在多大程度上会导致后续的运行时错误,表明修复后状态可能存在潜在不稳定性?

主要发现

  • NPEFix 在11个真实世界现场报告的空指针异常中成功修复了10个,证明了其强大的实际适用性。
  • 在人工植入错误的评估中,NPEFix 修复了519个空指针解引用错误中的318个,修复率达到61.3%。
  • 方法级跳过是最有效的策略,修复了11个现场错误中的9个,以及519个植入错误中的210个。
  • 使用本地或全局注入现有兼容对象的策略有效,其中全局注入在不同代码库中表现出更广泛的适用性。
  • 当没有可用的兼容现有对象时,注入新创建的对象(S2a/S2b)提供了一个可行的备用方案。
  • 尽管修复成功,但519个人工植入错误中有104个在修复后引发了后续运行时错误,表明某些情况下修复后的状态可能存在潜在不稳定性。

更好的研究,从现在开始

从论文设计到论文写作,大幅缩短您的研究时间。

无需绑定信用卡

本解读由 AI 生成,并经人工编辑审核。