アポロ11号の誘導コンピュータ(AGC)コードに、57年間見逃されてきたバグが発見された。月面着陸という人類史上最大の偉業を支えたソフトウェアに、いまも未解決の欠陥が眠っていたとは——AIを活用した形式仕様検証の力を示す、驚くべき事例だ。

アポロ誘導コンピュータとは

AGCは1969年、アポロ11号の月面着陸を実現した誘導制御コンピュータだ。わずか2KBの消去可能RAM、1MHzクロックという今では信じられないスペックで、月への飛行経路計算と着陸船の制御を担った。

コードは74KBの「コアロープメモリ」に格納されていた。磁気コアに銅線を手で通す、まさに手作業の記憶装置だ。製造を担った女性技術者たちは社内で「Little Old Ladies」と呼ばれ、このメモリは「LOLメモリ」とも呼ばれた。プログラムはハードウェアそのものに物理的に織り込まれていた。

ソースコードは2003年にMITのプリントアウトからボランティアが手入力で復元し、2016年にGitHubで公開されると大きな話題となった。以降、数千人の開発者がアセンブリコードをレビューし、エミュレータが一命令ずつ実行し、学術論文が信頼性を分析してきた。それでも、バグは潜み続けた。

発見された57年間のバグ

バグを発見したのは、英国のソフトウェア会社JUXTのチームだ。彼らはAIと自社開発のオープンソース行動仕様言語「Allium」を組み合わせ、13万行のAGCアセンブリコードから1万2500行の仕様書を自動生成した。そのプロセスが欠陥に直接たどり着いた。

バグはIMU(慣性計測ユニット)サブシステムのジャイロ制御コードにある。AGCはジャイロスコープをトルク制御する際にLGYROという共有リソースロックを取得し、3軸すべての制御完了後にロックを解放する。

問題は「ケージング」時の処理だ。ケージングとはIMUのジンバルを物理的に固定する緊急措置で、クルーがコックピットのスイッチで操作できた。通常の完了パスではロックが解放されるが、ケージング発生時の終了ルートBADENDには、ロックをクリアする2命令が抜けていた:


出典: この記事は We found an undocumented bug in the Apollo 11 guidance computer code の内容をもとに、筆者の見解を加えて独自に執筆したものです。