MISRA C++:2023 について知っておくべきこと

MISRA C++:2023の対応を始めましょう!MISRA C++標準の歴史、重要性、ガイドライン、そしてMISRAを完全サポートしセーフティ&セキュリティクリティカルなソフトウェアの開発に役立つParasoft C/C++testについて

MISRA C++:2023はモダンC++言語を使用してセーフティクリティカルなソフトウェアを開発するのに役立ちます。新しいMISRA標準を使用し、ソフトウェアアプリケーションのMISRA準拠を達成して文書化することで、IEC 61508やISO 26262などの機能安全規格に定められた静的解析要件を満たすことができます。

MISRA C++:2023とは

AUTOSARとMISRAが協力し、C++17を使用した安全でセキュアなプログラミングを可能にするコーディングガイドラインのセットを準備していました。そして公開された文書がMISRA C++:2023です。

MISRA C++は、誤りを犯すリスクを低減し、非準拠のプログラムがあることによる危険を最小化するため、セーフティクリティカルなシステムで使用できるC++言語のサブセットを定義したコーディングガイドラインセットです。

C++言語規格は言語を完全には定義していません。動作が未定義、未規定、処理系定義となる状況があります。C++のプログラムがこれらの状況に依存している場合、予測可能な動作をする保証や移植可能である保証はありません。

MISRAガイドラインはこのような状況を検出し、ソフトウェアの安全性と信頼性を確保することを目的としています。また、言語規格に準拠したプログラムであっても、明らかにコードの誤りを示唆していたり、開発者に誤解される可能性が高い書き方がされることもあります。MISRAガイドラインはこのような状況も対象とします。

MISRA C++の進化

MISRA C++の最初のリリースは2008年に行われ、C++03 に焦点を当てていました。MISRA C++:2008は非常に人気を集めましたが、C++の進歩そしてC++11で追加された新機能により時代遅れになってしまいました。このギャップを埋めるため、AUTOSARコンソーシアムは2017年3月にAdaptive AUTOSAR Platform の一環としてAUTOSAR C++ガイドラインをリリースしました。

Adaptive AUTOSARは言語としてC++14を使用しており、開発者をサポートするために安全性およびセキュリティ指向のコーディング スタンダードを必要とします。 AUTOSARには未修正のMISRA C++:2008ガイドラインの約70%が含まれていました。

しかしC++の継続的な進化により新しい言語機能がC++17に追加され、新しいコーディング ガイドラインの必要性が生じました。MISRA C++とAUTOSARは標準を1つに統合することを決定し、C++17に必要なすべての更新を含む標準の新しい版の作業をMISRAが引き継ぎました。 その成果が2023年10月に発行されたMISRA C++:2023です。

MISRA C++:2023ガイドラインおよびルール

MISRA C++:2023ガイドラインはルールと指針に分類されます。ルールは、何が準拠で何が非準拠であるかの完全な定義を含むガイドラインです。指針の場合、準拠のチェックを行うのに必要な完全な説明を提供することは不可能です。なぜなら、準拠しているかどうかは、たとえば特定のプロジェクトのコンテキストで決定された設計に依存するからです。

ガイドラインは次のいずれかにカテゴリ分けされます。

  • Mandatory(必須)
  • Required(必要)
  • Advisory(推奨)

さらにルールはDecidability(決定可能性)および解析スコープによっても分類されます。

必須ガイドラインは逸脱することなく従わなければなりません。必要ガイドラインは、正式な逸脱プロセスに従い、すべての潜在的な問題を他の方法で軽減するかぎり、逸脱が許容されます。推奨ガイドラインは、できるかぎり従うべき推奨事項のようなガイドラインです。

決定可能性は、一般的に、自動化されたツールで解析可能かどうかを定義します。スコープは、1つの翻訳単位またはシステム全体のどちらでガイドラインをチェックするべきかを定義します。

MISRA C++:2023には、4つの指針と175のルールからなる179のガイドラインがあり、以下のようなC++言語規格のセクションに対応するセクションに分類されています。

  • 基本概念
  • 標準変換
  • 特別なメンバ関数
  • 例外処理

ルールの一部はAUTOSARコーディングガイドラインまたは旧版のMISRA C++ 2008から採られています。ただし、MISRAガイドラインは実装だけに特化しているのに対し、AUTOSARは設計、ツールチェーン、インフラストラクチャ、文書化に関する推奨も提供しています。全般として、MISRA C++:2023は過度にスタイルを制限することなく、コードの意味および誤りを避けることを重視しています。

MISRA C++:2023コンプライアンスを達成するには

MISRA C++:2023は、MISRA Compliance文書に定義されたコンプライアンスプロセスに従うことを要件としています。MISRA ComplianceはMISRA C標準と MISRA C++標準の間で共有される別の文書です。最新版は2020年にリリースされ、2016年の旧版に取って代わるものとなります。

MISRA Complianceではコンプライアンス プロセスと報告に関する一連の要件が導入されています。MISRA Complianceはコンプライアンス成果物として期待される特別な報告書を定義します。

  • ガイドライン施行計画書は、ガイドラインを施行するために使用されるすべての技術的手段を指定した文書です。
  • ガイドラインの再分類計画は、特定のプロジェクト向けに導入されたガイドラインカテゴリのすべての変更を記述した文書です。
  • ガイドラインコンプライアンスサマリーは、各ガイドラインの準拠レベルを文書化した報告書です。

さらにコンプライアンス文書では逸脱を処理するための完全なプロセスを推奨しています。これには逸脱記録の要件、逸脱許可の使用、逸脱が許容される理由のリストが含まれます。

