バグ修正は2月16日にリリースされましたが、戦争であったため、軍事装備のすべてのユニットに統合するのに時間がかかりました。
2月21日、軍はシステムが「長期間」機能しないように指示を出しました。 軍隊は、それがいつまで続くかを指定しませんでした。
2月25日、サウジアラビアのダーランで、弾道ミサイル「 灯油 」(別名R-17、別名スカッド)が兵舎に飛んでアメリカ人を訪問しました。 パトリオットミサイルシステムがソフトウェアエラーのために逃したため、28人が負傷した96人を殺しました。
2月26日、バグ修正がDahranに配信されました。


R-17 (米国およびNATO防衛軍の分類-SS-1c Scud B、輸出指定R-300、非公式-「ケロシン」)-ソビエトの長期貯蔵燃料コンポーネント上の液体単段弾道ミサイル。
写真R-17
軍事検査R-17ミサイルは、砂漠の嵐の操作中にMIM-104パトリオット防空システムの砂漠で撃downされました


軍事検査R-17ミサイルは、砂漠の嵐の操作中にMIM-104パトリオット防空システムの砂漠で撃downされました
MIM-104「パトリオット」 (生まれたMIM-104パトリオット、英語から翻訳-パトリオット)-アメリカ陸軍とその同盟国が使用するアメリカの対空ミサイルシステム(SAM)。
写真愛国者
AN / MPQ-53レーダーセットの詳細図。 垂直コンポーネントの前面にある円形パターンは、それぞれ直径約39ミリメートル(1.535インチ)の5,000を超える個別の要素で構成されるシステムのメインフェーズドアレイです。
PAC-3ミサイル発射装置、各キャニスターに4つのミサイルがあることに注意してください



AN / MPQ-53レーダーセットの詳細図。 垂直コンポーネントの前面にある円形パターンは、それぞれ直径約39ミリメートル(1.535インチ)の5,000を超える個別の要素で構成されるシステムのメインフェーズドアレイです。

PAC-3ミサイル発射装置、各キャニスターに4つのミサイルがあることに注意してください
ターゲットの管理を担当するソフトウェアにバグがありました。これにより、時間とともに内部クロックが時間の真の値から徐々に離れていきました。
システム時間は、10分の1秒の精度で整数として24ビットレジスタに保存されました。 したがって、0.1秒の各測定で、一部の時間は「失われました」。 計算では、データは実数に変換されました。
[ ソース ]
1/10は1/2 4 +1/2 5 +1/2 8 +1/2 9 +1/2 12 +1/2 13 + ...です。つまり、バイナリ分解は1/10 = 0.0001100110011001100110011001100 ...です。したがって、24ビット代わりに、Patriotシステムのレジスタは0.00011001100110011001100を代わりに保存し、バイナリ用語で0.0000000000000000000000011001100 ...、または10進数で約0.000000095に等しいエラーを発生させました。 100時間の操作の場合、0.000000095×100×60×60×10 = 0.34秒
「ケロシンカ」は毎秒1676メートルの速度で飛行し、0.54キロメートル以上0.34秒で通過します。 これは愛国者の敗北の半径をこっそり抜けるのに十分以上です。 時間の曲線計算がプログラムの一部で修正されたが、すべてではなかったのは面白いです。
このソフトウェアは15〜20年前にアセンブラで作成され、その後さまざまなプログラミングチームによって何度か修正されています。
パトリオットシステムの問題が特定されているレポートのスライド:



黄金のルール
- 適切なサイズを選択してください。 特定の言語および特定のオペレーティングシステムで、選択する各変数(long、int、double、floatなど)を格納する必要があるビット数を常に慎重に再確認してください。
- 可能な場合、フロートの代わりに整数を使用します。 お金をドルではなくセントで保管します(Satoshiの方が適切です)。 それでもフロートを使用する必要がある場合は、倍精度を使用します。
- ループカウンタとしてフロートを使用しないでください。
- 混合型(符号付き、符号なし、整数、浮動小数点、単精度、倍精度)を避けてください。 慎重に変換します。
- 考えられるオーバーフロー状況を確認してください。 ゼロ除算を確認してください。
PVSの記事: 32ビットコードと64ビットコードで異なる結果が得られるのはなぜですか?
habraauthorからの記事(229コメント): 浮動小数点数を操作する際のバイナリ演算の致命的なエラー 。
パトリオットについてもっと読む
- hackernews のバグに関する議論
- New York Times: 戦後; 軍はダーラン・スカッドを止められなかったために愛国者のコンピューターを非難している
- 致命的なソフトウェアの欠陥:パトリオットミサイルの失敗
- ソフトウェアバグレポート: パトリオットミサイルソフトウェアの問題
おわりに
私たちは、ソフトウェアの信頼性の問題に人々の注意を引きたいと思っています。 プログラムは長い間、Fortranやコンピューターゲームの科学者の奇妙で不可解な計算だけではありません。 これが私たちを長い間、そしてどこでも取り囲んでいるものです。
深刻なバグは、かつては狭い特定の領域-平和ロケット科学( Ariane 5 )および軍事ロケット科学( Patriot )で有害でした。 現在、プログラムエラーが発生すると、コンピューターに座っているだけでなく、車に座っている( トヨタ )か、病院に行っている( Therac-25 )こともあります。 私たちは、プログラマーの側でバグと戦う人の一人です。 PVS-Studio静的コードアナライザーを開発しました 。これにより、コーディング段階でもC、C ++、C#プログラムの多くのエラーを検出できます。 そして、この機会に、2016年10月25日からWindowsだけでなく、このアナライザーのLinuxバージョンも利用できるようになることを思い出したいと思います。