MISRA C:2025 - 変更点の詳細

このブログは「MISRA C:2025: A closer look at some of the changes」の抄訳です。

MISRA C:2025の新ルールが発表されました。具体的に何が新しくなり、何が変わったのでしょうか?

安全性が求められるシステムにおいて Cコードの安全性、セキュリティ、信頼性を高めるために策定されたガイドラインです。長年にわたり、MISRAガイドラインは、安全性、セキュリティ、信頼性に関してミスの許されない複雑な組込みシステム開発において、従うべき最も重要な基準のひとつとなっています。特に自動車、医療、航空宇宙分野では、ソフトウェアがMISRAガイドラインに準拠していることが求められます。

MISRAガイドラインの前回の大規模な更新は2023年に行われました。今回公開された MISRA C:2025は、それほど大規模な改訂ではなく、むしろ MISRA C:2023ルールに対する調整といった位置づけですが、注目すべき変更点がいくつかあります。

MISRA C:2025の新ガイドライン

新たに4つのルールが追加されています。

Rule 8.18:ヘッダーファイルで暫定定義(tentative definition)を行ってはならない

このルールは、暫定定義が定義なのか宣言なのか開発者にとって分かりにくい場合に、異なるコンパイル単位でオブジェクトが重複して作成されることを防止します。

例:を見てみましょう。int i;int j = 0;という2つの変数a,bの宣言を含み、以下のヘッダー・ファイルを含む実装ファイルを考えてみましょう:

/* 非準拠: 暫定定義 (tentative definition) */
int32_t i;
/* while 準拠: 外部宣言 */
extern int32_t j;


Rule 8.19:ソースファイル内で外部宣言を行ってはならない

このルールは、明確なインターフェース設計を強制し、保守性とモジュール性を高めることを目的としています。特に、以下のようにヘッダーファイルで外部変数が宣言されていても、ソースファイルの実装部分で再び外部宣言するケースに言及しています。

void uses_externs( void )
{
    /* 非準拠: 実装内での外部変数宣言 */
     extern int32_t i;
}

Rule 11.11:ポインタは暗黙的にNULLと比較してはならない

MISRAの型システムを拡張し、適切な場合にはポインタの代わりに明示的なブール式を使用することを強制します。キャストや条件式での比較が対象となります。
次のスニペットは違反になります。

int *ptr;
/* 非準拠: bool型へのキャスト */
(bool) ptr;
/* 非準拠: 条件式での暗黙的比較 */
if(ptr)
{}

Rule 19.3 union メンバーは、事前に設定されていない限り読み取ってはならない

アクティブでない union メンバーを読み込むと、使用するC標準によっては実装依存の動作または未定義動作になります。これは、セーフティ・クリティカルなシステムにおいては不適切です。

このルールに準拠しないコード・スニペットは、次のようにユニオンの1つのメンバーに書き込み(結果としてそのメンバーがアクティブ・メンバーになる)、別のメンバーから読み取り、次のようになります。

union
{
    int member1;
    float member2;
} my_union;
/* これにより member1 がアクティブメンバーになる */
my_union.member1 = 5;
/* 非準拠: アクティブでない member2 を読み込む */
if(my_union.member2)
{}

MISRA C:2023からのその他の変更点

一部のルールは明確化や 新たな例外の追加、ルール番号の変更が行われています。また、複数の例が追加され、意図する動作がより分かりやすく説明されています。

最後に、有名な「単一出口ポイント (single point of exit) ルール」はカテゴリが変更され、「適用不要(disapplied)」となりました。これは、MISRAの観点からはもはや遵守が必須ではなく、矯正されないことを示しています。ただし、IEC 61508やISO 26262などの他の規格では、依然として同等の手法が推奨されており、プロジェクトや状況によってはこのルールの適用が求められる場合がある点には注意が必要です。

まとめ

MISRA C:2025 の変更は大きなものではないように見えるかもしれませんが、最新の開発動向に対応し、セーフティクリティカルなアプリケーション開発を継続的にサポートすることが目的です。MISRAガイドラインの遵守は、単なるコンプライアンスの問題にとどまらず、コードの品質と保守性を向上させ、将来にわたって通用するソフトウェア開発に貢献します。

詳細はこちら

MISRAガイドラインへの対応が必要な場合は、ぜひご相談ください。AxivionのMISRAチェッカーは、自動テストが可能なすべてのMISRAルールを100%カバーしています。

注:すべてのMISRAコーディングルールと指針の著作権は、©The MISRA Consortium Limited 2025に帰属します。


Blog Topics:

Comments