28
Software Reliability Enhancement Center © 2016 IPA 最新版 ESCR C++ Ver.2.0 の紹介 独立行政法人 情報処理推進機構 (IPA) 技術本部 ソフトウェア高信頼化センター (SEC) 十山 圭介 ~ 組込みソフトウェア開発向けコーディング作法ガイド ESCR[C++言語版]の改訂について ~ ET/IoT2016 ブースプレゼン 2016年 11月 16, 18日

最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

Software Reliability Enhancement Center© 2016 IPA

最新版ESCRC++Ver.2.0の紹介

独立行政法人情報処理推進機構 (IPA)技術本部ソフトウェア高信頼化センター (SEC)

十山圭介

~組込みソフトウェア開発向けコーディング作法ガイドESCR[C++言語版]の改訂について~

ET/IoT2016ブースプレゼン

2016年11月16, 18日

Page 2: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

1. IPA/SECとESxRについて

2. ESCR

3. ESCRC++の改訂C++の概要

改訂の内容

改訂項目の例

目 次

Page 3: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

1. IPA/SECとESxRについて

Page 4: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

3© 2016 IPA Software Reliability Enhancement Center

組込みシステム開発に向けたSECのアプローチ

組込みシステム開発における課題QCD目標の達成が困難になってきている

組込みシステムの特性

物理現象、 リアルタイム性、 …

急速な規模拡大

拠点分散、 インタフェース増、 コミニュケーション複雑化、 …

SECのアプローチ先進企業でのベストプラクティスを体系的にまとめる

どのような作業をどのように進めるか

どんな手法をどのように利用するか

ESxR : Embedded System development exemplar Reference組込みシステム開発技術リファレンス

Page 5: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

4© 2016 IPA Software Reliability Enhancement Center

開発プロセスガイド : ESPR(Embedded System development Process Reference)

組込みシステム開発技術リファレンスESxRシリーズ

プロジェクトマネジメントガイド : ESMR [計画書編] 、 ESMR-2 [定量データ活用編](Embedded System development Management Reference)

品質作り込みガイド : ESQR(Embedded System development Quality Reference)

コーディング作法ガイド:ESCR [C言語版]:ESCR [C++言語版]

(Embedded System development Coding Reference)

プロジェクト計画立案トレーニングガイド : ESMG(Embedded System development Management Training Guide)

設計ガイド : ESDR [事例編](Embedded System development Design Reference)

品質向上の勧め バグ管理手法編 : ESBR, テスト編: ESTR

Page 6: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

5© 2016 IPA Software Reliability Enhancement Center

ESxR各ガイドの位置づけ

要求定義

アーキテクチャ設計

ソフトウェア詳細設計

コーディング

単体テスト

結合・統合テスト

システムテスト

How

ESCR(コーディング作法ガイド)

【プロセス定義】【品質指標】

要求仕様書の評価指標

設計書の評価指標

システムの品質評価指標

テスト作業の評価指標

ソースコードの品質評価

経営者

開発担当

マネージャー

マネジメント指針

What

ESDR

ESTR

ESBR

ESQR

ESPR

ESMR

Page 7: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

2. ESCR

Page 8: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

7© 2016 IPA Software Reliability Enhancement Center

ESCRとは

ソースコードの標準化や品質の均一化を進めることを目的とした、組込みソフトウェア向け※

の実用的なコーディング規約を策定するためのガイド

※) ビット並びの順番やメモリの境界といった組込み特有のポイントを考慮している

対象言語 : C言語、 C++言語

対象者 : 規約の作成者、 プログラマー、 レビューアー

ビット位置が意識されたデータに対してはビットフィールドを使用しない

(例) ハードウェアの違いによる影響を回避するルール

組織やプロジェクトごとのコーディング規約を決める際の参考としてご利用いただく

「組込みソフトウェア開発向けコーディング作法ガイド」

Page 9: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

8© 2016 IPA Software Reliability Enhancement Center

コーディング作法ガイド作成の背景

ソフトウェア開発における不具合の分布ソフトウェアの不具合の1/3 はソフトウェア実装工程で作り込まれている

ソフトウェア不具合発生工程別件数比率と発見工程の内訳

発生工程

(2011年度版組込みソフトウェア産業実態調査)

システム設計

ソフトウェア設計

ソフトウェア実装・デバッグ

ソフトウェアテスト

システムテスト

0% 5% 10% 15% 20% 25% 30% 35%

企画・仕様

企画・仕様 システム設計 ソフトウェア設計 ソフトウェア実装・デバッグ ソフトウェアテスト システムテスト

