組み込みCコードの信頼性を向上させるために使用できるツールまたは標準は何ですか?


9

私は通常、PICをCでプログラムします。通常、スイッチモードコンバーター用です。コードの信頼性を向上させるために使用できるMISRA Cなどのさまざまな静的分析ツールや標準について聞いたことがあります。もっと知りたいのですが。私のコンテキストに適した標準またはツールは何ですか?


1
C言語にどの程度慣れていますか?
ブライアンドラモンド2014年

1
私はそれのために作られるべき非常に良いケースがあったならば、私は何か他のものに切り替えるように説得されるかもしれません。しかし、それは非常に良いケースでなければなりません。
Stephen Collings 14年

Cから切り替えるための「非常に良いケース」は迅速に作成することはできません。AVR、ARM、またはMSP430の場合、Adaは真剣に検討する価値があります(ご覧のように、それが引き付ける否定性にもかかわらず)!そして高いrelの場合、SPARKは一見の価値があります。
ブライアンドラモンド2014年

これらは、背景情報として興味深いかもしれません:SPARK vs MISRA-Cspark-2014.org/entries/detail/…そして、この進行中のケーススタディ:spark-2014.org/uploads/Nosegearpaper_1.pdf
Brian Drummond

PICから現代的なものに切り替えるためのケースを作るために投資したほうがいいかもしれません...特にMISRAとSPARKが本来意図していた種類のミッションクリティカルなシステムを設計している場合はなおさらです。
ランディン2014年

回答:


11

埋め込まれたコードの検証は、特にPICのような限られたリソースのパーツを扱う場合には注意が必要です。パーツのメモリ上の制約と、これらの種類のデバイスで行われることが多い「リアルタイム」プログラミングのために、テストケースでのコーディングの贅沢はしばしばありません。

ここに私のガイドラインのいくつかがあります:

  1. 仕様がない場合は仕様を記述します。仕様に対してコーディングを行わない場合は、コードの想定内容、有効な入力、期待される出力、各ルーチンにかかる時間、取得できるものと取得できないものを文書化します。破滅など-動作理論、フローチャート、何でもないよりはましです。

  2. コードにコメントを付ける何かがあなたに明らかであるからといって、それが他の誰かに明らか(または正しい)であるとは限りません。わかりやすいコメントは、レビューとコードの保守性の両方に必要です。

  3. 防御的にコーディングする通常の入力用のコードだけを含めないでください。欠落している入力、範囲外の入力、数学的オーバーフローなどを処理します。コード設計でカバーするコーナーが多いほど、デプロイ時にコードが持つ自由度が少なくなります。

  4. 静的分析ツールを使用する: PC lintのようなバグツールがコード内で見つけることができるバグの数は、非常に多くあります。真剣なテストの出発点として、クリーンな静的分析の実行を検討してください。

  5. ピアレビューは不可欠です。コードは、独立した当事者が効率的にレビューできるように、簡潔で十分に文書化されている必要があります。ドアでエゴをチェックし、批判や提案を真剣に検討してください。

  6. テストは不可欠です。独自の検証を行うとともに、コードの独立した検証を行う必要があります。他の人は、想像もできない方法でコードを壊す可能性があります。考えられるすべての有効な条件とすべての無効な条件をテストします。PRNGを使用してごみデータをフィードします。物事を壊すためにできることは何でもしてから、修復してやり直してください。運が良ければ、コードをデバッグモードで実行し、レジスターや変数をのぞくことができます。そうでない場合は、巧妙でLED /デジタル信号を切り替えて、状態を把握する必要があります。端末。必要なフィードバックを得るために必要なことは何でもしてください。

  7. 中身を見てください。Cコンパイラによって生成されたマシンコードを確認してください。あなたは、美しいCコードが数百回ではなくても数十回の操作に爆破された場所を見つけるかもしれません(それは安全であるはずのもの(それはコードの1行だけなので)?)がその複数の割り込みを実行するのにとても時間がかかります条件が発生して無効になりました。何かがひどく非効率になった場合は、それをリファクタリングして再試行してください。


+1すべての音声アドバイス。私はこれを読むとき、どんなプロのファームウェア開発者もただ笑ってうなずくことを期待します。
ランディン2014年

2
ピアレビューの重要な側面は、レビューがプログラマではなくコードに関することです。「最初にこれを実行し、次にそれを実行する」などの用語でコードを分析すると、おそらく問題が発生します。「最初にコードがこれを実行し、次にそれを実行します」は、それについて考える正しい方法です。同じことがレビュアーにも当てはまります。「なぜこれを行ったのですか?」ではなく、「なぜコードはこれを行ったのですか?」です。
ピートベッカー

次の追加も検討できます。1.循環的複雑度チェックの使用2.バージョン管理ソフトウェア
AlphaGoku

4

PCで信頼性の高いソフトウェアを作成するための同じ手法のほとんどは、組み込み開発にも適用できます。アルゴリズムをハードウェア固有のコードから分離し、単体テスト、シミュレーション、静的分析、およびValgrindなどのツールを使用して、それらを個別にテストすると役立ちます。そうすれば、ハードウェア上でのみテストされるコードがはるかに少なくなります。

私はCを放棄しません。Adaのような言語はいくつかの小さな保証を提供できますが、言語が実際よりも約束していると考える罠に陥るのは簡単です。


Valgridは、8ビットMCUよりもPCに少し関連しているかもしれませんが、:)
Lundin 2014年

残念ながら優れたPCレベルのソフトウェアを作成するためのいくつかのテクニックは、小さなマイクロにはあまり適していません。また、PCランドでの不正解と見なされている一部のプラクティスは、組み込み環境では完全に受け入れられます。
John U

