Avance.Lab

技術紹介

第2回 MISRA-C ~必要ルールの逸脱手順~

公開日:2022.04.08 更新日:2022.04.08

tag: 組み込み車載

こんにちは、TMIHです。

前回に続き、MISRA-Cの必要ルールに準拠したプログラムと必要ルールから逸脱したプログラム、逸脱手順を紹介します。

必要ルールに準拠したプログラム

まずは、MISRA-C:2004の中から必要ルールに準拠したサンプルプログラムを紹介したいと思います。

ルールNo.10.6
カテゴリー必要
内容すべての符号なし型の定数には、接尾語”U”を付けなければならない。
詳細ルール10.6は、C言語における数値定数を明確にするためのルールである。
接尾語なしの定数を記述した場合、int型で表現できる範囲内であれば無条件にint型として扱われる。
また、内部のビット表現が同じでも、10進数で記述する場合と、16進数で記述する場合で、その型が異なる場合がある。
この結果、プログラマが意図しない結果を招く可能性がある。

●サンプルプログラム

7~10行目の処理では定数に接尾語”U”が付いているため、定数値が明示的にunsigned int型となり、意図した結果が得られます。
仮に9行目の定数に接尾語”U”が付いていないと、定数値がsigned int型となり、演算途中でオーバーフローが発生する可能性があります。

void func(void)
{
    unsigned int work;

    work = 6U;

    work = work + 5U;
    work = work - 1U;
    work = work * 10000U;
    work = work / 2U;
}

必要ルールから逸脱したプログラム

次に、MISRA-C:2004の必要ルールから逸脱したサンプルプログラムと逸脱手順を紹介したいと思います。

ルールNo.8.7
カテゴリー必要
内容オブジェクトが単一の関数内だけでアクセスされている場合は、そのオブジェクトをブロックスコープで定義しなければならない。
詳細ルール8.7は、オブジェクトの有効範囲を明示的に限定することにより、可読性及び保守性をよくすることを目的としている。
あるオブジェクトが1つの関数のみで使用される場合、オブジェクトの有効範囲がその関数内のみに限定されるように定義する。
不必要に広い範囲でオブジェクトを定義すると、可読性や保守性が悪くなり、オブジェクトに対する意図しない参照や変更をしてしまう可能性がある。

●サンプルプログラム

3行目で定義したオブジェクトは、単一の関数でしかアクセスしませんが、ファイルスコープで定義しているため、ルール8.7から逸脱していることになります。

//#define TYPE1

int tmp;

void func1(void);
static void func2(void);

void func1(void)
{
    if(tmp < 10)
    {
        tmp++;
    }

    func2();
}

static void func2(void)
{
#ifdef TYPE1
    if(tmp >= 5 )
    {
        …
    }
#endif

    …
}

●逸脱手順

準拠させるためにはブロックスコープに変更する必要がありますが、他の目的のため(例えばソフト流用)により、ファイルスコープを余儀なくされた場合は逸脱の手順が必要となります。

逸脱する場合、必要性と安全性確保について逸脱説明書による説明が必要になります。
また、プロジェクト全体で逸脱とするか、特定箇所のみ逸脱とするかで逸脱説明書に記載する内容が異なります。
逸脱説明書には以下の内容が盛り込まれていなければなりません。

項目プロジェクト全体の逸脱特定箇所の逸脱
逸脱するルールの概要とコードの詳細
逸脱の必要性が発生する状況(環境内容)×
逸脱に起因すると考えられる潜在的な問題
逸脱の正当な理由
潜在的な問題に講じた対策が、どのように安全性を保証するかの証明
〇:必要、×:不要

上記のサンプルプログラムをプロジェクト全体の逸脱と仮定した場合、逸脱説明書に記載する内容は以下のようになります。

・逸脱するルールの概要とコードの詳細

 概要:上記に記載のルールNo.8.7
 コードの詳細:上記のサンプルプログラム

・逸脱の必要性が発生する状況(環境内容)

 他プロジェクトで使用した実績のあるソフトを流用して使用する場合。

・逸脱に起因すると考えられる潜在的な問題

 可読性や保守性が悪くなり、オブジェクトに対する意図しない参照や変更をしてしまう可能性がある。

・逸脱の正当な理由

 他プロジェクトで使用した実績のあるソフトを流用して使用するため。

・潜在的な問題に講じた対策が、どのように安全性を保証するかの証明

 対策:変数”tmp”にファイルスコープでアクセスする処理は、”#ifdef TYPE1″の範囲内にのみ実装し、
    ファイルスコープが不要なソフトでは、定数”TYPE1″がコメントアウトされていることを確認する。

 証明:ファイルスコープでアクセスする処理を”#ifdef”の範囲内に限定することで、意図しない参照や変更を防いでいる。

次回

今回は、MISRA-C 2004の必要ルールに準拠したプログラムと逸脱したプログラム、逸脱手順を紹介しました。
次回は、MISRA-C 2004の必要ルールのプログラムと推奨ルールのプログラムについてを紹介します。

引用・参考文献

「組込み開発者におくるMISRA-C:2004 C言語利用の高信頼化ガイド」、MISRA-C 研究会編、ISBN 9784542503342、日本規格協会

TMIH
TMIH

主に組み込み系を担当。食べることが趣味

関連記事