特異なバグ

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

特異なバグ (: unusual software bugs) とは、ソフトウェアバグの中でも特に修正が難しいものを言う。いくつかの種類があるが、直感的に理解しがたいような理論を発表した科学者に由来して名前が付いているものが多い。

ハイゼンバグ (Heisenbugs)[編集]

ハイゼンバグは、それを調査しようとすると変貌したり消えたりするバグである。

よくある例として: 1、リリース版では発生するがデバッグ版(-DDEBUGコンパイルオプション等)では発生しない。 2、普通に実行すれば発生するがデバッガなどの環境では発生しない。 3、ユーザーの環境では発生するが開発者の環境では発生しない。 4、結合テストでは発生するが同じチェックをしているはずの単体テストでは発生しない。 5、何が起きているのか調べようと出力命令を入れると(いわゆる「printfデバッグ」)発生しなくなる。 6、競合状態によって発生している。 などがある。

この名前は不確定性原理を提唱したハイゼンベルクのもじり。ここでの不確定性原理とは量子力学用語で「観測すること自体が対象に影響を与えるため正確な観測ができないこと」を指す(これは実際には観察者効果であり不確定性原理ではないが、両者はよく混同される)。

デバッグモードではプログラムの実行前にメモリがクリーンアップされたり、変数がレジスタではなく特定のスタック位置へ配置されたりすることがある。これはハイゼンバグのよくある原因である。またデバッガは、変数の監視等のために、普段実行されないコード(変数アクセサなど)を実行する場合があり、これによってプログラムの状態が変わることも原因となる。他にも、Fandango on core が原因になることもある。その裏には初期化されていない変数が隠れていることが多い。

この言葉が初めて使われたときに同席したという Bruce Lindsay は、これはハイゼンベルクの「ある物事をよく見れば見るほど、他の物事をよく見ることができなくなる」という言葉に由来するとインタビューで述べている。

ボーアバグ (Bohrbugs)[編集]

ボーアバグ(ボーアの原子模型に由来)は特定の状況下で高い再現性を見せるバグである。ハイゼンバグと違って調査時に変貌したり消えたりすることはない。「特定の状況」が分かっている場合にはもっとも修正しやすいタイプのバグとなるが、これが不明な場合にはもっとも難しいものとなる。

マンデルバグ (Mandelbugs)[編集]

マンデルバグ(フラクタルを提唱したマンデルブロに由来)は、あまりに複雑なためカオス的に映るバグのことである。つまりハイゼンバグというよりはボーアバグに近い。

チューリング・テストと同様の原理により、あるバグがカオス的であるかそうでないかは判断できないと言えるため、厳密にはハイゼンバグとの区別がつかないということになる。

カオス的に見えるかどうかではなく、あまりに複雑なため現実的な解決策がないと思われるバグを指して言う人もいる。このようなバグはシステム全体の基本的な欠陥に由来することが多い。

上記それぞれのバグの定義は整合性を保てていない。上の定義によるとマンデルバグはボーアバグであり、ハイゼンバグとボーアバグは反義語であり、さらにハイゼンバグは全てマンデルバグという事になってしまっているのである。

最近のIEEE Computerでの記事によると、マンデルバグはボーアバグの補完的な反義語であるとしている。つまり全てのバグはマンデルバグかボーアバグである。マンデルバグの複雑さは原因から発生までの大きな時間差やハードウェア、OS、他のソフトウェアによる現象への影響から起こるとされる。よってハイゼンバグはマンデルバグである。

シュレーディンバグ (Schroedinbugs)[編集]

シュレーディンバグは、特殊な状況下でバグが発覚してプログラマがソースを読むと、そもそも最初から動くはずがないように見え、それを境にして一切動作しなくなってしまうようなバグである。FOLDOCでは「そんなことはあり得ないように思えるが、潜在的なシュレーディンバグをかくまっているプログラムというのは実際にあるのだ」と書いている。

名前の由来はシュレーディンガーの猫と呼ばれる、量子論に関する思考実験である。しっかり書かれたプログラムは、安定した環境下では決定論や量子論的な可観測性に従った動作をするはずである。だが、そもそも最初の時点でどんな不思議な条件がそろって動作したのかや、動作しなくなった正確な理由を探り始めるよりも、目の前にある欠陥品コードを修正するほうがよい。突然動かなくなるなどという事は迷信なのだ。

たとえばデータベースを使ったプログラムで、レコード数が少ないときは正常に動いていたが、あるレコード数を超えると突然動かなくなったとする。それが原因だと分かっていないプログラマは、レコード数の増加という「普通な」原因を考えず、これはシュレーディンバグだと片付けてしまうかもしれない。

ハイゼンバグ同様、これはシュレーディンガーの思考実験を誤解した命名だ。猫の実験では蓋を開けたことが猫を殺したというのではなく、その明らかな不自然さを示すことがシュレーディンガーの真意だったからである。

アリストテレス (Aristotle)[編集]

アリストテレスは、バグのないプログラムからの不正な出力を指す。古代ギリシャの哲学者アリストテレスに由来するこのバグは、正しいと思い込んでいる不正な入力によって、そのまま不正な出力が現れることを指している。プログラム自体のバグではないが、コンピュータサイエンスではよくあることだ。入力をチェックする前に複雑なアルゴリズムに欠陥があるのではと考えてしまうことから、いろいろな矛盾が発覚するまで多くの人に正しいと信じられていたアリストテレスの名が付いた。

軽い警句として、FIFOLIFOなどになぞらえて、ごみを入れればごみが出てくる「ガベージインガベージアウト」(「GIGO」)などとも言われる。

月の相バグ (Phase of the moon bugs)[編集]

月の相は潮汐の大小と同期するなどの自然現象があるためからか、超自然的な現象などに月の相が影響するとされる伝説が狼男の映画などに見られるが、およそコンピュータの動作に影響するとは考えられないものであることから、ジャーゴンファイルでは、原因としては全く不明なランダムな動作のみなもとのこと、とまず説明している。

ジャーゴンファイルには、実際に月の相が原因で起こった珍しい問題をいくつか掲載しており、月の相についての文字列表現がたまたま非常に長いタイミングで実行すると一種のバッファオーバーランを起こし落ちるという例、旧版(1983年版)の書籍版のジャーゴンファイルの「月の相」の項にその例を載せた結果起きた印刷ミス(「月の相バグバグ」と呼ばれた)の例、CERNのLEP(LHCの前のプロジェクト)での予想外の観測結果の原因が、巨大な加速器が地球と月の潮汐の影響を受けるためであった例、が挙げられている。

「月の相」を、時間時刻のこととすれば、それを取り扱うプログラムは、うるう日うるう年などや、処理が日や月・年・世紀をまたぐ場合などに問題を抱えていることがしばしばある(2000年問題など)。

関連項目[編集]

参考文献[編集]