「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部

  • 736 views
Uploaded on

OSC Nagoya 2013で配布した問題を再配布。C言語規格がプログラマのためにあり、MISRA-CがCプログラマのためにある楽しいプログラミングをするための道である。この2つの特徴を活かした勉強をするのにTOPPERSプロジェクトのオープンソースが有用。

OSC Nagoya 2013で配布した問題を再配布。C言語規格がプログラマのためにあり、MISRA-CがCプログラマのためにある楽しいプログラミングをするための道である。この2つの特徴を活かした勉強をするのにTOPPERSプロジェクトのオープンソースが有用。

More in: Automotive
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
736
On Slideshare
0
From Embeds
0
Number of Embeds
3

Actions

Shares
Downloads
2
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide
  • C言語にはANSI ISO IEC JISなどの規格があります。
    MISRA-Cは、欧州の自動車関連の団体の発行しているCコーディング標準で
    他にソフトウェア開発作業標準を発行しています
  • 身の回りのありとあらゆるものに組込みシステムが使われています。
    この組み込みシステムについて理解し
    これに使われるリアルタイムOSについて理解することにしました。
    組込みにはC言語がよく使われています。
    Cのコーディング標準としてMISRA-Cというものがあるそうで
    MISRA-Cの内容を知り、
    MISRA-Cのルールが有効なルールか、現実にありそうなことを確かめ、
    またルール間の矛盾がないかを確かめ
    そして、MISRA-Cの教材を作ることを目的としました。
  • 1. The use of expression of essentially floating type for these operands is constraint violation
    2. An expression of essentially Boolean type should always be used where an operand is interpreted as a Boolean value.
    3. An operand of essentially Boolean type should not be used where an operand is interpreted as a numeric value.
    4. An operand of essentially character type should not be used where an operand is interpreted as a numeric value. The numeric values of character data are implementation defined.
    5. An operand of essentially enum type should not be used in arithmetic operation because an enum object uses an implementation-defined integer type. An operation involving an enum object may therefore yield a result with an unexpected type. Note that an enumeration constant from an anonymous enum has essentially singed type.
    5 Shift and bitwise operations should only be performed on operands of essentially unsigned type. The numeric value resulting from their use on essentially signed types is implementation defined.
    6.

