  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.
