Skip to main content
QUICK REVIEW

[論文レビュー] DeepBugs: A Learning Approach to Name-based Bug Detection

Michael Pradel, Koushik Sen|arXiv (Cornell University)|Apr 30, 2018
Software Engineering Research参考文献 53被引用数 14
ひとこと要約

DeepBugsは、JavaScriptなどの動的型付け言語における名前ベースのバグ検出に機械学習アプローチを導入し、識別子の意味的埋め込みと、人工的に挿入されたバグを用いた学習により、正確で効率的な検出器を構築する。このフレームワークは89–95%の正確性を達成し、102件の実世界のバグを検出するが、そのうちの68%が真正陽性である。

ABSTRACT

Natural language elements in source code, e.g., the names of variables and functions, convey useful information. However, most existing bug detection tools ignore this information and therefore miss some classes of bugs. The few existing name-based bug detection approaches reason about names on a syntactic level and rely on manually designed and tuned algorithms to detect bugs. This paper presents DeepBugs, a learning approach to name-based bug detection, which reasons about names based on a semantic representation and which automatically learns bug detectors instead of manually writing them. We formulate bug detection as a binary classification problem and train a classifier that distinguishes correct from incorrect code. To address the challenge that effectively learning a bug detector requires examples of both correct and incorrect code, we create likely incorrect code examples from an existing corpus of code through simple code transformations. A novel insight learned from our work is that learning from artificially seeded bugs yields bug detectors that are effective at finding bugs in real-world code. We implement our idea into a framework for learning-based and name-based bug detection. Three bug detectors built on top of the framework detect accidentally swapped function arguments, incorrect binary operators, and incorrect operands in binary operations. Applying the approach to a corpus of 150,000 JavaScript files yields bug detectors that have a high accuracy (between 89% and 95%), are very efficient (less than 20 milliseconds per analyzed file), and reveal 102 programming mistakes (with 68% true positive rate) in real-world code.

研究の動機と目的

  • 既存の静的解析ツールが識別子名を無視するという限界に対処し、それらが意図されたプログラム動作に関する意味的ヒントを多く持っていること。
  • 変数名や関数名の意味的意味を推論する課題に直面するが、これは本質的に曖昧であり、文法的解析だけでは対処できないこと。
  • 従来の名前ベースのバグ検出器で必要とされるヒューリスティックの手動設計・チューニングにかかる人的作業を削減するため、例からの自動学習に置き換えること。
  • 動的型付け言語において、型情報が欠落しているがゆえに識別子名が意味的解釈に不可欠となる、微細で名前関連のバグを改善して検出すること。

提案手法

  • 識別子名を、語彙的マッチングを超えた意味的類似性(例:'length'と'count'は意味的に類似)を捉える学習済みの意味的埋め込みで表現する。
  • バグ検出を二値分類問題として定式化し、訓練済み分類器を用いて正しいコードと誤りのあるコードを区別する。
  • 実コードに対して単純な文法的変換(例:関数引数の入れ替え、二項演算子の被演算子の入れ替え)を適用して、否定的(誤り)のトレーニング例を生成する。
  • 実際の(肯定的)コード例と、人工的に変換された(否定的)コード例のバランスの取れたデータセット上で分類器を学習させ、バグを示すパターンを学習する。
  • 関数引数の入れ替え、誤った二項演算子、ループ内での被演算子の入れ替えの3つの特殊なバグ検出器を実装し、すべて識別子名の意味的意味に基づく。
  • 15万件のJavaScriptファイルから構成されるコーパスに訓練済み検出器を適用し、実世界での有効性と効率性を評価する。

実験結果

リサーチクエスチョン

  • RQ1機械学習ベースのアプローチは、動的型付け言語において、手動で設計されたヒューリスティックを上回って名前ベースのバグを検出できるか?
  • RQ2人工的にバグを挿入するためのコード変換により生成された否定的トレーニング例は、二値分類器にとって効果的に使えるか?
  • RQ3識別子の意味的埋め込みからの学習は、語彙的類似性だけでは明らかでないバグの検出を向上させるか?
  • RQ4人工的に注入されたバグで学習したモデルは、高い正確性と再現率で実世界のプログラミングミスを検出できるか?

主な発見

  • DeepBugsフレームワークは、3つの異なるバグ検出器で89–95%の正確性を達成し、名前ベースのバグ検出において優れた性能を示した。
  • 本番のJavaScriptコードにおいて102件の実世界のプログラミングミスを検出でき、真正陽性率が68%であった。これは、トレーニングデータを超えた良好な一般化能力を示している。
  • 1ファイルあたりの平均分析時間は20ミリ秒未満であり、開発パイプラインへの統合に適した効率性を示している。
  • 単純なコード変換によって生成された人工的バグは、非常に効果的な分類器を生み出し、本アプローチの核心的洞察である「合成された否定例」が強力な検出器を訓練可能であることを裏付けた。
  • 識別子の意味的埋め込みは、語彙的類似性だけでは達成できない検出性能を著しく向上させ、意味的に類似しているが語彙的に異なる名前を含むバグの検出を可能にした。
  • 従来の静的解析ツールが識別子名を無視するため見逃していた実世界のコード内のバグを、このフレームワークは効果的に特定した。

より良い研究を、今すぐ始めましょう

論文の読解から最終レビューまで、研究時間を劇的に削減しましょう。

クレジットカード登録不要

このレビューはAIが作成し、人間の編集者が確認しました。