特異なバグ
From Wikipedia, the free encyclopedia
ハイゼンバグは、それを調査しようとすると変貌したり消えたりするバグである。
ハイゼンバグの例:
- リリース版では発生するがデバッグ版(-DDEBUGコンパイルオプション等)では発生しない。
- 普通に実行すれば発生するがデバッガなどの環境では発生しない。
- ユーザーの環境では発生するが開発者の環境では発生しない。
- 結合テストでは発生するが同じチェックをしているはずの単体テストでは発生しない。
- 何が起きているのか調べようと出力命令を入れると(いわゆる「printfデバッグ」)発生しなくなる。
- 競合状態によって発生している。
この名前は不確定性原理を提唱したハイゼンベルクのもじり。ここでの不確定性原理とは量子力学用語で「観測すること自体が対象に影響を与えるため正確な観測ができないこと」を指す(これは実際には観察者効果であり不確定性原理ではないが、両者はよく混同される)。
デバッグモードではプログラムの実行前にメモリがクリーンアップされたり、変数がレジスタではなく特定のスタック位置へ配置されたりすることがある。これはハイゼンバグのよくある原因である。またデバッガは、変数の監視等のために、普段実行されないコード(変数アクセサなど)を実行する場合があり、これによってプログラムの状態が変わることも原因となる。他にも、Fandango on core が原因になることもある。その裏には初期化されていない変数が隠れていることが多い。
この言葉が初めて使われたときに同席したという Bruce Lindsay は、これはハイゼンベルクの「ある物事をよく見れば見るほど、他の物事をよく見ることができなくなる」という言葉に由来するとインタビューで述べている。
ボーアバグ (Bohrbugs)
ボーアバグ(ボーアの原子模型に由来)は特定の状況下で高い再現性を見せるバグである。ハイゼンバグと違って調査時に変貌したり消えたりすることはない。「特定の状況」が分かっている場合にはもっとも修正しやすいタイプのバグとなるが、これが不明な場合にはもっとも難しいものとなる。
マンデルバグ (Mandelbugs)
マンデルバグ(フラクタルを提唱したマンデルブロに由来)は、あまりに複雑なためカオス的に映るバグのことである。つまりハイゼンバグというよりはボーアバグに近い。
カオス的に見えるかどうかではなく、あまりに複雑なため現実的な解決策がないと思われるバグを指して言う人もいる。このようなバグはシステム全体の基本的な欠陥に由来することが多い。
最近のIEEE Computerでの記事によると、マンデルバグはボーアバグの補完的な反義語であるとしている。つまり全てのバグはマンデルバグかボーアバグである。マンデルバグの複雑さは原因から発生までの大きな時間差やハードウェア、OS、他のソフトウェアによる現象への影響から起こるとされる。
シュレーディンバグ (Schroedinbugs)
シュレーディンバグは、特殊な状況下でバグが発覚してプログラマがソースを読むと、そもそも最初から動くはずがないように見え、それを境にして一切動作しなくなってしまうようなバグである。FOLDOCでは「そんなことはあり得ないように思えるが、潜在的なシュレーディンバグをかくまっているプログラムというのは実際にあるのだ」と書いている。
名前の由来はシュレーディンガーの猫と呼ばれる、量子論に関する思考実験である。
アリストテレス (Aristotle)
アリストテレスは、バグのないプログラムからの不正な出力を指す。古代ギリシャの哲学者アリストテレスに由来するこのバグは、正しいと思い込んでいる不正な入力によって、そのまま不正な出力が現れることを指している。プログラム自体のバグではない。入力をチェックする前に複雑なアルゴリズムに欠陥があるのではと考えてしまうことから、いろいろな矛盾が発覚するまで多くの人に正しいと信じられていたアリストテレスの名が付いた。
軽い警句として、FIFO・LIFOなどになぞらえて、ごみを入れればごみが出てくる「ガベージインガベージアウト」(「GIGO」)などとも言われる。