ソフトウェア実装・デバッグ

ソフトウェアテスト

システムテスト

発見工程の内訳

Page 10: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

9© 2016 IPA Software Reliability Enhancement Center

コーディングにおける問題点の例

プログラミング言語の基本的な使い方を理解しただけでは実際のソフトウェア開発

に対応しきれない

・ C言語は記述の自由度が高く技術者の経験の差が出やすい言語のため、記述方法に

対する標準化が必要である

・ 新人研修などをとおして、 コーディングの基本を徹底して学習することが必要

記述ミス例 正しい記述

#define M_STOP 0x01

if (motorStatus & M_STOP != 0){motorStatus &= ~M_STOP;

・・・

#define M_STOP 0x01

if ( (motorStatus & M_STOP) != 0){

motorStatus &= ~M_STOP;

・・・

Page 11: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

10© 2016 IPA Software Reliability Enhancement Center

問題点と解決策

コード品質の向上を阻害している要因コード品質を作り込む過程が効率よく機能していないことが考えられる

コーディングを個人の技量に任せている

第三者のコードレビューが充分に行われない

(形式的なところに集中しがち)

単体テスト工程での品質確保に頼っている

(テスト重視)

流用開発では流用箇所について、旧来のコード品質が引き継がれる

このような問題点をコーディングの段階で回避できるように、 ルール(規約)を定める

Page 12: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

11© 2016 IPA Software Reliability Enhancement Center

コーディング規約を分かりやすくするために

ソフトウェアの品質特性をもとに、 トップダウンに 作法 と ルール を体系化する

作 法 : 品質向上のために守るべき具体的な実装の考え方

ルール : 言語依存性を考慮した具体的なコーディングの決め事

信頼性 保守性 移植性 効率性

コーディング規約にかかわる品質特性

作法

ルール ・・・

品質概念

Page 13: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

12© 2016 IPA Software Reliability Enhancement Center

コーディング規約の表現例

信頼性

R1.1 領域は、初期化してから使用する。

信頼性

R1領域は初期化し、大きさに気をつけて使用する。

R1.1.1自動変数は宣言時に初期化する。または値を使用する直前に初期値を代入する。

選択指針

規約化

void func() {int var1 = 0; //宣言時に初期化する。int i; //宣言時に初期化せず。…var1++;

//使用する直前に初期値を代入。for (i = 0; i < 10; i++) {…

}}

適合例

void func() {int var1;…var1++;…

}

不適合例

自動変数を初期化しないと、その値は不定となり、動作や環境によって演算結果が異なる現象

が発生する。初期化のタイミングは宣言時とする。または使用する直前に初期値を代入する。

コード例

Page 14: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

13© 2016 IPA Software Reliability Enhancement Center

コーディング規約作成の流れ

コーディング規約作成方針の決定

コーディングルールの選択

ルールのプロジェクト依存部分を定義

ルール適用除外の手順を決定

プログラム設計に入る前に、プロジェクト固有のコーディング規約を作成する

例えば、品質特性を考慮する

・ フェールセーフを重視

・ メンテナンス機能を考慮 など

選択指針 (マークなし/ ● / ○) を参考にルール

を選択する

規約化 (選/規/文) に従ってルールを選択する

「規」、 「文」のルールは詳細を確定する

ESCR

Page 15: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

14© 2016 IPA Software Reliability Enhancement Center

ESCR策定の沿革

年 月 内 容

2004年 10月 コーディング作法WG活動開始

2005年 6月 C言語版 (ESCR C) Ver. 1.0 作成開始

2006年 6月 同 出版

2007年 7月 同 Ver. 1.1 出版

多くのユーザに支持いただいている• 組込み系ユーザでは、4割が導入済みもしくは検討中• 品質と生産性の向上に有用との評価

• 書籍およびPDFのダウンロード 3万部以上

2008年 4月 C++言語対応へ活動開始

2010年 11月 C++言語版(ESCRC++)Ver. 1.0出版

2013年 5月 C言語版 Ver. 2.0 作成開始

2014年 3月 同 出版 英語版pdf 7月公開

2014年 6月 ESCRC++改訂活動開始

2015年 4月 C言語版 Ver. 2.0 pdf、 CERT C/CWE対応表 公開

2016年 10月 C++言語版Ver.2.0出版 pdf同時公開(英語版も)

2011年4月

JIS X 0180「組込みソフトウェア向けコーディング規約の作成方法」 として規定

2012年度 「ソフトウェア産業の実態把握に関する調査」

Page 16: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

3. ESCRC++の改訂

Page 17: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

16© 2016 IPA Software Reliability Enhancement Center

ESCRC++の改訂について

ESCR C++改訂の背景

現行版の言語規格は2003年版であり、新しい規格(C++11, C++14)に準拠する

ESCR C言語版を改訂したため、それとC++言語版とで整合をとる

セキュリティに関して対応する

MISRA C++ が改訂を計画しており、これと合わせたい

セキュリティへの対応

ESCR Ver.2.0での対応

JIS X 0129の後継である25010 でセキュリティが特性に格上げされた

→ 説明を追加するが、セキュリティ特性は採用せず

(セキュリティは、基本的には設計段階の特性と考え、 バッファオーバフローなど セキュリティに

影響するコーディングもある とする)

脆弱性との対応付け、CERTC コーディングスタンダードとの対応づけを明確化する

ESCR C++の改訂でもこの方針を踏襲する

Page 18: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

17© 2016 IPA Software Reliability Enhancement Center

C++の概要

Bjarne Stroustrupが AT&T Bell Lab. 時代に開発

SIMULAの影響を受けた C with Classes から、 C++へ発展

初期のクラスによる抽象化から、 最近はテンプレートによる抽象化(生成的プログラ

ミング、 テンプレートメタプログラミング、 …)による言語拡張に力を入れている

Page 19: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

18© 2016 IPA Software Reliability Enhancement Center

C++の歴史

’70 ’80 ’90 ‘00 ’10

C with Classes (’79)

Boost (’99~)

ISO C++14 (’14)ISO C++03 (’03)バグ修正版

メジャーバージョン

ISO C++11 (’11)ISO C++98 (’98)

「The C++ Programming Language, 1st ed. 」 (’85)

「The C++ Programming Language, 2nd ed. 」 (’91)

「The C++ Programming Language, 3rd ed. 」 (’98)

「The C++ Programming Language, 4th ed. 」 (’13)

Page 20: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

19© 2016 IPA Software Reliability Enhancement Center

最近のC++によるコード

constexpr auto size() -> int { return(3); }

template<typename T, int N>

auto map(std::array<T, N> v, std::function<void(int)> f) -> void {

for(auto x : v) { f(x); }

}

auto main() -> int {

const char *s = ", ";

std::array<int, size()> v {3, 2, 1};

map(v, [s](int x){ std::cout << x << s; });

std::cout << '¥n';

}

vの要素にfを適用

「3, 2, 1, 」を出力

Page 21: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

20© 2016 IPA Software Reliability Enhancement Center

言語仕様の変更

C++11

統一的な初期化記法

型推論(auto)

定数式(constexpr)

範囲for文

nullptr

enum class

静的assert

ユニコード, long long

alignof, alignas

raw文字列

関数返却値型の後置構文

右辺値参照、ムーブセマンティクス

ラムダ式

可変引数テンプレート

型の別名(using)

noexcept

属性構文(noreturn, 他)

委譲コンストラクタ

クラス内メンバ初期化

default, delete指定

明示的変換演算子

オーバーライドの制御(override, final)

メモリモデル

スレッド局所ストレージ

C++14

バイナリリテラル

数値セパレータ

関数返却値型推論

ポリモルフィックラムダ

変数テンプレート

Page 22: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

21© 2016 IPA Software Reliability Enhancement Center

ESCR改訂WGの活動内容

期間

2014年6月~2016年6月

改訂の方針

関連文書 (ESCR C言語版Ver. 2.0, C++言語規格(C++11/C++14)など)の改版に対応それ以外の大きな変更は実施しない

ルールの対象範囲などは第1版と同じとし、次の方針で作成する 「設計」には踏み込まない(コード記述のレベルを基本とする)

ルールの対象範囲は次を除く

* ライブラリ関数 * メトリクス * コーディングミス

* テンプレートを作成するためのルール

ルールの説明について、詳細は参考文献へのポインタをつける

セキュアコーディングガイドラインとの協調を図る

パブリックコメント実施(2016年5月)

ご指導:筑波大学 名誉教授 中田 育男 先生

Page 23: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

22© 2016 IPA Software Reliability Enhancement Center

改訂箇所のまとめ

追加ルール

C++11仕様に対応したもの : 5(作法詳細 : 4)

ESCR C言語版と整合させたもの : 2

その他(改善) : 1

修正ルール (軽微なものはカウントしない、重複あり)

C++11仕様に対応したもの : 24

ESCR C言語版と整合させたもの : 25

監修、パブリックコメントなどによる改善(例の修正を含む) : 9

削除ルール

不要または重複と判断したもの(ESCR C言語版と整合) : 2

作法・ルール Ver.2.0 Ver. 1.0

信頼性

作法概要 3 ←

作法詳細 23 21

ルール 65 60

保守性

作法概要 5 ←

作法詳細 30 29

ルール 82 82

移植性

作法概要 2 ←

作法詳細 7 6

ルール 16 15

効率性

作法概要 1 ←

作法詳細 1 ←

ルール 10 ←

ESCR C++ のルール数

Page 24: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

23© 2016 IPA Software Reliability Enhancement Center

改訂項目の例(1)

ルールの修正

範囲forループ

… ある範囲内の全要素の処理を簡潔に書く新ループ形式

範囲forループの使用を推奨する

スコープenum

… 要素名がスコープ外から見える、大きさを指定できない、など 従来のenumの問題を解決

enum型 → スコープenumも含んだ列挙型 とする

R1.2.2, M1.10.1 なども

R3.1.2配列を順次にアクセスするループの継続条件には、配列の範囲内であるかどうかの判定を入れるただし、 配列の先頭から順次にアクセスするループには範囲forループを用いる

int v[ ] = {1, 2, 3, 4, 5};

for (auto x : v) …

M2.2.4 関連する定数を定義するときは、列挙型を使用する

enum class Color : char {RED, GREEN, BLUE

};

Color c = Color::RED;

Page 25: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

24© 2016 IPA Software Reliability Enhancement Center

改訂項目の例(2)

ルールの修正(つづき)

定数式(constexpr)

… 最終結果が定数になる計算に関して、コンパイル時に計算を行うことを指定

定数の定義について、スコープenum

と合わせてconstexprの使用を推奨する

M1.10.1 意味のある定数は、名前つきの定数として定義して使用する

constexpr int MAXCNT = 8;

if (cnt == MAXCNT) {…

constexpr int fac(int n) {if (n == 0) return 1;else return n*fac(n-1);

}

int a[fac(3)]; //定数なので宣言に使用可

Page 26: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

25© 2016 IPA Software Reliability Enhancement Center

改訂項目の例(3)

新ルールの追加

信頼性作法 : 動作が保証された書き方にする

スレッドへの対応 作法詳細 : スレッドもしくはシグナルを用いたプログラムでは、共有データのアクセス方法に

気をつける

ラムダ式… 無名関数(ラムダ式)を定義可能

作法詳細 : (信頼性)ラムダ式の動作に気をつける

使用に対する注意を促す方向でルールを設定

R3.10.1ラムダ式では、デフォルトのキャプチャーモードを利用せず、利用する局所名はすべて明示する

R3.11.1 並行処理ではvolatileではなく std::atomic を利用する

R3.11.2同一領域に割り当てられる可能性のあるビットフィールドに対して複数スレッドによるアクセスは行わない。もしくは、適切な排他制御を行う

void foo() {auto c = 0;auto inc = [&c](int n) { c += n; };inc(10);

} ラムダキャプチャ(外側関数の変数を参照可能)

Page 27: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

26© 2016 IPA Software Reliability Enhancement Center

改訂項目の例(4)

用語の修正 キーワード auto

変数や関数の型をコンパイラが自動補間する機能

以前のC++規格では auto は変数が自動変数であることを示すものであったが、 ほとんど利用されていなかった

列挙型 …スコープenum への対応

削除したルール

ESCR C Ver. 2.0 での改訂と同じ

R3.1.3 continue文を使用してはならない

M4.7.4#ifで マクロ名が定義済みかを調べる場合は、 defined(マクロ名) により定義済み

かを調べる。 #if マクロ名 という書き方をしない

ESCR C改訂時、本ルールは不要と判断

同様の内容であるM4.7.3にマージした

auto x = 1; //1 は int型なので、

// x の型は int

auto y = f(); // y は f の返却値型

Page 28: 最新版ESCRC++ Ver 0の紹介©2016IPA Software Reliability Enhancement Center 最新版ESCRC++ Ver.2.0の紹介 独立行政法人情報処理推進機構 (IPA) 技術本部ソフトウェア高信頼化センター

ESCRC/C++をご活用ください

ISBN 978-4-905318-23-1

定価 本体1,619円 (税抜)

IPA直販とAmazonでご購入いただけます

2014年3月改訂

ISBN 978-4-905318-47-7

定価 本体1,389円 (税抜)

IPA直販とAmazonでご購入いただけます

2016年10月改訂