オーバーフローが引き起こした面白いバグの話

一度聞いたら忘れられないような印象深いバグというものがある。僕は数値のオーバーフローと聞くと必ずこの2つのバグを思い出してしまう。どちらも面白いエピソードなのでちょっと紹介してみよう。

一つ目は、初代Civilizationにあったバグである。Civilizationは文明間で戦う戦略シミュレーションゲームで、チンギスハンとかエリザベス女王みたいなプレイヤーを選んで、世界制覇か宇宙開発競争での勝利を目指すというゲームだ。

初代Civilizationにあったバグは、非暴力主義のガンジーが突然核攻撃してくるというものだった。原因は文明が民主主義を採用すると攻撃性が2下がるというロジックだった。初代Civではガンジーの攻撃性は全プレイヤー中で最小の1なのだが、ゲームが進んでインド文明が民主主義を採用すると、攻撃性がマイナス2されてオーバーフローで255になり、ガンジーがゲーム中で突如、極度に攻撃的なプレイヤーになってしまっていた。そして、そのころには大抵、科学技術の面で各文明が核兵器を持っているレベルまでゲームが進行しているので、結果的にガンジーがあるターンで突然核戦争を仕掛けてくるという行動が引き起こされていた。この「核ガンジー」はむしろ面白いということでそれ以降のCivilizationシリーズでは定番化したのだが、初代ではこれは意図しないバグだったのだ。

もう一つのエピソードは、アリアン5ロケットの初回テスト打ち上げ時に発覚したバグである。この事例では、ロケット打ち上げ数十秒後に制御プログラムが停止してロケットが進行方向に対して横を向いてしまい、空中分解して、400億円近くするロケットが爆発してしまった。

その後の調査でわかった原因は次のようなものだった。アリアン5ロケットでは水平方向の速度を64ビット浮動小数点数で持っていたのだが、それを16ビット整数に変換しているコードがあり、そこでオーバーフローが発生しうるようになっていた。オーバーフローが起こるとプロセッサのトラップが上がり、バックアップのシステムに切り替わるのだが、バックアップも同じプログラムを動かしていたのであまり意味はなく、完全にシステムがダウンしてしまった。

興味深いのは、この制御プログラムは以前のアリアン4でも使われていた実績のあるものだったということだ。実績があるからといってバグがないというわけではなく、アリアン4はアリアン5より速度が遅かったので、計測された値が16ビットの範囲に偶然収まっていて、問題が発生していなかっただけだったのだ。アリアン5でも最初の数十秒は速度が遅かったのでバグは発現せず、十分に加速したところでロケットが爆発するに至った。

僕もオーバーフローによるバグはたくさん作ってきたけど、面白さでも重大さでもこういうものに比べると全然だなぁと思ってしまうのだ。

89

Rui Ueyama

コメントを投稿するには、 ログイン または 会員登録 をする必要があります。