MISRA-C
MISRA-C

MISRA-C

MISRA-C MISRA-Cを制定しているMISRAとはどのような団体でしょうか? MISRAは Motor Industry Software Reliability Association

MISRA-Cを制定しているMISRAとはどのような団体でしょうか? MISRAは Motor Industry Software Reliability Association の略です。直訳すると「自動車産業ソフトウェア信頼協会」になるでしょうか。自動車メーカー、部品メーカー、エンジニアリングコンサルタントが連携した団体です。そのミッションは「安全で信頼性の高い自動車システム用ソフトウェア作成のための自動車業界への支援を提供する」こととされています。

  • AB Automotive Electronics
  • ベントレー
  • Delphi Diesel Systems
  • フォード・モーター
  • ジャガー
  • ランドローバー
  • ロータス・エンジニアリング
  • MIRA
  • Protean Electric
  • Ricardo UK
  • TRW
  • 英国国立リーズ大学
  • Visteon Engineering Services

公式サイトによると、MISRAの発足は1990年代初頭だそうです。イギリス政府の「SafeIT」プログラム内のプロジェクトとして発足しました。目的は自動車組込みシステム用ソフトウェア作成のためのガイドライン制定です。1994年11月に車両ベースのソフトウェアのための開発ガイドライン(Development Guidelines for Vehicle Based Software)を公開。このドキュメントは、新しいIEC 61508規格(電気・電子・プログラマブル電子の機能安全に関する国際規格)への初めての自動車産業の解釈でもありました。

MISRA-Cの沿革

MISRA-Cの初版は1998年に発表されました。タイトルは「Guidelines for the use of the C language in vehicle based software」(自動車用ソフトウェアでC言語を利用するための手引き)。通称、MISRA-C:1998と表現されています。ガイドラインには17に区分された127件のルールがあります。そのうち必要ルールは93、推奨ルールは34となっています。解説書としては、日本規格協会から『組込み開発者におくるMISRA-C−組込みプログラミングの高信頼化ガイド』(ISBN 978-4542503342)が出版されています。

2004年10月13日には第2版が公開されました。タイトルは「Guidelines for the use of the C language in critical systems」(クリティカルシステムでC言語を利用するための手引き)です。こちらは通称、MISRA-C:2004と呼ばれています。MISRA-C:1998の運用や研究の結果が反映されています。対象が自動車用ソフトウェアから全ての組込みソフトウェアへと拡大されていることも特徴です。21に区分されたルールが141件あります。そのうち必須ルールは121、推奨ルールは20です。翻訳が公益社団法人自動車技術会(JASO)から『自動車用C言語利用のガイドライン(第2版)』(文献番号tp-01002-06)として出版されています。解説書としては、日本規格協会から出版された『組込み開発者におくるMISRA-C:2004−C言語利用の高信頼化ガイド』(ISBN 978-4542503465)があります。

C言語にとってMISRA-Cは重要

補足

MISRA-C:2012 ルール一覧 では分かりにくい指針・ルールについて下記に補足します。

指針 4.1 実行時の障害は最小限に抑えられなければならない 指針 4.5 可視性が重複して、同じ名前空間にある識別子は、表記上明白でなければならない
  • 小文字とそれに対応する大文字との交換。
  • アンダースコアの有無。
  • 文字の「O」と数字の「0」の交換。
  • 文字の「I」と数字の「1」の交換。
  • 文字の「I」と「l」(エル)の交換。
  • 文字の「l」(エル)と数字の「1」の交換。
  • 文字の「I」と数字の「1」の交換。
  • 文字の「S」と数字の「5」の交換。
  • 文字の「Z」と数字の「2」の交換。
  • 「n」(エヌ)と「h」(エイチ)の交換。
  • 文字の「B」と数字の「8」の交換。
  • 文字の並び「rn」(rとそれに続くn)と文字の「m」(エム)の交換。
指針 4.13 リソースに対する操作を提供するように設計された関数は、適切な順序で呼び出さなければならない
  • リソースの割当て(例:ファイルを開く)。
  • リソースの割当て解除(例:ファイルを閉じる)。
  • 他の操作(例:ファイルからの読み取り)。
ルール 1.2 言語拡張を使用してはいけない ルール 1.3 未定義の動作またはクリティカルな未規定の動作の発生があってはならない ルール 3.2 ラインスプライシングは//コメントで使用してはならない ルール 6.1 ビットフィールドは適切な型で宣言されなければならない

適切なビットフィールド型は次のように定められています。C90においては、unsigned int型またはsigned int型。C99においては、(1)unsigned int型またはsigned int型、(2)それ以外の、処理系によって許可された、明示的な符号付き、または明示的な符号なし整数型、(3)_Bool型。

ルール 6.2 ビットフィールドで名付けられたシングルビットは符号付きの型であってはならない ルール 8.10 インライン関数は、静的記憶域クラスを使用して宣言されなければならない ルール 8.14 restrict型修飾子を使用してはならない ルール 13.1 初期化リストは永続的な副作用を含んではならない ルール 17.1 の特色を使用してはならない ルール 17.6 配列パラメータの宣言は、[ ]の間に静的キーワードを含んではならない void func(int ary[static 10]) < // 略 > ルール 19.1 オブジェクトは、重複オブジェクトに代入あるいはコピーされてはならない
  • 互換性のある型同士で、メモリ上で完全に重複する2オブジェクト間の代入。
  • 標準ライブラリmemmoveを使用しての、メモリ上で全部あるいは一部重複するオブジェクト間のコピー。