安全性が重視されるソフトウェアにはどの言語が使用されますか? [閉まっている]
-
04-07-2019 - |
質問
安全性が重要なソフトウェアの開発、特にプログラミング言語の選択がそのような開発に与える影響について調査しています。
一般的に使用される言語とその理由を詳細に説明してください。
解決
Ada および SPARK (静的検証用のフックを備えたAda方言)は、航空宇宙システムでアビオニクスシステムなどの信頼性の高いソフトウェアを構築するために使用されます。 これらのコード検証ツールのエコシステムのようなものがあります言語。ただし、この技術は他の主流言語にも存在します。
> Erlang は
ただし、これらの言語はガベージコレクションであり、ガベージコレクションはコードに対して透過的であるため、この方法で推論することはできません。ガベージコレクションされた言語は、通常、ハードリアルタイムアプリケーションには十分に予測できませんが、時間制限のあるインクリメンタルガベージコレクターに関する継続的な研究が行われています。
Eiffel およびその子孫には、 Design by Contract は、不変式 Eiffelは実際に流行りませんでしたが、高信頼性ソフトウェアの開発は、実際に機能を記述する前に、障害モードを事前に確認します。
C および C ++ は、このタイプのアプリケーション用に特別に設計されたものではなく、いくつかの理由で組み込みおよび安全性重視のソフトウェアに広く使用されています。注意すべき主な特性は、メモリ管理の制御(ガベージコレクションなどの回避を可能にする)、シンプルで十分にデバッグされたコアランタイムライブラリ、および成熟したツールサポートです。今日使用されている組み込み開発ツールチェーンの多くは、これが現在の技術であった1980年代と1990年代に最初に開発され、当時流行していたUnix文化に由来するため、これらのツールはこの種の作業で人気がありますp>
エラーを回避するために、手動のメモリ管理コードを慎重にチェックする必要がありますが、ガーベッジコレクションに依存する言語では利用できないアプリケーションの応答時間。 href = "http://docs.hp.com/en/B2355-90694/crt0.3.html" rel = "noreferrer"> CおよびC ++言語のコアランタイムライブラリは比較的単純で、成熟しており、十分に理解されているため、利用可能な最も安定したプラットフォームの1つです。 Adaで使用される静的分析ツールのすべてではないにしても、ほとんどはCおよびC ++もサポートしており、多くの Cで利用可能な他のツール。 また 複数 広く 使用 C / C ++ ベース ツール チェーン; Adaに使用されるほとんどのツールチェーンには、CやC ++をサポートするバージョンもあります。
形式的手法の主な欠点は、証明されている基礎となるシステムに関して複雑さが指数関数的に増大する傾向があることです。これは、証明にエラーの重大なリスクがあることを意味するため、実際にはかなり単純なアプリケーションに限定されます。ハードウェアのバグは修正するのに非常に費用がかかるため、特に大衆市場の製品では、ハードウェアの正当性を検証するために正式な方法が非常に広く使用されています。 Pentium FDIVバグ以来、正式な方法が非常に注目され、 Pentium Pro以降のすべてのIntelプロセッサーでFPUの正確性を確認するために使用
信頼性の高いソフトウェアの開発には、他の多くの言語が使用されています。 このテーマについて多くの研究が行われています。 方法論はプラットフォームよりも重要であるが、 特定のプラットフォームの使用を除外する可能性がある、単純性および選択と依存関係の制御などの原則。
他のさまざまな人が指摘したように、特定のO / Sプラットフォームには、ウォッチドッグタイマーや保証された割り込み応答時間など、信頼性と予測可能な動作を促進する機能があります。 S
他のヒント
C ++については、Joint Strike Fighter(F-35)C ++ Coding Standardをお読みください:
Ada は、安全性が高く、 /またはミッションクリティカル。私はこの言語を使用したことはありませんが、エッフェルとともに「学ぶ」というリストに載っています。エッフェルはDesign By Contractを提供しています。これにより、信頼性と安全性が向上します。
まず、安全性が重要なソフトウェアは、従来の機械工学および電気工学の分野で見られるのと同じ原則に準拠しています。冗長性、フォールトトレランス、フェールセーフ。
余談ですが、前のポスターで示唆されたように(何らかの理由で反対票が投じられました)、これを達成できる最も重要な要素は、チームがすべてのことをしっかりと理解することです起こっている。言うまでもなく、あなたの側での優れたソフトウェア設計が重要です。しかし、それはまた、多くの共同知識と経験豊富な開発者が利用できる、アクセス可能で、成熟し、十分にサポートされている言語を意味します。
多くのポスターは、OSがこの点で重要な要素であると既にコメントしていますが、これは決定論的でなければならないため、最も真実です(QNXまたはVxWorksを参照)。これにより、バックグラウンドで処理を行うほとんどのインタープリター言語が除外されます。
ADAは可能性はありますが、より少ないツールとサポートが世の中にあり、さらに重要なことには、恒星の人々はそれほど容易に利用できません。
C ++は可能ですが、サブセットを厳密に実施する場合のみです。この点で、それは悪魔の道具であり、私たちの生活を楽にすることを約束しますが、しばしばやり過ぎです。
Cは理想的です。非常に成熟しており、高速で、さまざまなツールとサポートがあり、多くの経験豊富な開発者がクロスプラットフォームで非常に柔軟であり、ハードウェアの近くで動作します。
smalltalkからrubyまで、すべてを開発し、高等言語が提供しなければならないものすべてに感謝し、楽しんでいます。しかし、重要なシステム開発を行っているとき、私は弾丸をかみ、Cに固執します。私の経験(防衛および多くのクラスIIおよびIII医療機器)では、より少ないものです。
もしそれが他のものよりも安全であれば、私はhaskellを手に入れます。 haskellは、非常に厳密な静的型チェックを備えており、テストが非常に簡単な方法でパーツを構築するプログラミングを促進するため、haskellを提案します。
しかし、私は言語についてはあまり気にしません。プロジェクト全体を正常な状態に保ち、期限なしに作業することで、妥協することなく安全性を大幅に高めることができます。全体として、すべての基本的なプロジェクト管理が整っている。おそらく、すべてが正常に機能することを確認するための広範なテスト、すべてのコーナーケースをカバーするテストなどに集中するでしょう。
言語とOSは重要ですが、デザインも重要です。必要最小限のシンプルなものにしてください。
一貫性のない状態になる可能性を最小限に抑えるために、最小限の状態情報(ランタイムデータ)を取得することから始めます。次に、フォールトトレランスのために冗長性が必要な場合は、一貫性のないデータから確実に回復できる方法を用意してください。不整合から回復する方法がない冗長性は、単にトラブルを求めているだけです。
要求されたアクションが妥当な時間内に完了しない場合のフォールバックが常にあります。彼らが航空管制で言うように、未承認のクリアランスはクリアランスではありません。
ポーリング方法を恐れないでください。数サイクルを無駄にする場合でも、シンプルで信頼性があります。イベントや通知のみに依存する処理は避けてください。それらは簡単に削除、複製、または誤った順序で並べられる可能性があるためです。ポーリングの補助として、それらは問題ありません。
APOLLOプロジェクトの私の友人は、コンピューターがひどく遅いにもかかわらず、イベントではなくポーリングに頼ることを決めたときに深刻になっていることを知っていたことをかつて述べました。
PS C ++ Air Vehicleの標準を読んでいます。彼らは大丈夫ですが、多くのクラス、データ、ポインタ、および動的メモリ割り当てがあると想定しているようです。それはまさに、絶対に必要な以上のものではないはずです。大きな鎌のあるデータ構造が必要です。
OSは言語よりも重要です。 VxWorksやQNXなどのリアルタイムカーネルを使用します。産業用ロボットの制御について両方を検討し、VxWorksを使用することにしました。実際のロボット制御にはCを使用します。
航空機の自動着陸システムなどの真に重要なソフトウェアの場合、複数のプロセッサを独立して実行して結果をクロスチェックする必要があります。
プラットフォームを提供しないので、C / C ++と言わなければなりません。ほとんどのリアルタイムプラットフォームでは、とにかくオプションが比較的制限されています。
コードを安定させるためのツールの数と、プラットフォームのハードウェア機能へのコードの直接マッピングによって、Cが足を踏み入れる傾向があるという欠点は相殺されます。また、重要なものについては、広範にレビューされていないサードパーティのソフトウェアに依存することはできません-これにはほとんどのライブラリが含まれます-ハードウェアベンダーが提供するものの多くです。
すべてがあなたの責任であるため、安定したコンパイラ、予測可能な動作、およびハードウェアへの密接なマッピングが必要です。
ここで、まだ見たことのないいくつかのツールについての最新の更新を紹介します。最近更新したものはかなり良いものです。
LLVMコンパイラインフラストラクチャ、メインページの短い宣伝文句(CおよびC ++のフロントエンドを含む。フロント-Java、Scheme、およびその他の言語の開発は現在進行中です);
コンパイラインフラストラクチャ-LLVMはソースコードのコレクションでもあり、 言語を実装し、 コンパイル戦略。プライマリー LLVMインフラストラクチャのコンポーネント GCCベースのC& C ++フロントエンド、 リンク時最適化フレームワーク 成長するグローバルなセット 手続き間分析と 変換、静的バックエンド X86、X86-64、PowerPC 32/64、ARM、 Thumb、IA-64、Alpha、SPARC、MIPSおよび CellSPUアーキテクチャ、バックエンド ポータブルCコードを出力し、 X86、X86-64、Just-In-Timeコンパイラ、 PowerPC 32/64プロセッサー、および MSILのエミッタ。
VCC ;
VCCは正確性を証明するツールです 注釈付きの並行Cプログラムまたは それらの問題を見つけます。 VCCはCを拡張します 次のような契約による設計機能 事前および事後条件とタイプ 不変量。注釈付きプログラムは を使用して論理式に変換 に渡すBoogieツール チェックする自動化されたSMTソルバーZ3 それらの有効性。
VCCは、最近リリースされた Common Compiler Infrastructure を使用します。
これらのツールの両方、LLVMまたはVCCは、複数の言語とアーキテクチャをサポートするように設計されています。これらは、契約およびその他の正式な検証慣行によるコーディングの増加だと思います。
WPF (MSフレームワークではありません:)は、プログラム検証スペースでの最近の研究とツールのいくつかを評価します。
WG23 は主要なリソースですが、かなり最新の特定の重要なシステム開発言語の詳細については。それらは、Ada、C、C ++、Java、C#、スクリプティングなどのすべてをカバーし、少なくとも言語固有の欠陥と脆弱性に関する情報を更新するための指示とガイダンスのまともなセットを持っています。
http://www.dwheeler.com (" high-保証ソフトウェア")。
自動車関連のものについては、MISRA C標準を参照してください。 C。ただし、2レベル以上のポインター、およびそのような他のものを使用することはできません。
adahome.comにはAdaに関する良い情報があります。私はこのC ++ to Adaチュートリアルが好きでした: http://adahome.com/Ammo/cpp2ada.html
ハードリアルタイムの場合、Tom Hawkinsは興味深いHaskellの処理を行いました。参照:ImProve(言語には検証条件をチェックするためのSMTソルバーが組み込まれています)およびAtom(実際のスレッドまたはタスクを使用しないハードリアルタイム同時プログラミング用のEDSL)。
注意深いパターンを課す言語は役立つかもしれませんが、任意の言語、さらにはアセンブラーを使用して注意深いパターンを課すことができます。すべての値に関するすべての仮定には、その仮定をテストするコードが必要です。たとえば、除算する前に常に除数をゼロでテストします。
再利用可能なコンポーネントを信頼できるほど、タスクは簡単になりますが、再利用可能なコンポーネントは重要な使用について認定されることはほとんどなく、規制上の安全プロセスを通過できません。小さなOSカーネルを使用してから、ランダム入力で単体テストされる小さなモジュールを構築する必要があります。エッフェルのような言語が役立つかもしれませんが、特効薬はありません。
どのソフトウェア製品でも、任意のツールを使用してDO-178b認定プロセスに合格できますが、質問はそれがどれほど難しいかです。コンパイラが認定されていない場合、コードがアセンブリレベルで追跡可能であることを示す必要があります。そのため、コンパイラが認定されていると役立ちます。私たちはプロジェクトでCを使用しましたが、アセンブリレベルで検証し、オプティマイザーをオフにする、スタックの使用を制限する、割り込みの使用を制限する、透過的な認証可能ライブラリなどを含むコード標準を使用する必要がありました。 PSAC計画はより達成可能に見えます。
アプリケーションが大きくなると、アセンブリコードの選択肢が少なくなります。 ARMプロセッサはC ++を招待するだけですが、キールのような企業にツールの認定を依頼すると、「ハァッ」と返されます。また、検証ツールも認定される必要があることを忘れないでください。 LabViewテストプログラムを検証してみてください。
新しい Javaのセーフティクリティカル標準が現在開発中です- JSR 302:セーフティクリティカルなJavaテクノロジー。
Safety-Critical Java (SCJ)は、RTSJのサブセットに基づいています。目標は、セーフティクリティカルな認証(DO-178B、レベルA、およびその他のセーフティクリティカルな規格)のためのセーフティクリティカルプログラムの開発と分析に適したフレームワークを持つことです。
たとえば、SCJはRTSJに存在するヒープを削除し、アプリケーションとVM実装の両方が準拠できる3つのコンプライアンスレベルを定義します。コンプライアンスレベルは、さまざまな複雑なアプリケーションの認証を容易にするために定義されます。リソース:
使用する言語はわかりませんが、使用しない言語はわかります:
Javaサポートに関する注意。ソフトウェア製品には、JAVAで作成されたプログラムのサポートが含まれている場合があります。 JAVAテクノロジーはフォールトトレラントではなく、核施設、システム、航空機、航空機、航空機、航空機、航空機、航空機、航空機、交通管制、直接生命維持装置、または武器システム。これは、JAVAテクノロジーの障害が、死、人身傷害、または重度の身体的または環境的損害に直接つながる可能性があります。
HAL / Sはスペースシャトルに使用されます。