機能安全のための静的解析(MISRA/CERT)と動的解析
C-STAT静的解析とC-RUN動的解析は、IAR Embedded Workbench for Renesas RXおよびIAR Embedded Workbench for Armの機能安全版のアドオンツールを使用して実行できます。本稿では、機能安全向けアプリケーションの開発時にコード解析ツールの使用が推奨される理由について解説します。
機能安全規格とコードの静的解析/動的解析
IEC 61508第2版の第3部では、安全関連システムのソフトウェア要求事項を規定して良好な開発プロセスを使用することを求めています。その一例として、第7部技術および手法の概観のセクションC.4.2では、言語サブセットの使用について、次のように記載しています。
目的:プログラミングによってバグが作り込まれる確率を下げ、残留するバグを検出する確率を高める。
説明:例えば、静的解析を用いて、エラーを起こしやすい、または解析することが困難なプログラミング構成要素を見つけ出すために、言語を調査する。その後、これらの構成要素を排除した言語のサブセットを定義する。
同セクションでは、安全度水準(SIL)1を超える場合、Cをこの制限のないプログラミング言語として使用することを推奨しないことも明言しています。つまり、C/C++ソフトウェアを用いてSILが2~4の認証を受けるシステムを開発する場合は、基本的に静的解析ツールが必要となります。
同様に動的解析についても、第7部技術および手法の概観のセクションB.6.5動的解析およびテストで次のように記載しています。
目的:完成度の進んだ状態におけるプロトタイプの動的挙動を検査することによって、仕様の欠陥を検出する。
説明:安全関連システムの動的解析は、実際の運用環境で想定する典型的な入力データを、運用可能な状態に近いシステムのプロトタイプに用いることによって実施する。システムにおいて観察した挙動が、要求する挙動に適合する場合、解析は満足できるものといえる。システムに欠陥がある場合、修正して、その後、新しい運用バージョンを再解析する必要がある。
C-RUNがこの要求事項をどのように満たすのかを以降で示します。
ツール
C-RUNは、コンパイラやC-SPYデバッガに組込まれているツールです。C-RUNを使用することで、実行中のコードを観察し、実際に起こった違反をレポートできます。C-RUNでは算術演算、境界、ヒープのチェックが可能で、IAR Embedded Workbenchのプロジェクト設定によって容易に構成できます。
動的解析ツールの一般的な特徴として、偽陽性率の低さが挙げられます。C-RUNもその例外ではありません。つまり、C-RUNでレポートされたバグは、実際のコードが実際のターゲットシステムで実行され解析された場合、高い確率でバグとなります。C-RUNではアプリケーションの状態をすべてチェックすることが可能で、実際に発生したバグをレポートします。なお、下図に示すように、C-SPYの該当する[メッセージルール]を設定することで、実行中に検出されたエラーを無視することも可能です。
一方、動的解析には短所もいくつかあります。まず、この方法で問題が見つかるのが、通常、ソフトウェア開発の終盤になってしまうことです。この解析ツールでは、まず実行可能なコードを実行することが必要となり、そのうえ、解析の対象となるのが、アプリケーションのうち実際に実行された部分のみです。つまり、コードの全てのカバレッジに必要な条件を作りテストできなければ、一部のコードはテストされずに残ります。それでもC-RUNから得られるフィードバックは極めて有用であり、IAR Embedded Workbenchに統合されているC-RUNは、非常に使いやすいツールであると言えます。
次に、静的解析ツールC-STATについて説明します。このツールは、特定のコーディングルールからの逸脱を、そのルールに対して少なくとも1つのチェックを行うことで検出します。C-STATは、MISRA C:2012、MISRA C++:2008、MISRA C:2004で定義されたルールへの準拠をチェックするとともに、CWEおよびCERT C/C++が扱う問題に対して約250のチェック項目について確認を行います。C-RUNと同様に、C-STATもIAR Embedded Workbenchのプロジェクト設定によって容易に構成できます。
C-RUNと異なり、C-STATは実際にコードを実行することなくコードに欠陥があるかどうかをチェックします。したがって、プログラム中の実行パスや使用するデータとは関係なくエラーを検出することが可能です。C-STATを使えば、ソフトウェア開発の初期段階で(実際のところ初日からでも)バグや欠陥を特定でき、これによりシステムの性能に影響を与えることもありません。
C/C++開発者向けに、独立系の静的解析ツールがいくつか市販されていますが、C-STATは、面倒な設定を行わずにすぐに使用可能で、当然のことながら効率的な組込みプログラミング用に調整された、IAR独自のC/C++言語構造のすべてに対応します。このような利点を持つC-STATを日常業務の一環として使用することで、重要なルールのほとんどについて違反コードを容易にチェックできます。これにより、その後の開発段階でのテストやデバッグの時間やリソースを節約できます。
C-STATは、IAR Embedded Workbenchに統合されており、通常のビルドツールとして簡単に使用できます。
検出されたエラーについては、オンラインヘルプシステムに説明があり、F1キーを押すと、ルールの説明とルールに従った正しいコード例が表示されます。
HTML形式でレポートを作成し、テスト結果を記録することも可能です。
まとめ
本稿の最初のセクションで述べた機能安全の規格に戻り、これらのツールが、定義された基準をどのように満たすのかをおさらいします。
第7部技術および手法の概観のセクションC.4.2では、言語サブセットの使用について次のように記載しています。例えば、静的解析を用いて、エラーを起こしやすい、又は解析することが困難なプログラミング構成要素を見つけ出すために、言語を調査する。その後、これらの構成要素を排除した言語のサブセットを定義する。
上記の点においては、MISRAで定義されたルールへの準拠をチェックするC-STATは、まさに最適なツールと言えます。また上述のように、C/C++ソフトウェアを用いてSILが2~4の認証を受けるシステムを開発する場合には、静的解析ツールが必要となります。
また、セクションB.6.5動的解析およびテストには、次のように記載されています。安全関連システムの動的解析は、実際の運用環境で想定する典型的な入力データを、運用可能な状態に近いシステムのプロトタイプに用いることによって実施する。システムにおいて観察した挙動が、要求する挙動に適合する場合、解析は満足できるものといえる。システムに欠陥がある場合、修正して、その後、新しい運用バージョンを再解析する必要がある。C-RUNを使ったとしても、システム全体の動的挙動をすべてチェックすることは不可能ですが、少なくともソフトウェアの一部で発生する実際のエラーや起こり得るエラーを検出するためには、C-RUNは非常に優れたツールです。安全の概念は、ソフトウェアのような1つの要素の故障率だけでなく、システムの危険な故障率に関連すべきものと認識することが重要です。
2つの異なるタイプのコード品質ツールである動的解析用C-RUNと静的解析用C-STATは、機能安全に関するソフトウェア開発において極めて有用で、決して競合するものではありません。静的解析は動的解析が苦手とする領域で強みを発揮し、動的解析は静的解析が苦手とする領域で強みを発揮します。C-RUNとC-STATはまさに相補的な技術を採用しており、日常の開発ワークフローの一環として使用できるように設計されています。