迅速な機能安全認証取得に肝心なコード品質

 

機能安全チェックリストを完成させるために必要なすべてのプロセスとテストを行うことは、これまで非常に困難なプロセスでしたが、迅速に認証を取得する方法があります。

認証取得を迅速化するために開発プロセスにできる微調整は多くありますが、すべてはコード品質から始まります。 コード品質をできるだけ簡単にアップグレードして、機能安全認証を取得する方法をご紹介します。

標準規格から助けを得る

C99では、コード仕様に約190のあいまいさが存在することをご存知でしょうか?言い換えると、C99には、C言語の仕様に記載されていない、構文上正当な異なるC構文が190あるということです。 C18になると、さらに少し悪化します。C++では、多重継承と仮想継承の概念が導入されるようになります。もちろん、コンパイラはソースを具体的なコードに変換する必要があるため、コードの意味の解釈を選択して実行する必要があります。

これが意味することは、ソースコードを異なる方法で解釈するさまざまなコンパイラを入手する可能性があるということです。高信頼性システムでは、これは悪夢のようなシナリオです。特に、機能安全認証を取得しようとしている多くの企業は、テストを容易にするために複数のプラットフォームでコードをクロスコンパイルしているためです。想像できると思いますが、コードの再現性と信頼性を証明するためにこれらすべての状況をテストする必要があるため、これは認証取得にかかる時間に非常に悪い影響を与える可能性があります。では、どうやってこれを乗り切るのでしょうか? 端的に言えば、コードでこれらのあいまいさを回避することです。しかし、どうすればよいでしょうか。 MISRAのようなコーディング標準を使用すると、問題をすばやく解決できます。なぜなら、それらは、コードでのこれらのタイプの一般的な落とし穴からユーザーを守るように設計されているためです。また、安全で信頼性の高いコーディング手法を促進して、コードの欠陥の数を減らします。しかし、どうすればこれらの基準を確実に遵守できるでしょうか?幸い、機能安全規格はこれを実現する方法を提供します。

標準規格はコード解析を必要とする

事実上すべての機能安全規格では、コードの静的解析を行う必要があり、コードのランタイム(または動的)解析を行うことを強く推奨しています。これらの規格の中で最も広範囲に及ぶものは、一般に安全関連システムを対象とするIEC 61508です。その規格のセクションC.4.2では、あいまいで危険な動作を取り除くコーディング標準なしでCを使用することは、安全度レベル(SIL)1を超える場合には推奨されません。つまり、製品のSIL 2-4認証を取得しようとする場合、静的解析を使用してコードをより堅牢にする必要があります。これらの静的解析ツールは、開発者にMISRAのようなコーディング標準を実装することを強います。さらに、静的およびランタイム解析は、特に前述のコーディング標準のあいまいさにより、危険なコーディング動作に陥っていることをすばやく指摘することにより、コード品質を向上させるのに役立ちます。

ただし、これらのタイプの自動化ツールを使用すると、認証のタイムラインに大きな影響を与える可能性があります。多くの組織では、設定が難しく、使用が難しいコード解析ツールを使用しています。これらはナイトリービルドの一部としてビルドサーバーでの実行に委ねられています。個々の開発者が、自分が書いたばかりのコードの何が問題なのかについての瞬時のフィードバックを得ていないので、それは実際にはそれほど役に立ちません。さらに、これらのツールからの警告メッセージは不可解であり、開発者がそれらの意味を理解して、警告を消すためにどのようにコードを修正するかを理解しようとすることに時間を浪費する場合があります。開発中にコード解析を実行でき、それを正式なビルドにチェックインする前に実行できる場合は、欠陥が発生することはなかったかのようになります。プロジェクトにおける欠陥注入率は低くなり、これは非常に成熟した開発組織であることを意味するため、認証エンティティが好むプロジェクトとなります。

コード分​​析を毎日のワークフローの一部にする

