1991
年2月11日、パトリオットプロジェクトオフィスは、パトリオットミサイルシステムの欠陥に関するイスラエルのデータを受け取りました。 彼らは、システムが8時間動作すると、20%の汚れが発生することを発見しました。 彼らは、20時間の操作後、システムがオーバーシュートを開始しすぎて、弾道ミサイルをキャプチャ、追跡、およびヒットできなくなると考えました。 米軍は発見の重要性を考慮せず、このシステムはポータブルで短期的な防衛作戦用に設計されており、8時間以上システムを使用することはないだろうと述べた。
バグ修正は
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されました
MIM-104「パトリオット」 (生まれたMIM-104パトリオット、英語から翻訳-パトリオット)-アメリカ陸軍とその同盟国が使用するアメリカの対空ミサイルシステム(SAM)。
ターゲットの管理を担当するソフトウェアにバグがありました。これにより、時間とともに内部クロックが時間の真の値から徐々に離れていきました。
システム時間は、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コメント):
浮動小数点数を操作する際のバイナリ演算の致命的なエラー 。
パトリオットについてもっと読む
おわりに
私たちは、ソフトウェアの信頼性の問題に人々の注意を引きたいと思っています。 プログラムは長い間、Fortranやコンピューターゲームの科学者の奇妙で不可解な計算だけではありません。 これが私たちを長い間、そしてどこでも取り囲んでいるものです。
深刻なバグは、かつては狭い特定の領域-平和ロケット科学(
Ariane 5 )および軍事ロケット科学(
Patriot )で有害でした。 現在、プログラムエラーが発生すると、コンピューターに座っているだけでなく、車に座っている(
トヨタ )か、病院に行っている(
Therac-25 )こともあります。 私たちは、プログラマーの側でバグと戦う人の一人です。
PVS-Studio静的コードアナライザーを開発しまし
た 。これにより、コーディング段階でもC、C ++、C#プログラムの多くのエラーを検出できます。 そして、この機会に、2016年10月25日からWindowsだけでなく、このアナライザーのLinuxバージョンも利用できるようになることを思い出したいと思います。