準拠/未準拠の判定自動化を推し進める新しいCコーディング・ガイドライン「MISRA C:2012」とは? ―― 「MISRA C:2012 との付き合い方」セミナ

Tech Village編集部

tag: 組み込み

レポート 2013年4月25日

 2013年3月18日,車載ソフトウェア開発に関する業界団体であるMISRA(The Motor Industry Software Reliability Association)は,C言語によるコーディングのガイドライン「MISRA C」の最新版「Guidelines for the Use of the C Language in Critical Systems(通称「MISRA C:2012」)を公開した.これを受けて2013年4月19日,MISRA C委員会のメンバであるChris Tapps氏(英国LDRA社)が,全国町村会館(東京都千代田区)で開催された「MISRA C:2012 との付き合い方」セミナにおいて,MISRA C:2012の概要と従来版との変更点について講演した(写真1).主催は富士設備工業

 

写真1 講演を行うMISRA C委員会 メンバのChris Tapps氏(英国LDRA社)

 

●C99に対応,ルールはツールで判定可能に

 MISRA C:2012における大きな変更点は,1999年にISO規格「ISO/IEC 9899:1999」として改定されたC言語(通称「C99」)に対応したことである〔これまで準拠してきた「ISO/IEC 9899:1990」(通称「C90」)への対応も維持している〕.これにより,C90ではあいまいだった未定義/未規定の動作のいくつかがC99で明確になった.また,依然として未定義/未規定の動作で実用的な解説を加えることが難しいものについては,この動作を避けるように一般的なルールを定めた.一方,未定義/未規定の動作でも助言が可能なものについては,ルールから逸脱してよい場合を判断できるように特有ルールを定めている.

 Tapps氏によると,MISRA C:2012のルールの設計にあたっては,ソース・コードが各ルールに準拠しているか否かを解析ツールで判定できることを目標とした,とのことである(図1).その結果,約8割のルールについては,ツールで準拠/未準拠を判定することが可能である(=Decidable)という.これにより,MISRA C準拠のための作業や人手によるコード・レビューの手間を軽減でき,ソース・コードの実装に集中できる,と述べた.

 

図1 MISRA C:2012のルール記載例(Rule 9.2) ※クリックすると拡大します

 

  

●「必要」,「推奨」のほかに「必須」ルールが登場

 MISRA Cの前バージョンであるMISRA C:2004は,141項目のルール(Rules,規則・規定)からなる.MISRA C:2012では,項目を「指令(Directives)」と「ルール」に分けており,MISRA C:2012は16項目の指令と143項目のルールからなる.指令には,準拠を判断するための完全な解説を記述できないものが含まれる(例えば「コードの一部をコメントアウトするべきではない」など).一方,ルールには,完全な解説を記述できるものが含まれる.指令については,解析ツールでチェックするよりも,開発プロセスの中で手作業で確認するほうが向いているという.また,指令とルールは,どちらも同程度に重要であるという.

 前バージョンまでのMISRA Cのルールには,「必要(Required)」と「推奨(Advisory)」という分類が存在した.MISRA C:2012のルールには,さらに「必須(Mandatory)」という分類が加わった.必須とは,準拠しないと不具合が発生するものを指し,これに関しては逸脱が許されない(図2).一方,「必要」と「推奨」については,それぞれに該当する手順を踏めば逸脱が認められている.

 

図2 MISRA C:2012で分類が「必須(Mandatory)」であるルールの例

Rule 22.4
"There shall be no attempt to write to a stream which has been opened as read-only"
(訳:読み取り専用としてオープンされたストリームに書き込んではならない)

Rule 17.4
"All exit paths from a function with non-void return type shall have an explicit return statement with an expression".
(訳:戻り値の型が非voidの関数の場合,すべての出口で,式を持つ明示的なreturn文を記述しなければならない)
 

 

●MISRA C:2004準拠を継続という選択肢もあり得る

 MISRA C:2004では,望ましくない動作を防ぐために必要以上に制限があったといい,MISRA C:2012ではこれを改善している(図3).実際に,LDRA社のツール「LDRA tool suite」を使ってMISRA C適合チェックを行ったところ,MISRA C:2004準拠の場合の指摘よりもMISRA C:2012準拠の場合の指摘のほうが数が少なかった.Tapps氏も,MISRA C:2004に準拠しているソース・コードであれば,MISRA C:2012のチェックにひっかかることは少ないはずだと言う.そして,新しいバージョンが出たからといってMISRA C:2012に乗り換えなければならないわけではなく,継続してMISRA C:2004に準拠するという選択肢もあり得る,と述べた.

 

図3 演算子の優先度に関するMISRA C:2004とMISRA C:2012の違い
MISRA C:2004では,&&や||といった論理結合演算子のオペランド(被演算項)は1次式(かっこでくくられた式など)でなくてはならない,というルール(分類は「必要」)が存在した.MISRA C:2012では,式を含む演算子の優先度を明示することをルール(分類は「推奨」)とするにとどめており,冗長なかっこを書かなくてもよくなった.

 

 

 なお,MISRA Cは,C言語のソース・コードがオブジェクト・コードになったときの動作の整合性を保証できることをねらいとしており,それはMISRA C:2004でもMISRA C:2012でも同じであるという.MISRA C:2012で制約が減ったのは,主に,C90とC99の動作に対する考え方の差が,対応するMISRA Cの制約の差として表れているにすぎない,とのことだ.

 

1  2  »
組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日