プロジェクトがMISRAへの準拠を主張するのに必要な条件が標準化されていることは、組織が適切なレベルの信頼性を確保するのに役立ちます。また、複数の契約業者からモジュールが納入される場合も、各業者がMISRA C/C++ コードチェックを実施していれば、準拠レポートを統合できるという利点があります。

ガイドラインの一部はコードレビュープロセスでチェックできますが、面倒な作業になるでしょう。その他のガイドライン、特にアプリケーションのソースコード全体に対してデータおよび制御フロー解析を要求するガイドラインなど、システム全体の解析が必要なガイドラインは、人手でチェックするのは事実上不可能です。そのため、Parasoft C/C++testのような自動静的コード解析ツールを利用することが重要です。C/C++testはMISRA C++:2023を完全にサポートしており(日本では2024年3月のバージョン2023.2でリリース予定です)、MISRAガイドラインと照らし合わせてコードを解析し、適切な準拠文書を生成します。

セーフ&セキュアなソフトウェアにとってMISRA C++:2023が重要である理由

MISRA C++はC++言語の安全なサブセットを提供することをねらいとしています。このねらいは、アプリケーションの安全性とセキュリティを高めるために、C++ソースコードに対していくつかの要件や制限を課すことによって達成されます。

エラー予防

C++言語規格は、主にコンパイラがより効率的なコードを生成できるよう、特定の状況を未定義の動作として指定しています。コンパイラは未定義の動作が起こる状況が発生しないものと仮定し、その仮定に基づいて最適化を行うことができます。反面、未定義の動作が起こる状況が発生した場合、プログラムの動作は予期できないというリスクもあります。また、プログラムがテスト実行時には完璧に動作したが、運用では失敗する場合もあることを意味し、検証プロセス全体が徒労になる可能性もあります。MISRA C++には、直接的または間接的に未定義の動作を防ぐガイドラインがあります。たとえば、オブジェクトの不確定の値の評価を防ぐ「ルール 11.6.2 オブジェクトの値が設定される前に読み取ってはならない」などです。

コードの保守性

C++言語規格では、抽象マシンの特定の側面は処理系定義であると記述されています。つまり、コードの動作は明確に定義され、文書化されている必要がありますが、処理系によって異なる場合があります。

処理系定義の動作に依存するプログラムは、別のターゲットに移植するのが難しい可能性があります。このような動作の例を挙げると、sizeof(int)があります。これは、実際の演算が行われる前に、より狭い型のすべてのオペランドが拡張されるなど、算術演算の動作に影響を与えます。結果として、コンパイルターゲットによって算術演算の結果が異なる場合があります。MISRA C++ガイドラインは、たとえば次のような標準変換に関するルールによって問題を防ぎます。 

  • ルール 7.0.5 整数拡張および通常の算術変換がオペランドの型の符号またはカテゴリを変更してはならない
  • ルール 7.0.6 数値型間の代入は適切でなければならない

リスク管理

また、MISRA ガイドラインは、有効なC++ソースコードであっても、開発者の混乱または誤解に起因する潜在的なリスクに対処します。たとえば、 if (x = y) というコードは完全に有効なC++コードですが、等価演算子の代わりに誤って代入演算子を使用したタイプミスの結果である可能性が非常に高いでしょう。「Rule 8.18.2 代入演算子の結果を使用するべきではない」はこのようなコードをレポートし、正しいかどうかレビューするよう求めます。

機能安全規格が適切なコーディングガイドラインと安全な言語サブセットを使用することを求めるのには理由があります。MISRA C++:2023準拠を主張することができる組織は、自社の開発するモダンC++アプリケーションの安全性とセキュリティを高められます。

(この記事は、開発元Parasoft社 Blog 「MISRA C++ 2023 Guide: Everything You Need to Know」2024年1月4日の翻訳記事です。)

さらに詳しく知りたい方はぜひセミナーもご視聴ください

MISRA C++:2023について詳しく解説したセミナー動画・資料をご提供しています。本セミナーでは、MISRAワーキングメンバーであるParasoft社が、MISRA C++:2023の構成や以前のバージョンとの違い、準拠にあたって考慮すべき点をサンプルやデモを交えて解説しています。また、C言語向けの最新版MISRA C:2023に関する講演の動画および資料もあわせてご提供しておりますので、最新のMISRA C/C++標準の動向を一度に知ることができます。

これからMISRA C++:2023/C:2023の導入をお考えの皆様にとって、対応のポイントがよくお分かりいただける内容となっておりますので、ぜひご視聴ください。


静的解析・単体テストツールC/C++test

C/C++testは、静的解析(コーディング規約チェック/フロー解析)、単体テスト、カバレッジの計測、実行時メモリエラー検出、効率的な運用や規格順守を補助する機能などを搭載したC言語/C++言語対応のオールインワンテストツールです。

MISRA C/C++、AUTOSAR C++14コーディングガイドライン、CERT C/C++コーディングスタンダード、CWEなどで定められた規約に基づくコーディングの支援や、単体テストやアプリケーション実行時に自動的にカバレッジを計測するなど、さまざまな要件に対応し、ソフトウェアの品質向上とテスト工数の大幅削減をサポートします。

また、C++testは、効率的な運用や規格遵守を補助する機能を搭載しています。第三者認証機関であるTÜV SÜD社よりIEC 61508およびISO 26262、IEC 62304に準拠したテストツールとして認証を取得済みです。また、CIツール連携、Docker連携、レポート生成、ダッシュボード表示など各種機能を搭載しています。

Top