MISRA CはMISRA (Motor Industry Software Reliability Association、ミスラ) が開発したC言語のためのソフトウェア設計標準規格である。ANSI/ISO/IEC規格のC言語で記述する組み込みシステムで、安全性と可搬性 (ポータビリティ、移植性) と信頼性を確保することを目的としている。
Cソフトウェアにおける課題
可搬性と移植性
C言語規格では、ソフトウェアをCPUやオペレーティングシステム (OS) の種類にかかわらず移植できるようにするために、言語規格ではあえて厳密に仕様を定めず、処理系定義 (implementation-defined)、未定義 (undefined)、未規定 (unspecified) の動作 (behavior) など、CPU/OSおよびコンパイラごとに取り決めをする事項があり、他の言語と比べると非常に多い。たとえば代表的なものとして組み込み整数型のサイズの規定や、関数引数の評価順序などが含まれる。そのため、移植性を考慮せずにプログラムを記述した場合、あるCPU/OS向けのC言語プログラムが、他のCPU/OSでは異なる結果を出すことがしばしばある。「The C Puzzle Book」[1] (Cパズルブック) [2]、「C Traps and Pitfalls」[3] (Cプログラミングの落とし穴) [4]というベル研究所 (Bell研) の著者が書いた本に掲載のプログラムを実行してみるとよくわかる。
安全性と信頼性
C言語規格で規定されている実行環境として、OSの存在を前提としたホスト環境 (hosted environment) と、OSを利用しないこと(もしくはOSそのものを記述すること)を前提としたフリースタンディング環境 (freestanding environment) とがある。組み込み環境は後者に該当する。C言語は高級言語の皮をかぶったアセンブラ(高級アセンブラ[5]、汎用アセンブラ[6])とも言われるように、ハードウェアの直接的な制御も可能でありながら移植性の高い言語であり、それゆえにリソース制限および性能要求の厳しい組み込み環境やデバイスドライバー開発における主流言語であり続けている。組み込みプロセッサなどのチップベンダーが、自社製ハードウェアの販売時にCコンパイラを付属させることもある。カーネルモードのドライバーはC言語でしか記述できない環境もある[7]。しかし、後発のJavaおよびC#といった高水準な仮想マシンベースのプログラミング言語と比較して、C言語は安全性に関して配慮されているとはいいがたい。Pascalなどの同時代あるいはそれ以前に登場した他言語と比べても、文字列の扱いなどで安全性に劣る部分がある。特にバッファオーバーランやスタックオーバーフローによるメモリアクセス違反や、メモリの解放忘れによるメモリリークなど、C言語ではシステムの停止や未定義動作を引き起こす元凶となる致命的なソフトウェアの不具合に対する最終防壁はなく、これらはプログラマー側の負担や責任となってしまう。C言語から直接発展したC++言語についても、ある程度改善・改良されている部分はあるものの、依然としてC言語と同様の問題点を抱えている部分がある。
モダンな後発言語は移植性のないプログラムや危険なプログラムを記述しにくい(あるいは記述できない)仕様になっているのに対し、C/C++言語はもともとプログラマーを信頼し、プログラマーにできることを制限しない設計思想である。したがって、C/C++言語で移植性や安全性を確保しつつプログラムを記述するためには、何らかのコーディング規約を整備・標準化して、運用時に制限をかける必要がある。
関連文書と経緯
Matlabから自動生成 (autocode) したプログラムに対するMisra AutoCode、C++言語に対応するMISRA C++の手引きもある。「Safer C」[8]のようなCPUに依存しないCプログラムの書き方と、「Cプログラミングの落とし穴」のような間違い易い機能を回避した書き方を推奨している。MISRA Cはもともと自動車業界向けツールのベンダーなどが規定したものではあるが、現在は他業界にも広く普及している。
MISRA C規格の初版「Guidelines for the use of the C language in vehicle based software」を1998年に出版し、MISRA-C:1998と呼ぶ[9]。
2004年に第2版「Guidelines for the use of the C language in critical systems」(クリティカルシステムでC言語を利用するための手引き) をMISRA-C:2004として出版し、2つの規則間の矛盾,規則番号を見直すなど手引きに本質的な変更をした。
MISRA Cは規則を守ることだけが目的ではなく、逸脱した方が信頼性が高い場合には文書化することを推奨している。逸脱の手続きをどのようにとるとよいかについての文書として、Approved Deviation Compliance (ADC) を作成している。ADC version 1.0は MISRA Forum[10]からダウンロードできる。
C99を取り扱うように手引きを改定し、MISRA-C:2012を発行した。
MISRAはC言語標準の未規定、未定義、処理系定義などに基づいている。C言語標準は有料で販売しているが、審議用の文書はISO/IEC JTC2 SC22 WG14で公開しており、内容を検討するのには十分である[11]。
MISRA C文書は有料で販売している[12]。MISRA Cの日本語版は自動車技術会から、JASO テクニカルペーパー"自動車用C言語利用のガイドライン"として販売されている。
また、規則を含む解説書をSESSAMEのMISRA C研究会が作成し、日本規格協会から発行している。なお、解説書の誤植はSESSAMEのWEBに掲載している[13]。
規則 (rule)
MISRA-C:1998 は127件の規則があり、うち93件が必須事項、34件が推奨事項となっている。規則には1から127までの連番が割り振られている。
MISRA-C:2004 は141件の規則があり、うち121件が必須事項、20件が推奨事項となっている。これらは「環境」や「ランタイム機能」など21項目に分類されている。
MISRA-C:2012 は143件の規則があり、うち10件が義務、101件が必須、32件が推奨事項となっている。
「MISRA規格に適合している」ことを売りにしているコード検査ツールが数多く存在するが、MISRAは第三者による許認可の仕組みを持っていないため自己宣言である[14]。
MISRAツールを利用者が評価して比較できるようにするMISRA-C:2004及びMISRA-C:2012の例題プログラムをMISRA掲示板[15]でダウンロードできる。
大半の手引きは静的コード解析用ツールによって検査できる。一部の手引きについては動的なコード分析の機能が必要になる。
関連文書
セキュリティ分野では、CERT C, CERT C++がコーディング標準として普及している[注釈 1]。また、ISO/IEC TS 17961[18]として国際規格でコーディング標準の基本文書を発行している。これらの文書は、先行技術であるMISRA Cを参照している。CERT C, CERT C++では、対応するツールの一覧、MISRA Cとの関係がある。
書籍
脚注
注釈
出典
関連項目