  As quantum computing is rising in popularity, the amount of quantum programs
and the number of developers writing them are increasing rapidly.
Unfortunately, writing correct quantum programs is challenging due to various
subtle rules developers need to be aware of. Empirical studies show that 40-82%
of all bugs in quantum software are specific to the quantum domain. Yet,
existing static bug detection frameworks are mostly unaware of quantum-specific
concepts, such as circuits, gates, and qubits, and hence miss many bugs. This
paper presents LintQ, a comprehensive static analysis framework for detecting
bugs in quantum programs. Our approach is enabled by a set of abstractions
designed to reason about common concepts in quantum computing without referring
to the details of the underlying quantum computing platform. Built on top of
these abstractions, LintQ offers an extensible set of ten analyses that detect
likely bugs, such as operating on corrupted quantum states, redundant
measurements, and incorrect compositions of sub-circuits. We apply the approach
to a newly collected dataset of 7,568 real-world Qiskit-based quantum programs,
showing that LintQ effectively identifies various programming problems, with a
precision of 91.0% in its default configuration with the six best performing
analyses. Comparing to a general-purpose linter and two existing quantum-aware
techniques shows that almost all problems (92.1%) found by LintQ during our
evaluation are missed by prior work. LintQ hence takes an important step toward
reliable software in the growing field of quantum computing.
