MISRA-C:2004 から 2012 への移行の課題 萩原勝,中野泰伸,森川 ...

MISRA-C:2004 から 2012 への移行の課題
萩原勝,中野泰伸,森川聡久†,小川
清††
Issue and procedure on Migration from MISRA-C:2004 to MISRA-C:2012
Hagiwara masaru, Nakano Yasunobu, Morikawa Akihisa, OGAWA Kiyoshi
ねらい 自動車分野では C 言語部分集合としての MISRA-C により,より安全なソフトウェアの作成を目指
している。未定義,未規定,処理系定義,開発者の意図と異なる副作用の排除が中心で、ライブラリと同等の
機能をどう実装するとよいかなど未解決の事項もあり,より安全なソフトウェア作成のための資料を移行の課
題として補足する。
キーワード ISO/IEC 9899,未定義,未規定,処理系定義,副作用,ライブラリ,MISRA-C
Target: This study is to provide criteria and advice for the purpose of better migration of MISRA-C:2004 to
MISRA-C:2012
Keywords: C language, Coding standard, Safety, undefined, unspecified, implementation definition
1.想定する読者・聴衆
では,これらの振る舞いが異なる可能性のある機能を
除くことによって,CPU,処理系が変わることによる。
C 言語による設計技術者,C 言語によるソースコード
MISRA-C[3]は C 言語規格が CPU と C 言語処理系の発
の証明・試験実施技術者,C 言語設計に基づくシステ
展を阻害しないため,処理系での工夫を推奨するため
ムの品質担当者・管理者,利用者。C 言語規格作成者,
に処理系定義,未規定,未定義の部分集合を定義する
MISRA-C 標準作成者・利用者。コンピュータをシステ
ことにより回避している。
ムに含む安全関連系設計技術者・利用者。
表1
C 言語標準と MISRA-C
C1990 C1999 C2011
2.背景
MISRA-C:1998
○
X
X
き ISO/IEC 9899:1990(C90)[1]として作成した。C90 は多
MISRA-C:2004
○
X
X
バイト文字に対する対応が不十分であり,1995 年の追
MISRA-C:2012
○
○
X
C 言語国際規格はアメリカ規格 ANSI-C:1989 に基づ
補で対応するとともに規格全体は 1999 年版で対応して
MISRA-C 研究会は 1998 年版および 2004 年版の解説
いる。多バイト対応では C90 は不完全な規格である。
書[4]作成の際,MISRA の日本の窓口は東陽テクニカが
しかし,C99 は C90 の間違いを直しただけでなく,// に
対応した。MISRA-C:1998 が制定された際,日本からの
よる 1 行注釈,inline 関数などソフトウェアの品質向上
疑問点などを提示し,規定の解釈などを深めることが
に役立つ機能と,bool 型,複素数型など大幅に機能拡
できた。また日本からの疑問の解消などをもとに改訂
張している。また,C2011 は,C99 の拡張した複素数型
があり MISRA-C:2004 となった。
MISRA-C2012 年版は,
を選択式にできるようにしたほか,_s 関数,アライン
自動車部品製造業の多い名古屋地区で事務局を行うこ
メントなど規定している。C 言語が C コンパイラ,UNIX
とになり,名古屋市工業研究所と株式会社ヴィッツが
系の OS を記述していたことから,C 言語風の記法を利
協力して教育資料を作成している。その取組の一端は,
用した C++, JAVA, C#などが普及している。C と C++は
WOCS2013[5]及び安全工学シンポジウム[6]で発表して
一つのコンパイラで両対応することがあり,C と C++
きた。
の共通部分をどう増やしていくかが C 言語処理系品質
の課題である。C 言語規格は,プログラマを信頼する
3.課題
ことと CPU と C 言語の発展を期待して,未規定
表1の通り,MISRA-C2004 では,C99 に対応してい
(unspecified) , 未 定 義 (undefined) , 処 理 系 定 義
ない。最新 CPU 用のコンパイラでは C99 を基本とし,
(implementation definition) を分類している。Safer-C[2]
C90 の処理系定義が十分になっていく可能性がある。
また従来の CPU と従来の C90 対応コンパイラでは C99
†
††
株式会社ヴィッツ, 名古屋市工業研究所
a) E-mail: [email protected], [email protected]
で訂正した不明確な点や,より厳密な未規定・未定義・
処理系定義には対応できない。また、CPU によっては、
C99 対応が標準のコンパイラが増え、ドライバ、ライ
1
[テキストの入力]
[テキストの入力]
ブラリ、ミドルウェアも C99 対応のソースコード提供
場合の原因として、
が増えている。そこで,C 言語および MISRA-C の原点
に立ち返り,C 言語規格が何のためのもので,MISRA-C
(1)コンパイラが不十分または便利すぎ(不適合をコ
ンパイルエラーにする場合を含む)
仕様がなんのためのものであるかを考えることにより,
(2)自分の理解が不十分
MISRA-C:2012 への移行を円滑なものにすることが必
要になっている。
MISRA-C は,より安全なシステムを設計するための
[テキストの入力]
(3)プログラム例の前提が曖昧または不十分
章節・名称
No.
GCC
LLVM
VC
92
G.5.1 Multiplicative operators
○
○
○
あり,言語機能を限定することにより,明らかに質の
93
K.3.5.3.2 The fscanf_s function
×
×
○
低いプログラムを弾く役割を果たしている。しかし,
94
K.3.7.1.4The strncpy_s function
×
×
×
指針である。自動車分野では検査の道具は普及しつつ
検査の道具を使用して合格すればよいという利用の方
2) MISRA-C:1998, 2004 の時は、MISRA-C および解説書
向では必ずしも品質を向上するとは限らない。検査に
に記載のコードの断片をコンパイル可能な状態にして
合格するだけの書き換え方法は容易に見付かることが
内容を確認した。その際、コードの誤り、不十分な点
あり、他の品質指標を併用していないと品質の低下を
を確認した。しかし、最終原稿の段階は紙で校正して
招く可能性がある。また,MISRA-C:2012 が規定として
いるため確認が不十分であったところがあり、出版後
より厳密になったため,必須部分と推奨部分に分かれ
正誤表を出している。
たものについて,規則が緩んだという理解をされる場
3) MISRA-C のプログラム例を確認するためには C
合がある。
Puzzle Book[7]のマクロで出力した。これは、コンパイ
名古屋市工業研究所では、初心者のC言語の2週間
ラが通っても、意味のある処理を行うことは限らず、
の教育で、Cコンパイラの作成(最適化を除く)を課
意図した振る舞いを確認するためである。ただし確認
題にしてきた。また、C言語の理解を確かめるために、
するためのコードは、MISRA-C の規則を逸脱する場合
C Puzzle Book[7]を利用し、C言語がアクロバティック
がある。
なコードが記述でき、保守性が悪いプログラムがコン
4) MISRA-C:2012 の研究会では,各ルールについて,4
パイルエラーにならないことを確認してきた。講師を
段階で評価してもらい合意形成を測った。大事だと思
含め、Cpuzzle Book のすべての問題に正解にできた人
っている人と、大事でないと思っている人の議論にお
は挑戦した数百名(うち数十名はコンパイラを作成)
いて、内容の理解の差なのか、お互いの環境の違いな
の中で一人もいない。コンパイラ作成の能力まで必要
のかを区別するきっかけをつかむ。作業前と作業後の
がない場合には,C puzzle Book を利用し,C コンパイ
理解の深まりを確認する。大事だと思うことは、解説
ラ,OS などを記述する際に利用可能な自由な機能を使
の分量・ソースコード例を多く、大事じゃないことは、
うと,可読性の悪いプログラムになり,部分集合の定
解説とソースコード例を少なくするため。似たパター
義が必要だということを体験してもらった。OSC など
ンの評価をしている人は、似た環境での作業をしてい
での演習も実施している。
ることが推定できる。違うパターンの評価をしている
4.提案・実験
人は、違う環境での作業をしている可能性があるので、
環境の違いを確認してから議論するとよい。
MISRA-C:2012 を取り組むにあたって MISRA-C 研究会
5)
へ提言した事項と,MISRA-C からご助言いただいて実
3カ月周期でチーム編成を代え,ほとんどの参加者と
施したことを,MISRA-C:2004 から MISRA-C:2012 への
議論ができるとともに,毎回細かい議論ができる時間
移行手順の資料として整理する。
を確保した。
MISRA-C 研究会での検討は3人のチームをつくり,
1) MISRA-C のプログラム例をコンパイルする前に,
ISO/IEC 9899(JIS X 3010)のプログラム断片をコンパイ
5.展開と効果
ルしてみるとよいことを研究会の方から助言いただい
MISRA-C:1998, MISRA-C:2004 では MIRA の日本の窓
た。実際に GCC, CLANG(LLVM), Visual C/C++でコンパ
口である東陽テクニカが,疑問点の投げ掛けをお願い
イルできるように編集し,設計環境の機能,処理系の
していた。MISRA-C2012 の公式 Review に参加された
振舞いの違いを確認した。また、コンパイルできない
方もおみえになるので,今回からは個人で MIRA-C の
2
[テキストの入力]
[テキストの入力]
[テキストの入力]
英語の掲示板に質問を投げることにした。
CPU: central processing unit
1) 1年で 30 近い質問を MISRA-C の英語の掲示板に投
FMEA: failure mode effective analysis
げており、ボードの質疑の 4 分の1に相当する。
GCC: Gnu Compiler Collection
2)
MISRA-C:2004 と MISRA-C:2012 の対応関係と,そ
ISO: international Organization for Standardization
れぞれの規則の対応関係を研究会においてより細かく
IEC: International Electrotechnical Commission
確認し,移行の基礎資料とした。ここでは MIRA が規
LLVM: Low Level Virtual Machine
定しているものより2割ほど情報が増加している。
MISRA: Motor Industry Software Reliability Association
3) C 言語がコンパイラ・OS を記述するためと,応用ソ
OS: operating system
フトウェアを記述する場合に使うとよい機能の違いを
OSC: open source conference
明確にするものであることを,OSC,企業内研修の場
などで広く知らせることができた。
文
献
4) C 言語規格と MISRA-C のプログラム断片をコンパイ
[1]
ISO/IEC 9899:1990,1995Amd, 1999,2011,ISO
ルすることにより,複数の規則を逸脱している例、規
[2]
Safer C: Developing Software for High-Integrity and Safety-Critical
[3]
MISRA-C:1998,2004,2012, MIRA
則に適合しているが他の規則を逸脱している例など、
puzzle Book のように出力まで与えるとプログラム断片
System, Les Hatton, McGraw-Hill, 1995
[4] ソ フ ト ウ ェ ア FMEA を 体 系 的 に 実 施 す る 出 発 点 と し て の
が教材になることが分かった。
MISRA-C, 森川 聡久,小川清, 11th WOCS, 2014
[5] ソフ ト ウ ェア FMEA を 体 系 的 に 実 施す る 出 発 点 とし て の
5) 移行の段階
MISRA-C, 中野泰伸,原浩晃,森川聡久,小川清,安全工学シン
移行は、2 つの段階を想定する。
(1) 新しいソースは当初から 2012 対応、2004 対応の
ポジウム, 2014
[6] MISRA-C 解説書, SESSAME/MISRA-C 研究会,日本規格協会,
古いソースは、逸脱の手続きで対応する。
(2) 2004 対応のソースのうち、保守性を考慮して一部
初版 2004, 第二版 2006
[7]
C Puzzle Book, The Alan R. Feuer, Addison-Wesley
1998
書き直す。その際、C99 対応が引き続き C2011 対応で
もあるか、一時的に C 標準の Shall Statement になった
のではないことを確認するための表を用意した。
(3) 逆に C99 対応ソフトを C90 対応に書き換える場合
についても検討している。例えば、//コメントは簡単な
プログラムで/* */コメントに書き換えられ、/* */コメン
トを//コメントに変換するよりも容易であることが分
った。
6.まとめ・今後の課題
MISRA-C:2004 から MISRA-C:2012 への移行にあたっ
て,C 言語および MISRA-C の原点に立ち返ることによ
り,C 言語および CPU の発展を阻害せず,なおかつ安
全なシステム設計を実現することが,MISRA-C の役割
である。今後は,作業成果を基に,個々のルールごと
の移行の手引を作成中である。また、C 言語設計をす
るには、C言語の目的と意図を理解する教育の実施の
程度が課題である。
略
号
Amd: amendment
C90: ISO/IEC 9899: 1990
C99: ISO/IEC 9899:1999
CLANG: a C language family frontend for LLVM
3