私たちは様々な業界の多くの企業に会いましたが、コード解析ツールの設定と使用が容易になればなるほど、開発者はそれらを使用する可能性が高くなり、その結果、より早く利益を得ることができます。 開発者のツールボックスの一部としてこれらの自動化ツールを使用することは、アプリケーションを作成するときに(コードのそのセクションが何をするつもりなのか、それがシステム内の他のモジュールとどのように相互作用するのかを理解する「ゾーン」にいる間に)コードの品質を確認および改善できることを意味します。 これを効果的に行うには、ツールを毎日のワークフローに統合される必要があります。

統合されたコード解析に関して言われていることを調べたところ、コード解析のメリットを考察しているACMの出版物にGoogleが 記事 を公開していることを見つけました。 この記事では、C、C ++、Javaを含むコードベース全体を取り上げていますが、結論は非常に明確です:

“ コンパイラエラーは開発プロセスの早い段階で表示され、開発者のワークフローに組み入れられます。 コンパイラチェックのセットを拡張することは、Googleでのコード品質の向上に効果的であることがわかりました。” 

著者は、静的解析チェックをコンパイラワークフローに移動させ、エラーとして表示するようにしたことで、ツールの調査結果への注目度を大幅に改善し、最終的にはコードの品質が大幅に向上したと述べています。 さらに、コンパイラエラーに遭遇した開発者と、同じ問題を修正したパッチを受け取った開発者に送信されたアンケート結果についても論じています:

"Googleの開発者は、コンパイル時にフラグが付けられた問題は(チェックインコードのパッチと比べ)より重要なバグを捕らえていると感じています。たとえば、アンケートの参加者は、コンパイル時にフラグが付けられた問題の74%を「実際の問題」とみなしていますが、チェックインコードで見つかった問題では21%です。

この記事では、静的解析ツールを使ってコミットを自動的に実行し、エンジニアに分析ダッシュボードを見るように招待したときに、フォローするエンジニアは非常に少ないとして、コード解析をワークフローの一部とすることの重要性について述べています。 コンパイルプロセスで即座にフィードバックが得られると、静的分析が使いやすくなり、無視できないものになります。 そのため、彼らは静的解析をデフォルトで全員のワークフローに組み込むことにしました。 彼らは、コード解析ツールが成功するためには、開発者がツールの使用から利益を得て、ツールの使用を楽しむ楽しむことができると感じなければならないと考えています。

しかし、コード解析をワークフローに追加することで、どのような結果が期待できるでしょうか?この記事で説明したように、高いコード品質を持つことで、バッファオーバーフローや不正なポインタなどの悪用を排除することができるので、アプリケーションの全体的なセキュリティが向上することが期待できます。これ自体は、コード解析を使用する大きな理由ですが、「予防は治療に値する」という格言を人々に納得してもらうのは難しいこともありますし、コード解析のメリットを開発者や管理者に納得してもらうためには、より大きな結果が必要です。

Stefan Wagner氏らの論文 では、さまざまなコードベースについて、従来のテストに対するコード解析ツールの利点を計算するために、経験的なデータを使用しました。彼らの結果は非常に興味深いものでした:769の特定された欠陥のうち、76%がコード解析ツールによって検出され、従来のテストでは4%のみが検出されました(残りの20%はコードレビューによって検出されました)。テストを開始する前に75%のバグを除去できれば、ソフトウェアの平均故障時間(MTTF)の目標をどれくらいの速さで達成できるでしょうか?答えは「非常に速い」です。テストにかかる時間と費用の節約だけでも、コード解析ツールへの投資に価値があり、市場投入までの時間を短縮できることは言うまでもありません。これらのプロセスは、最終製品に不具合が混入するリスクを大幅に減らすことができるため、機能安全認証機関が好むタイプのプロセスです。

高品質なコードで機能安全への道を加速

高品質のコードは機能安全への道を加速します
機能安全認証へのパスを迅速化する鍵は、コードの品質を向上させることです。 コードの品質を向上させることで、欠陥の注入率を下げることができます。つまり、ソフトウェアのリリース基準により早く到達し、機能安全認証エンティティにとっては、開発組織は非常に成熟しているように見えます。アプリケーションに残っている欠陥の数を正確に知ることはできませんが、コード解析ツールを早期かつ頻繁に使用することで、その数を最小限に抑えることができます。

Article written by Shawn Prestridge, Industry profile and Senior Field Application Engineer/Team Leader for US FAEs at IAR Systems