Skip to main content
QUICK REVIEW

[论文解读] Learning a Static Bug Finder from Data

Yu Wang, Fengjuan Gao|arXiv (Cornell University)|Jul 12, 2019
Software Engineering Research参考文献 43被引用 8
一句话总结

该论文提出 NeurSA,一种框架,通过直接从代码数据训练深度学习模型——特别是采用基于区间的传播机制的图神经网络(GNN)——来检测语义错误,如空指针解引用和数组索引错误。该方法在精确度上优于传统静态分析器,并在真实项目中发现了 50 个新错误,其中 9 个已被修复,3 个已由维护者确认。

ABSTRACT

We present an alternative approach to creating static bug finders. Instead of relying on human expertise, we utilize deep neural networks to train static analyzers directly from data. In particular, we frame the problem of bug finding as a classification task and train a classifier to differentiate the buggy from non-buggy programs using Graph Neural Network (GNN). Crucially, we propose a novel interval-based propagation mechanism that leads to a significantly more efficient, accurate and scalable generalization of GNN. We have realized our approach into a framework, NeurSA, and extensively evaluated it. In a cross-project prediction task, three neural bug detectors we instantiate from NeurSA are effective in catching null pointer dereference, array index out of bound and class cast bugs in unseen code. We compare NeurSA against several static analyzers (e.g. Facebook Infer and Pinpoint) on a set of null pointer dereference bugs. Results show that NeurSA is more precise in catching the real bugs and suppressing the spurious warnings. We also apply NeurSA to several popular Java projects on GitHub and discover 50 new bugs, among which 9 have been fixed, and 3 have been confirmed.

研究动机与目标

  • 通过用数据驱动的学习方法替代人工编写的规则,解决传统静态错误检测器中高误报率和漏报率的问题。
  • 提升图神经网络(GNN)在检测复杂语义错误方面的能力,超越语法模式的检测范围。
  • 开发一种可扩展的、通用的框架,用于创建神经静态分析器,而无需手动指定错误模式。
  • 通过从代码语料中自动学习,减少在设计静态分析规则时对专家知识的依赖。
  • 实现对跨项目错误的有效检测,如空指针解引用、数组索引越界和类转换异常。

提出的方法

  • 该框架从多个开源项目中收集训练数据,基于已知的错误报告自动将程序标记为存在错误或无错误。
  • 它将程序表示为代码属性图,并应用一种新颖的基于区间的传播机制(IBPM),以增强 GNN 学习深层语义特征的能力。
  • IBPM 实现了在图区间上的分层消息传递,提升了模型的表达能力与大规模程序的可扩展性。
  • 该模型被训练为二分类任务,利用节点级和图级表示来区分存在错误和无错误的代码片段。
  • NeurSA 通过在程序图中跨函数调用和控制流结构传播信息,执行跨过程分析。
  • 该框架具有可扩展性:通过在特定错误类型标注数据上重新训练,可创建新的错误检测器,而无需修改核心架构。

实验结果

研究问题

  • RQ1直接从代码数据训练的深度学习模型,是否能比基于规则的静态分析器更有效地检测复杂语义错误?
  • RQ2所提出的基于区间的传播机制如何提升 GNN 在程序分析中的性能与可扩展性?
  • RQ3数据驱动的神经方法在跨项目场景下,其泛化能力在多大程度上可覆盖未见过的错误?
  • RQ4该框架是否能在一个大型、持续维护的开源项目中发现真实世界中的错误?
  • RQ5在精确度和召回率方面,该模型与 Facebook Infer 和 Pinpoint 等最先进的静态分析器相比表现如何?

主要发现

  • NeurSA 在检测空指针解引用错误方面优于 Facebook Infer 和 Pinpoint,表现出更高的精确度和更少的误报。
  • 该框架在流行的 GitHub 项目中发现了 50 个新错误,其中 9 个已被确认修复,3 个已由项目维护者确认。
  • 从 NeurSA 实例化的三个神经错误检测器,在未见过的代码中成功检测到空指针解引用、数组索引越界和类转换异常。
  • 基于区间的传播机制(IBPM)显著提升了 GNN 的泛化能力,使其能更好地检测复杂且非语法性的错误模式。
  • 尽管有所改进,NeurSA 在非常大型的程序(约 1,000 个节点)中仍表现不佳,局部错误模式被无关代码掩盖,表明仍需改进信号定位能力。
  • NeurSA 的误报通常由导致误报的相同问题引起——特别是对空指针存在的过度敏感,而缺乏完整上下文信息。

更好的研究,从现在开始

从阅读论文到最终审阅,大幅缩短您的研究时间。

无需绑定信用卡

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