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