MISRA-C:2004 から 2012 への移行の課題 ~MISRA-C:2012 移行に関する対応方策の提言 ~ 株式会社ヴィッツ萩原勝 株式会社ヴィッツ森川聡久 中野泰伸 名古屋市工業研究所小川清 1
アジェンダ C 言語国際規格と MISRA-C について MISRA-C:2012 移行への課題 移行に向けた提案 実験と活動成果 移行段階の考察と今後の課題 2
C 言語国際規格の経緯 1 C 言語で C コンパイラと OS を記述 K&R が教科書 : main, printf の可変引数関数のみのホスト環境 (OS 上 ) 例 < 標準化の胆 :C の精神 > CPU 発展を妨げない 未定義 未規定 処理系定義 16bit, 32bit の移行を最小限の手間で コンパイラ OS の可搬性 (portability) を確保 1989 年 12 月 ANSI X3.159-1989: 通称 C89(ANSI C89) 発行 1990 年 12 月 ISO/IEC 9899:1990(E) Programming Languages-C: 通称 ISO/IEC C90 発行 <GATT(General Agreement on Tariffs and Trade) スタンダードコード (1995 年 WTO(World Trade Organization)/TBT 協定 )> 3
C 言語国際規格の経緯 2 < 主な改善点 > 型検査 _Bool 型 インライン関数 (inline キーワード ) // による 1 行コメント 1999 年 12 月 ISO/IEC 9899:1999(E) Programming Language-C: 通称 ISO/IEC C99 制定 < 主な改善点 > align を規定 複素数型と可変長配列の必須が解除 Unicode 文字列 (UTF-32/16/8) に標準対応 排他的アクセスのファイルオープン方法 quick_exit など 2011 年 12 月 ISO/IEC 9899:2011(E) Programming Language-C: 通称 ISO/IEC C11 制定 4
C 言語国際規格の経緯 3 型検査 bool 型 多バイト対応 可変長配列 C1990 int 想定 - 1995 年追補 - C1999 要宣言 _Bool 必須 C2011 UTF-X 対応 任意 C90: 暗黙の型検査 Bool 型無し C99:C++ を意識して拡張しすぎ C2011:_s 関数未成熟 C1999 C2011 C1990 Copyright 2015 著作権保有者名 All Rights Reserved. 5
MISRA-C の誕生と目的 1 チップ毎に動作が違うことを受けて 安全な C 言語を書くために Safer C が提言された /* 除算を行う */ int x = 4 ; int y = 0 ; int answer ; answer = x / y ; char func(int i) { int ret = i; return ret; } if(*cp1 == ' 0') if(*cp2 == ' 0') return OK ; else return NG ; else の段落は? ゼロ除算? 関数の型は? 振る舞いが異なる可能性の機能を排除 6
MISRA MISRA-C の誕生と目的 2 C 言語が抱えるリスク 処理系定義 振る舞いが異なる可能性の機能を排除 自動車分野に適合した C 言語部分集合を定義して安全なシステム作りを! C 言語規格のリスクとなり得る物を用いない 未定義 未規定 副作用 リスクを排除するルールの制定 MISRA-C 可搬性のあるプログラムを実現できる仕組み より安全なシステム設計を行うための指針 品質低下を招く場合は 文章化による逸脱 7
C 言語規格と MISRA-C の対応 C-1990 C-1999 C-2011 MISRA-C:1998 - - MISRA-C:2004 (underlay type) - - MISRA-C:2012 (essential type) (essential type) - 8
ソフトウエア開発環境の実情 ソフトウェア開発環境としては MISRA-C:2004 が主流 最新 CPU 用のコンパイラは C99 対応を基本に開発 C99 対応コンパイラが増え ドライバ ライブラリ ミドルウエアについても C99 対応ソースコードの提供が充実 しかし MISRA-C:2004 では C99 に対応していない C99 対応ソースコード利用のためには MISRA-C:2012 への移行が必要! 9
MISRA-C:2012 移行への課題 検査に合格するだけの書き換え目的による質の低下を防御 MISRA-C:2012 が規定としてより厳密に則した反面 規則 が緩んだとの誤解から 現場における適応への混乱を回避 MISRA-C 仕様の本来の目的を考慮して MISRA-C:2012 への移行を円滑にすることが必要 10
移行に向けた提案 実験 1 C 言語 (C2011) を知る ISO/IEC9899(JIS X 3010) のプログラム例を 実際にGCC CLANG(LLVM) Visual C/C++ でコンパイルできるように編集し 設計環境の機能や処理系の振舞いの違いを確認 No. 章節 名称 コンパイル実行 GCC/LLVM/VC 90 C2011 F.10.6.6 The round functions // Implement 91 C2011 F.10.7.1 The fmod functions // Implement 92 C2011 G.5.1 Multiplicative operators // Examples 93 C2011 K.3.5.3.2 The fscanf_s function // Examples 94 C2011 K.3.7.1.4 The strncpy_s function 11
移行に向けた提案 実験 2 MISRA-C プログラム例の確認 MISRA-C のプログラム例を C Puzzle Book のマクロ出力で確認 12
移行に向けた提案 実験 3 MISRA-C:2012 の確認 MISRA-C:2012 の曖昧な点を明確にするため MISRA の掲示 板を通じて疑問点を確認 1 年間でボード質疑全体の 4 分の 1 に 相当する 30 件程度を投稿 ( 間違いの指摘 意味の厳密化 内容の確認 ) 5.4 deviation procedure, ogawa kiyoshi, http://www.misra.org.uk/forum/viewtopic.php?f=56&t=1356, 回答あり Dir 2.1 compilation errors, ogawa kiyoshi, http://www.misra.org.uk/forum/viewtopic.php?f=238&t=1334, 回答あり Rule2.1, tsukukazu, http://www.misra.org.uk/forum/viewtopic.php?f=216&t=1352, 回答あり Rule3.2 kumiko ito, http://www.misra.org.uk/forum/viewtopic.php?f=217&t=1369, 未回答 2014Jun09 Rule 8.13, kumiko ito, http://www.misra.org.uk/forum/viewtopic.php?f=222&t=1336, 回答あり Rule 19.1, minoru kanome, http://www.misra.org.uk/forum/viewtopic.php?f=233&t=1328, 回答あり Rule 21.1&21.2, ogawa kiyoshi, http://www.misra.org.uk/forum/viewtopic.php?f=235&t=1364, 未回答 2014May22 Rule 21.2, satoshi, http://www.misra.org.uk/forum/viewtopic.php?f=235&t=1358, 回答あり Rule 21.1 and 21.2, ogawa kiyoshi, http://www.misra.org.uk/forum/viewtopic.php?f=235&t=1364, Rule 21.7and 21.8, ogawa kiyoshi, http://www.misra.org.uk/forum/viewtopic.php?f=235&t=1365, 未回答 2014May22 Rule 21.8, tsukushiro, http://www.misra.org.uk/forum/viewtopic.php?f=235&t=1382, 未回答 13
移行に向けた提案 実験 3 Definition of "declare" for Rule 21.2 Rule's title say "shall not be declared." 投稿例 C90/C99 use the "declare" for function declarations and variable declarations. And, macros are used the "define". p.167 #define BUILTIN_sqrt(x) (x) /* Non-compliant */ "example" is a rule violation for the macro definition. To error the macro definitions could not be a role of rule 21.1? Re: Definition of "declare" for Rule 21.2 Rule 21.1 restricts the use of #define and #undef on certain names. Rule 21.2 restricts the declarations of certain names. 回答例 As you found, we have incorrectly put an example in the incorrect rule. CODE: SELECT ALL #define _BUILTIN_sqrt(x) (x) /* Non-compliant with Rule 21.1, but compliant with Rule 21.2 */ int _BUILTIN_sqrt; /* Non-compliant with Rule 21.2 */ Copyright 2015 著作権保有者名 All Rights Reserved. 14
活動成果 :Portable issue 表作成 C90/C99/C2011 の Portable issue 表を作成 C90 C99 C2011 機能追加 継続 廃止 機能追加 継続 廃止 15
活動成果 : プログラム例の確立 C 言語規格と MISRA-C のプログラム例を C Puzzle Book のマクロ出力を利用してコンパイル可能な状態にすることにより 対象の規則を逸脱している例 対象の規則に適合している例 複数の規則を逸脱している例 対象の規則に適合しているが他規則を逸脱している例など プログラム例を教材として活用することが可能となった 16
活動成果 : 正誤表の発行 MISRA-C:1998 2004 2012 解説書に記載のコード例をコンパイル可能な状態にして内容を検証 コードの誤り 不十分な点を確認し正誤表を発行 Sessame-Web に掲載 17
Comments 活動成果 : 移行基礎資料作成 MISRA-C:2012 と MISRA-C:2004 規則対応関係一覧表 ( 抜粋 ) Rule 3.1 R The character sequences /* and / / shall not be used within a comment Rules 2.3 r The character sequence /* shall not be used within a comment Rule 3.2 R Line-splicing shall not be used in / / comments Character sets and lexical conventions Rule 4.1 R Octal and hexadecimal escape sequences shall be terminated Rules 7.1 r Octal constants (other than zero) and octal escape sequences shall not be used. Rule 4.2 A Trigraphs should not be used Rules 4.2 r Trigraphs shall not be used. 18
移行段階の考察 MISRA-C 研究会の活動から MISRA-C:2012 への移行は 以下 2 つの段階が現実的 新規作成 既存 既存 MISRA-C: 2012 対応 MISRA-C: 2004 逸脱対応 一部書き換え対応 19
移行課題への対策 検査に合格するだけの書き換え目的による質の低下を防御 移行基礎資料 プログラム例などの情報は存在 個々ルール毎に逸脱を含む情報を整備した移行手引きが対策への道標 MISRA-C:2012 が規定としてより厳密に則した反面 規則 が緩んだとの誤解から 現場における適応への混乱を回避 C 言語国際規格の変更は Portable issue 表 MISRA 規則の 変更は 移行基礎資料で論証 さらに プログラム例の活用で適応性を可視化 20
まとめと今後の課題 MISRA-C:2004 から MISRA-C:2012 への移行に対しては 可搬性のあるプログラムを実現できる仕組み 安全なシステム設計 これらを実現することが MISRA-C の役割 課題 品質低下を回避した移行を実現すべく MISRA-C:2012 研究会の活動成果を基に個々ルール毎の移行手引きを作成 設計者に対する C 言語の目的と意図を理解する教育の実施 21
ご清聴ありがとうございました < 参考文献 > GATT スタンダードコード 1979, WTO/TBT 協定 1995 ISO/IEC 9899:1990,1995Amd, 1999,2011,ISO Safer C: Developing Software for High-Integrity and Safety-Critical System, Les Hatton, McGraw-Hill, 1995 MISRA-C:1998,2004,2012, MIRA MISRA-C 解説書, SESSAME/MISRA-C 研究会, 日本規格協会, 初版 2004, 第二版 2006 ソフトウェア FMEA を体系的に実施する出発点としての MISRA-C, 森川聡久, 小川清, 11 th WOCS, 2014 ソフトウェア FMEA を体系的に実施する出発点としての MISRA-C, 中野泰伸, 原浩晃, 森川聡久, 小川清, 安全工学シンポジウム 2014 C Puzzle Book, The Alan R. Feuer, Addison-Wesley 1998 22