問題タブ [safety-critical]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - セーフティ クリティカル システムのカプセル化
通常、セーフティ クリティカルシステムはカプセル化を利用しますか? 人工衛星、ジェット戦闘機、潜水艦、または旅客機用にAdaまたはCで実装された組み込みシステムを考えてみましょう。
カプセル化の概念は、ソフトウェア自体ではなく、ソフトウェアの開発と保守のプロセスを支援するためにあるので、質問を受けました。メモリ内に直接アクセスするのではなく、アクセサーを介してデータにアクセスするためのオーバーヘッドが少し増えるため、このような安全性が重要なアプリケーションがカプセル化のような抽象化レイヤーを実装することが許容されるかどうか疑問に思っています.
また、たとえば旅客機に電力を供給するコードが大量にあると想定しているため、それらの概念を搭載したくない場合、ソフトウェア開発はある時点で手に負えなくなる可能性があります.
PS質問がトピックから外れている場合は、コメントまたは編集して自由に記入してください。これは私にとって本当の質問であり、同様のアプリケーションに既に取り組んでいる人々から回答を得たいと思っています.
PPS 混乱を避けるために、最近のバージョンのAdaには OOP 機能があり、カプセル化はCでも簡単に実現できます。
c++ - 安全性が重要なソフトウェアのための C++ のフォーマル メソッド
Cを見ると、Cはコード内で使用できる正式なメソッド(frama-c、VCC、verifast)を適切にサポートしています。私が知る限り、C++には匹敵するものはないようです。
C++ で書かれたセーフティ クリティカルなソフトウェアを推論するために利用できる形式的な方法は何ですか?
java - dll を変更せずに JNA 呼び出しのリソース使用率を制限する
JNA メソッド呼び出しが CPU 使用率、スレッド数、およびメモリ制限のしきい値を超えないようにするにはどうすればよいでしょうか?
バックグラウンド:
私はセーフティ クリティカルなアプリケーションに取り組んでいますが、セーフティ クリティカルではない機能の 1 つは、C で記述されたライブラリを使用する必要があります。 Java インターフェイス ファイル以外のソース コードへのアクセス。JNA コードで使用される CPU 使用率、スレッド数、およびメモリを制限する方法はありますか?
c - エラーが発生した場合に特定の状態に安全に終了する
コードを書くとき、エラーが発生したかどうかをチェックすることがよくあります。例は次のとおりです。
私もstrerror( errno )
過去に利用したことがあります。
exit()
私は、エラーが発生した場合にプログラムが ed であるかどうかが問題にならない小さなデスクトップ アプリケーションしか作成したことがありません。
しかし、今は組み込みシステム (Arduino) 用の C コードを書いていますが、エラーが発生した場合にシステムを終了させたくありません。システムの電源を落とし、エラー レポートを送信し、安全にアイドル状態にできる特定の状態/機能に移行したいと考えています。
単純に関数を呼び出すことerror_handler()
もできますが、スタックが深くなり、メモリが非常に少なくなり、error_handler()
操作不能になる可能性があります。
代わりに、スタックを効果的に折りたたんで大量のメモリを解放し、電源の切断とエラー報告の整理を開始するように実行したいと考えています。システムの電源を安全に落とさないと、深刻な火災の危険があります。
低メモリの組み込みシステムで安全なエラー処理を実装する標準的な方法はありますか?
編集 1:malloc()
組み込みシステムでの使用を制限します。この特定のケースでは、ファイルの形式が正しくないと、ファイルの読み取り時にエラーが発生します。
c - ステート マシン設計のための関数ポインター アプローチを使用した 3 人中 2 人の投票
2oo3 投票を実装する必要がある安全システムに取り組んでいます。関数ポインターを使用してステートマシンを使用してこれを実装するというアイデアを大まかに持っています。AB・Cの3系統があるとします。 Aに対してはCが左系統、Bが右系統 Bに対してはAが左系統、Cが右系統 Cに対してはBが左系統、Cが右系統システム
システムが行う決定ごとに、関数ポインタが「左側のシステムとのデータ交換」関数を指すようにします。データが Left システムに送信された後、それはダミー関数を指し、Left システムが応答するのを待ちます。
左システムが応答し、その決定 (左システム) もシステム (私のシステム) の決定と一致した場合、次の状態に進みます。同意しない場合は、「正しいシステムとデータを交換する」と同じことを繰り返して続行します。
ここでの私の疑問は、状態遷移制御にフラグを使用して実装したくないためです。関数ポインターを使用した実装は、MISRA 2004 以降、関数ポインターを使用しないとはどこにも言いませんか??
上記の 2oo3 実装へのアプローチは問題ありませんか、それとも他に注意すべき点がありますか?
2oo3アーキテクチャを実装するための他のアプローチはありますか(各システムによって行われた決定のための外部コンパレータはありません。つまり、各uCは決定自体を形成し、その決定を他のuCと相談する必要があります。 (例: 共有メモリ、fpga ベースのコンパレータなど) 他の 2 つのシステムによるアクセスと比較用)??
間違った方法でアプローチした場合は、ご容赦ください。私はこれに初心者です。
(注:3つのシステムにはマイクロコントローラのみがあります)
更新: ここに @Lundin によっていくつかの便利なポイントが追加されました -関数ポインターのないステート マシンの設計
c - 関数ポインターのないステート マシン
安全 SIL 4 システムの多数の状態遷移を持つ複雑なステート マシンを実装しました。この実装のバックボーンは、関数ポインターを使用して行われました。すべてが順調に進んでいたとき、V&V は SIL 4 システムでの関数ポインターの使用に反対しました。参照-ルール 9 NASA .Misra C 2004 では、関数ポインタを使用できないとは述べていません。
関数ポインターを使用せずに複雑なステート マシンを実装する他の方法はありますか?
embedded - CAN アクセプタンス フィルタリング
CAN ネットワーク内のすべてのノードが、受け入れフィルターを使用して、それらのノードのみに宛てられたパケットを受信するように構成されているとします。例: ノード A は、11 ビット ID フィールド内の「A」のみにアドレス指定されたパケットを受信するように構成されています。
シナリオ: 4 つのノード A、B、C、D がある場合。
クエスト 1: A がパケットを E (有効な ID ではない) に宛てた場合。ノード A の ACK フラグは、メッセージがノードによって確認されたことを示すように設定されますか? つまり、メッセージがアクセプタンス フィルタによって受け入れられない場合、メッセージが受信されたかどうかが送信者に知られてしまいます。
クエスト 2 (クエスト 1 に依存): A がパケットを D (有効な ID) にアドレス指定する場合。メッセージの確認応答は、D だけがメッセージを正常に受信したことを示していますか? それとも、アクセプタンス フィルターが特定の ID のみを受信するように構成されていても、すべてのノードがメッセージを受信したということですか?
私を許してください、私はここで少し混乱しています:)
stack - スタック上の実行可能な Ada コード
昨年の 32C3で、鉄道システムのセキュリティに関する考慮事項に関する講演を見たところです。25分で、スピーカーはエイダについて簡単に話します。具体的には次のように述べています。
典型的な Ada の実装には、「(tramp/trunk/?) 行」と呼ばれるメカニズムがあります。つまり、スタック上でコードを実行することになり、C プログラムにはあまり適していません。[...] Ada コードを C ライブラリにリンクする場合、セキュリティ メカニズムの 1 つが機能しません。
トークの各部分へのリンク (YouTube) を次に示します。これは背景のスライドです。ご覧のとおり、私は単語の 1 つについて確信が持てません。もしかしてトランポリン?
ここで私の率直な質問: この声明には真実がありますか? そうだとすれば、Ada 言語のこの不思議な機能と、それが明らかに影響を与えているセキュリティ メカニズムについて詳しく説明できる人はいますか?
これまで、コードはコード セグメント(別名「テキスト」) に存在し、データ (スタックを含む) は別のメモリ位置にあるデータ セグメントに配置されると常に想定していました (この図に示されているように)。そして、Ada のメモリ管理について読むと、そこではそれほど変わらないはずです。
このようなレイアウトを回避する方法はありますが (たとえば、この「C on stack」の質問とこの「C on heap 」の回答を参照してください)、スタックが明示的に実行可能にされない限り、最近の OS は通常、実行可能スペースの保護によってそのような試みを防ぐと思います。- ただし、組み込みシステムの場合、コードが ROM に保存されていない場合は、依然として問題になる可能性があります (誰か明確にできますか?)。
ada - 事前定義された実数型を使用しませんか?
私はADA Distilledを読んで Ada 言語を学び始めています。3.8章では、次のように述べています。
Ada プログラマーは、事前定義された実数型を安全性が重要な製品品質のソフトウェアに使用することはありません。
これが実際に何を意味するのか、定義済みの実際の型を使用する代わりに何をすべきなのか疑問に思っていました。これは、整数を使用できないということですか?