Transcript

  • 1. C 言語規格& MISRA-C, みんなで楽しい C プログラミング 名古屋市工業研究所 工学博士・技術士(情報工学) 小川清 @kaizen_nagoya .NET は Microsoft 社の商標、 TOPPERS は TOPPERS プロジェクトの登録商標です。 TOPPERS プロジェ クトマス コットと
  • 2. 今お配りしている問題全問正解 の方に素敵な贈り物 の解 説書 ( 発売したら ) を差し上げます。 正解の先着10名様 MISRA-C:2012 12/14/13 (c)kaizen@wh.commufa.jp, @kaizen_nagoya 2
  • 3. 自己紹介 名古屋市工業研究所勤務 プロジェクト理事 SESSAME/MISRA-C 研究会 2012 準備会 岐阜大学非常勤講師 , ISO/IEC 15504 part2, 6, 9 co-editor Proof Café / TAPL 勉強会、名古屋ア ジャイル勉強会、名古屋 de 朝活読書 会、ういろ MUG 、 TeX ユーザ会参 加者 TOPPERS
  • 4. 今日の伝言 C 言語規格:プログラマ思いの規格 MISRA-C : C プログラマのための文書 ◦ C 言語と MISRA-C を勉強するなら TOPPERS プロ ジェクトに入ろう  MISRA-C 対応ソースコードが山盛り  各種 CPU に対応した起動処理がオープンソースで  毎年アプリケーション開発・アイデアコンテスト
  • 5. 構成 序章 .OSC Nagoya2013 紹介 C 言語の課題 ◦ MISRA-C 愛好会 章 . 先週の基礎勉強会で紹介した MISRAC の型に関する話題 2 ◦ MISRA-C は関数プログラミングへの入り口だ ◦ C# プログラマも組込に まとめと今後の課題 ◦ TOPPERS プロジェクトで両対応
  • 6. 格言1 間違いのない規格は役に立たない ◦ 技術はどんどん変化しているので対応していると 間違いが残る? ◦ 正しいことを確かめてから出していては発行時期 を逃す。 ◦ 役に立つことは論理的に正しいかどうか証明でき ていない・出来ないことがある ◦ 正しさだけを追求していると誰の役にも立たない 内容だけが残る C 言語規格は毎回 Corrigendum( 訂正 ) が出る。
  • 7. 今頃 C 言語? • CPU が実行するのは機械語。 • C 言語は高級機械語:多くの CPU 提供者が、 CPU とアセン ブラ、 C コンパイラを同時に出荷。 • min-CAML では直接アセンブラを生成することによっ て高速化を実現。 • C を生成すれば、対応 CPU が一気に広がる。 • • UNIX/Linux, TOPPERS などの OS は C で記述している 。 C コンパイラを C で記述している。 • C 言語をよくすると、 C コンパイラがよくなる。逆も真? • アセンブラで書けることなら、 C で書ける。 12/14/13 (c)kaizen@wh.commufa.jp, @kaizen_nagoya 7
  • 8. 情報源 C 言語規格 ISO/IEC 9899 ◦ WEB に審議文書を公開規格。 http://www.open-std.org/itc1/sc22/wg14/ MISRA-C(MIRA: Motor Industry Research Association) ◦ 参考情報を下記 http://researchmap.jp/kaizen/MISRA-C/ 12/14/13 (c)kaizen@wh.commufa.jp, @kaizen_nagoya 8
  • 9. C言語の規格  K&R (デファクト) C 言語の作者の文書  アメリカ規格(デジュール) ANSI X. 1989(C89):1999 版から ISO/IEC の標準 制定と同時進行  国際規格 : フリースタングィング環境 (main 無 可 ) ,ホスト環境( main 引数有) ISO/IEC 9899:1990(C90=ANSI C89)  ISO/IEC ISO/IEC 9899:1995 AMD1(C95) 9899:1999(C99) ISO/IEC 9899:2011(C2011)  国内規格 JIS X 3010:1993(C90), JIS X 3010 : 2004(C99) 9 www.jisc.go.jp で無償で閲覧可 (c)kaizen@wh.commufa.jp, 12/14/13 @kaizen_nagoya
  • 10. C 言語規格のあらまし の発展を阻害しない。  C 言語の仕様  OS の存在を前提とした ホスト環境( OS あ り ,main 有)  OS の存在を必ずしも想定していない フリース タンディング環境。 OS なくてもよく Main は必要ない 。  C 言語規格には 「未規定」,「未定義」, 「処理系定義」 がある。  Rationale という根拠文書が別にある C の精神 :the spirit of c  CPU 10 12/14/13 (c)kaizen@wh.commufa.jp, @kaizen_nagoya
  • 11. JIS C 解説 (C の精神)  © JIS 1. 既存のコードを救うことが重要であり、既存の処理系を保護すること は、重要視しない。 2. 可搬性のある原始プログラムが書けるようにする。 ( 高級アセンブラ 的な使い方による)可搬性がないプログラムを 禁止してはならない 。 3.( 既存の仕様からの)暗黙の意味変更( quiet change) は極力避ける 4. 規格は処理系の作成者とプログラマとの間の約束事を記述するもので ある。 5. 次の C の精神を遵守する . 1. プログラマを信頼する 2. プログラマが必要である事項を行うことを妨げ ない 3. 言語は小さく、コンパクトに保つ 4. 一つのオペレーティングシステムには唯一の方 11 法を割り当てる (c)kaizen@wh.commufa.jp, 12/14/13 @kaizen_nagoya たとえ可搬性が保障されない方法であったとしても、実行効率を上げ
  • 12. 格言2 プログラマの事を考えてくれるのは C! ◦ どんな言語を作っても C 言語を生成する機能を作 ろう ◦ そうすればどんな CPU でも動作する ◦ C を生成する時には、 MISRA-C の検査をしよう  そうすれば CPU 、コンパイラに依存した振る舞いを避 けることができる
  • 13. 動くプログラムで教育(応 用)  Safer  C  C C言語の未規定、未定義、 処理系定義の危険性を告発 Puzzle Book トリッキーなプログラムの 確かめ プログラミングの落と し穴 C  MISRA に対応規則記述 コンパイラ自体コンパ イル  OS のソースのコンパイル C  13 TOPPERS 12/14/13 (c)kaizen@wh.commufa.jp, @kaizen_nagoya
  • 14. 配布した問題の解き方と採点 プログラムを実行した結果を書いて提出。 機器、道具による違いの可能性がある場合は 、コンパイラの「 bit 幅の規定値による」のよ うに簡便に理由を記載。理由も採点対象。 全問正解の方には、素敵な本との引き替え券 を。 出題コードの試験および回答の確認は Mac OS X11.7.5, Xcoce 4.6.2 で実施。 http://researchmap.jp/jo1lnydjn-1797580/#_179758 に掲載
  • 15. 回答の作成例 回答作成は「脳内コンパイラ」で可 。 ISO/IEC 9899:1990, 1999, 2011 のいず れかの標準を参照し利用した標準を記 載。 問題 1-5 は「 C Puzzle book 」 , 6-10 は 「 C プログラミングの落とし穴」か らの引用または参考
  • 16. 問題1 From C Puzzle book ©1.1 #include <stdio.h> int main(int argc, const char * argv[]) { int x; x = -3 + 4 * 5 -6; printf("%dn",x); //(1.1.1) x = 3 + 4 % 5 - 6; printf("%dn", x);//(1.1.2) x = -3 * 4 % -6 / 5; printf("%dn", x);//(1.1.3) x = ( 7 + 6 ) % 5 / 2; printf("%dn", x);//(1.1.4) return 0; } 12/14/13 (c)kaizen@wh.commufa.jp, @kaizen_nagoya 16
  • 17. 問題1 From C Puzzle book © 1.1 11  1  0  1  12/14/13 (c)kaizen@wh.commufa.jp, @kaizen_nagoya 17
  • 18. 問題:避けたいプログラム 誤解を与えるプログラム 自分でも保守できないプログラム 異なる CPU 、コンパイラで異なる動 作をするプログラム これらを避けるために MISRA-C があ る。 これって早い話、 C プログラマのた めにある。
  • 19. MISRA-C の精神と展開 ( 仮説 ) プログラマに楽をさせてあげたい プログラマが不必要な事を行うことを 妨げる MISRA-C 仕様は C 言語規格より小さい (部分集合) 一つのオペレーティングシステムに唯 一の方法を割り当てる例があるとよい ◦ < TOPPERS プロジェクトでは、 MISRA-C に 対応したソースコードを公開>
  • 20. よくある意見 Q: 自分は天才プログラマなので一切の規制に反対。 A: 天才の書いたプログラムを、凡人が間違ったプログ ラムにしてしまうことがあります。凡人にも理解出来 るコードが書けるのも天才の技の一つかも。 Q: プログラミング言語の自動生成をしていて自分で コードを書かないので関係ない。 A: 自動生成で C 言語を使っているとキャストの仕方が 不十分で誤差が拡大したり、0割の発生原因となる。 MISRA-autocode では、自動生成の出力規則も定義。 Q: 試験 (test) 担当で、直接コードを書かないので無関 係。 A: MISRA-C は、 C 言語の部分集合 (subset) 。 MISRA-C (c)kaizen@wh.commufa.jp, 12/14/13 @kaizen_nagoya 20
  • 21. MISRA-C 履歴 C: 第一版 , 1998 C90 対応 MISRA C: 第二版 , 2004, C90 対応 MISRA Autocode, 2007/2009 MISRA C++ Guidelines for the use of the C++ language in critical systems: 2008 MISRA C: 第三版 , 2012, C90/C99 対応 MISRA
  • 22. MISRA-C  自動車向け、静的解析可能  異なる CPU で同じ動作 ( 未規定・未定義・処理系定義除外) ◦ 関数プログラミングに近い  -> 副作用による値制御変更小 動的記憶操作無。 ◦ − > free 無し。ポインタ無し。 暗黙、明示な型変換で設計者の意図を外 れない。 ◦ Underlaying type/ Effective Type
  • 23. MISRA Autocode      MISRA AC INT: Introduction to the MISRA guidelines for the use of automatic code generation in automotive systems, 2007. MISRA AC TL: Modelling style guidelines for the application of TargetLink in the context of automatic code generation, November 2007. MISRA AC AGC: Guidelines for the application of MISRA-C:2004 in the context of automatic code generation,November 2007. MISRA AC GMG: Generic modelling design and style guidelines, May 2009. MISRA AC SLSF: Modelling design and style guidelines for the application of Simulink and Stateflow, May 2009. 模擬試験の浮動小数点を自動生成で 固定小数点に変換 ◦ 誤差・桁落ちを少なくするキャスト ◦ 0 割にならないように=>この規則ではできない=>他の検証、 証明が必要
  • 24. MISRA-C:2012 の例 指針 1.1, プログラムの出力が依存する 処理系定義の動作を文書化し理解する 。 指針 4.8, 構造体または共用体へのポ インタがコンパイル単位内で逆参照し ていない場合,オブジェクトの実装を 隠蔽するとよい。<例次頁> 規則 1.3, 未定義又は重大な未規定の 動作が発生しない。
  • 25.                  //misrac.h #ifndef MISRAC_H #define MISRAC_H typedef struct OpaqueType * pOpaqueType; struct OpaqueType { // 実装を記述 }; #endif 指針 4.8 例 :OpaqueType //Dir.4.8.c #include "misrac.h” void f (void) { pOpaqueType pObject; pObject * GetObject(); //OpaqueType object 取得  UseObject { pObject); // Opaque Type 利用  }
  • 26. 潜在型 (Underlying type:MISRA-C2004/C90 対応 ) 演算、関数、マクロで暗黙、明示の型変 換を説明する際の用語 例: 16 ビットの乗算は途中経過を 32 ビットにする ◦ short int a, b, c; ◦ c=a*b; ◦ なぜ途中で 32 ビットとして扱うか  かなりの CPU がレジスタの乗算結果を倍の幅で持つ機能有 CPU のレジスタの抽象化 ◦ CPU でレジスタ幅の拡張を想定した型規則 ? ◦ CPU でレジスタを bitifield で処理する際の型 ?
  • 27. 潜在型 (Underlying type:MISRA-C2004/C90 対応 )  型変換起因問題,変数等が適切な型で宣言していない  汎整数拡張の影響がないと仮定した場合の式の型  汎整数拡張がない式の潜在型は C90 で規定する式の型  汎整数拡張が発生する式で汎整数拡張の結果 int 型となる 演算対象の潜在型は汎整数拡張前の式の型。例:二項演 算子の演算対象 switch 文の条件を表す括弧内の式の潜在 型は汎整数拡張前の式の型.  汎整数拡張が発生する式の中で式の型が汎整数拡張の影 響を受けない式の潜在型は C90 規定式の型.例:二項演 算子 > , >= , < , <= , == , != を適用した結果の式 の潜在型は int 型  汎整数拡張が発生する式の中で式の型が汎整数拡張の影 響を受ける式の潜在型は汎整数拡張の影響を無視した型。 例:二項演算子 * , / , % , + , - , & , ^ , | を 適用した結果の式および , 条件演算子( ? : )の結果の式
  • 28. 潜在型 (Underlying type:MISRA-C2004/C90 対 応)  1) 両演算対象の潜在型が等しい場合は , 演算対象の潜在 型  2) 両演算対象の潜在型が整数型で大きさが異なる場合は , 大きい方の演算対象の潜在型  3) 両演算対象の潜在型が整数型で大きさが等しく符号属 性が異なる(一方が符号無し整数型で他方が符号付き整数 型)場合については,符号無しの演算対象の型  4) 一方の演算対象の潜在型が整数型で他方の演算対象の 潜在型が浮動小数点型の場合は,浮動小数点型の演算対象 の潜在型。例: 8 ビット符号無し整数型の変数 a と b の間で加算を行った場合,式「 a+ b 」の潜在型は, 8 ビット符号無し整数 (式「 a + b 」の実際の型は,汎整数 拡張により int 型)
  • 29. Essential Type-MISRA-C:2012 ISO/IEC C1990, C1999 の両方に対応 Boolean character singed unsigned enum<i> floating _Bool char signed char unsigned char named enum float     singed short unsigned short   double     singed int unsigned int   long double     signed long unsigned long         signed long long unsigned long long    
  • 30. Effective type :演算子・演算対象 1, 制約破壊 4,5,6,(8) 実装定義 7, 未定義動作
  • 31. 格言3 型を議論するなら CPU の設計から始める? ◦ 論理回路設計は VHDL, Verilog-HDL をよく使う ◦ VHDL は Ada から派生、 Verilog-HDL は C のプリ プロを利用 ◦ 物理(電気)現象と数学を直接関係づければ最強 ◦ 論理回路用 C 言語: System-C, Spec-C, Impulse-C… Open source hardware…
  • 32. まとめと今後の展望  C 言語規格はプログラマのための規格 無償で検討でき、プログラマを大切に  MISRA-C は関数プログラミングの入口 副作用による振舞の違いを回避 Effective type(Misra-c:2012,C90&C99) と Undelay type(MISRA-C:2004,C90) の検討  C 言語規格、 MISRA-C を勉強するなら TOPPERS( オープンソースの OS)  型理論を勉強したら CPU を設計しよう( C で書 ける)  今後の展望 C# 技術者が組込へ… .NET の基礎は .NET micro Framework だ…
  • 33. TOPPERS アプリケーション開 発・アイデアコンテスト 2013 アプリケーション開発部門 ◦ 銀賞: TOPPERS Realtime System Sample ( RSS ) LPCXpresso GPS Clock 中村晋一郎 ◦ 銅賞: Toppers_JSP と Scicos_lab による組込みメカト ロニクス制御シミュレーション 塩出武 ◦ 銅賞: lwIP の移植 松浦光洋 活用アイデア部門 ◦ 銀賞: .NET micro Framework for TOPPERS 株式会社 デバイスドライバーズ 日高亜友 ◦ 銅賞: uIP による WEB サーバの開発 今西孝也 (高知県工業技術センター)
  • 34. おまけ: .net micro Framework 基礎 256 KBytes of flash and 64 KBytes of RAM. I a subset of the .NET シミュレータデバッグ機能 .net micro Framework は .NET Framework の部分集合−> .NET 基礎は .net micro Framework ( 最後の行は仮説 ) 2014 年2月に演習付きセミナ予定
  • 35. 協賛会社の皆様 ご聴講いただいた皆様に 感謝 & 回答の提出をお待ちしています 提出先 :@kazen_nagoya