3

MISRA-Cは、一般的なコードの品質を向上させ、バグを最小限に抑えるのに非常に役立ちます。すべてのルールを読んで理解していることを確認してください。ほとんどのルールは適切ですが、一部のルールでは意味がありません。

ここで警告。MISRA文書は、読者がC言語の広範な知識を持つ人物であることを前提としています。チームにそのような強化されたCのベテランがいないが、静的アナライザーを取得し、与えられたすべての警告を盲目的に追跡する場合、可読性が低下し、誤ってバグが発生する可能性があるため、コードの品質が低下する可能性があります。コードがMISRAコンプライアンスに変換されるのは簡単なことではありません。

適用される可能性のあるMISRA-Cドキュメントには2つのバージョンがあります。MISRA-C:2004のいずれか。これは現在も組み込み業界の事実上の標準です。または、C99標準をサポートする新しいMISRA-C:2012。これまでにMISRA-Cを使用したことがない場合は、後者を実装することをお勧めします。

ただし、ツールベンダーは通常、MISRAチェックがあると言うときはMISRA-C:2004を参照していることに注意してください(古いMISRA-C:1998バージョンを参照していることもあります)。私の知る限り、MISRA-C:2012のツールサポートはまだ制限されています。Klocwork、LDRA、PRQA、Polyspaceなど、これまでに実装された静的アナライザーは一部だけだと思います。もっと多いかもしれませんが、それがサポートしているMISRAのバージョンを確認する必要があります。

決定する前に、もちろんMISRAドキュメントを読んで、それが何を伴うかを確認することから始めます。それは、misra.orgから£10で購入でき、ISO規格の価格に比べてかなり手頃です。


1

Mathworks(MATLABの人々)には、Polyspaceと呼ばれる静的コード分析ツールがあります。

静的コード分析やlintなどと同様に、インターフェイスの慎重な定義と設計(正式なレビュープロセスを使用)およびコードカバレッジ分析を提案します。

また、MISRAだけでなく、UL1998やIEC 61508規格など、安全性が重要なコード設計のガイドラインも確認することをお勧めします。


必要がない限り、IEC 61508に近づくことはお勧めしません。それはソフトウェアに言及していますが、その主張のための現代的な科学的情報源を欠いています。その標準は30年遅れて登場しました。70年代にリリースされた、いわゆる「ソース」のほとんどと同様に、それは有用だったかもしれません。
ランディン2014年

1

この質問に対する完全な回答として、コードは設計の最終的な表現にすぎないため、「コードの信頼性」についての考えを抑制し、代わりに「設計の信頼性」について考えます。

したがって、要件から始めて、それらを記述して検査します。要件ドキュメントがない場合は、ランダムなコード行をポイントして、「なぜその行が必要なのか」と自問してください。「入力が12〜36 VDCの場合、電源は5 VDCを出力する」のように単純で明白でも、コード行の必要性は最終的に要件にたどることができます。これについて考える1つの方法は、そのコード行を要件までたどることができない場合、どのようにしてそれが適切なコードであるか、またはそれがまったく必要であるかを知ることです。

次に、設計を確認します。コード内に完全に含まれている場合(たとえば、コメント内)でも問題ありませんが、コードが実際に意図されていることを実行しているかどうかを知るのが難しくなります。例えば、読み込みラインを有していてもよく、コードはoutput = 3 * setpoint / (4 - (current * 5)); ですcurrent == 4/5クラッシュを引き起こす可能性があり、有効な入力は?この場合、ゼロによる除算を防ぐために何をすべきですか?操作を完全に回避するか、代わりに出力を低下させますか?このようなエッジケースの処理方法に関する一般的なメモをデザインドキュメントに含めると、より高いレベルでデザインを検証することがはるかに簡単になります。したがって、コードがその設計を正しく実装しているかどうかを確認するだけなので、コード検査が簡単になります。

それに加えて、コードインスペクションでは、IDEがキャッチしない一般的なエラーをチェックする必要があります(IDEを使用していますよね?)。 'ステートメント、それらがあるべきではないセミコロンなど

これを書いていると、何年にもわたるソフトウェア品質のトレーニング/経験を1つの投稿にまとめることが非常に難しいことに気づきました。私は医療機器のコードを書いており、上記は私たちがそれに取り組む方法の非常に簡略化された要約です。


私の理解では、医療機器のコード部分は、まるで別の機器であるかのようにテストされています。それは正確ですか?
Scott Seidman、2014年

@ScottSeidmanおそらく、この回答で述べたように、要件に基づいてテストされます。要件ごとにコードモジュールが必要であり、そのようなコードモジュールごとにテストが必要です。したがって基本的に、各要件には対応するテストがあり、コードは要件を満たすための手段です。この種の要件トレースは、「TDD」という流行語が出現するずっと前から、ミッションクリティカルなシステムで一般的に行われています。
ランディン2014年

私は特に、FDAガイダンス(fda.gov/downloads/RegulatoryInformation/Guidances/ucm126955.pdfなど)を参照していましたが、 実際には、計画段階と設計管理から始めて、ソフトウェアが医療機器の一部である場合、ソフトウェアが必要とする以上のものが必要です。
Scott Seidman、2014年

スコット、私はそのように考えたことがありませんが、あなたは正しいです。ソフトウェア品質保証担当者は、システムの検証と検証を担当する別のグループにソフトウェアを引き渡す前に、システムの他の部分とは(可能な限り)個別にソフトウェアを検証します。
リンドン2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.