Skip to main content
QUICK REVIEW

[论文解读] Using Distributed Representation of Code for Bug Detection

Jón Arnar Briem, Jordi Smit|arXiv (Cornell University)|Nov 28, 2019
Software Engineering Research参考文献 15被引用 5
一句话总结

该论文将原本用于方法名预测的Code2Vec模型重新用于检测Java代码中的off-by-one错误,通过微调其最后一层实现二分类任务。利用AST路径嵌入与注意力机制,在经过变异的代码语料上进行训练,模型在off-by-one错误检测上表现出良好的泛化能力,尽管存在数据集偏差以及在非标准代码模式下产生误报的问题。

ABSTRACT

Recent advances in neural modeling for bug detection have been very promising. More specifically, using snippets of code to create continuous vectors or extit{embeddings} has been shown to be very good at method name prediction and claimed to be efficient at other tasks, such as bug detection. However, to this end, the method has not been empirically tested for the latter. In this work, we use the Code2Vec model of Alon et al. to evaluate it for detecting off-by-one errors in Java source code. We define bug detection as a binary classification problem and train our model on a large Java file corpus containing likely correct code. In order to properly classify incorrect code, the model needs to be trained on false examples as well. To achieve this, we create likely incorrect code by making simple mutations to the original corpus. Our quantitative and qualitative evaluations show that an attention-based model that uses a structural representation of code can be indeed successfully used for other tasks than method naming.

研究动机与目标

  • 评估Code2Vec这一前沿代码嵌入模型是否可有效重用于off-by-one错误检测,超越其原始的方法命名任务。
  • 探究基于注意力的AST路径表征在识别代码语义错误方面的可行性。
  • 填补代码嵌入模型在真实世界错误检测任务中缺乏实证评估的空白。
  • 探索通过代码变异进行数据增强对模型泛化能力和鲁棒性的影响。
  • 识别与数据集偏差、代码风格偏差及作用域限制相关的模型性能局限。

提出的方法

  • 通过将Code2Vec模型的最后一层替换为二分类头,微调模型以检测off-by-one错误。
  • 模型利用基于路径的注意力机制,从Java代码的抽象语法树(AST)路径中学习向量表示。
  • 以大量可能正确的Java代码作为基础语料,通过语法变异(例如,将'<'替换为'<=')引入off-by-one错误,生成负样本。
  • 模型在原始(正确)与变异(错误)代码样本的混合数据集上进行训练,以支持二分类任务。
  • 通过标准指标进行定量评估,并结合检测到的错误案例进行定性分析。
  • 探索迁移学习策略:使用原始Code2Vec任务的预训练权重初始化模型,但结果表明其性能仅比随机初始化略有提升。

实验结果

研究问题

  • RQ1能否将原本用于方法名预测的Code2Vec模型有效重用于off-by-one错误检测?
  • RQ2基于注意力的AST路径表征在方法命名任务之外,对检测逻辑错误的泛化能力如何?
  • RQ3通过代码变异进行数据增强在多大程度上能提升模型的检测性能与泛化能力?
  • RQ4模型的主要失效模式是什么,特别是与代码风格偏差和上下文限制相关的问题?
  • RQ5从预训练的Code2Vec模型进行迁移学习是否能显著提升off-by-one错误的检测性能?

主要发现

  • 模型在off-by-one错误检测上表现出令人满意的性能,表明结合注意力机制的AST路径嵌入可有效泛化至方法命名之外的错误检测任务。
  • 从预训练的Code2Vec模型进行迁移学习仅带来比随机初始化微弱的性能提升,且未显著加速训练过程。
  • 模型对标准编码模式表现出强烈偏好,对非传统代码风格(尤其是使用'<'='的for循环)产生大量误报。
  • 由于数据集不平衡,模型性能受到负面影响,'>=', '<='的样本数量远少于'<'和'>'的样本。
  • 模型的作用域局限于单个方法的AST,可能遗漏被调用方法的上下文信息,导致在复杂代码中预测不可靠。
  • 模型的误报主要源于对常见编码惯例的偏离,表明风格泛化仍是当前面临的关键挑战。

更好的研究,从现在开始

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

无需绑定信用卡

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