Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
製品開発の成功に貢献する高コード品質を実現するためのキーポイントと解析ツールを知る
IARシステムズ 技術部 岩野歩
Agenda
-インスペクション-静的コード解析
-トレース-プロファイリング-コードカバレッジ
インスペクション
インスペクションとは
• ソフトウェア開発プロジェクトで作成された成果物(仕様書やプログラムなど)を、実際に動作させることなく人間の目で見て検証する作業
要求定義
基本設計
詳細設計
コーディング
単体テスト
結合テスト
システムテスト
動的解析アドオンツールC-RUN
実行時にしか検出出来ない、バッファオーバーフローやヒープ、メモリリークを検出する事が出来ます。
静的解析アドオンツールC-STAT
MISRA-C,CWE およびCERT C/C++の100以上のルール検査を行います。
状態遷移設計ツールIAR Visual State
統一モデリング言語(UML)ステートマシンのサブセットをベースとする、グラフィカルなステートマシン設計し、C/C++コードを自動生成します。
Arm JTAGエミュレータ(ICE)I-jet/I-jet Trace/I-scope
必要なデバッグ機能に対応した、JTAGエミュレータ(ICE)と電力測定オプションを提供しています。
発見×不具合発生
発見×不具合発生
×不具合発生
×不具合発生
発見
インスペクションのスタイル
• フェイガンインスペクション– 責任者としてモデレーターが任命され、インスペクション作業全体を統括する– 開発にかかわる全ての文書・コードをチェックする– 検出した欠陥をログに保管し、修正が行われたことを追跡調査する
• チームレビュー– チーム全体の成果物をレビュー– チーム内の合意形成を実現する
• ウォークスルー・ピアレビュー– 個々のモジュールをレビュー– 有効なプロセス:プルリクエスト(レビュー担当者のチェックなしでMerge不可)
厳格
カジュアル
コードインスペクションのための3つのアプローチ
•コードレビュー•ペアプログラミング•自動インスペクション
コードレビュー• 利点
–コード品質の改善
–知識の共有
–潜在的なバグの発見
• 課題–自分の作業を中断して、レビューのための時間を作る必要がある
–時に、コードの意図を理解するのに時間がかかる
ペアプログラミング• 利点
–よりよい解決方法を見つける
–知識共有、バスファクターの向上
–スキル向上
• 課題– 2人で一つのコード開発行うことによる生産性の低下
–ペアの組み合わせによってうまくいかない場合もバスファクター(bus factor): プロジェクトのメンバーが、バスに轢かれて突然いなくなっても何人まで問題がないかをあらわす指標
自動インスペクション
•機械にコードレビューをさせること
•コードレビューの頻度に制限がない
•レビュー結果の再現性が高い
Cartoon licensed under CC-BY-3.0 http://geek-and-poke.com/
静的コード解析
静的コード解析•潜在的なエラーや脆弱性、移植性の問題等を発見することを目的とした、ツールを使用した解析手法
•コーディングスタイルや言語サブセット(MISRA-Cなど)に準拠させるために使用することもできる
•あらゆる組込み開発に強く推奨される•機能安全分野では多くの認証において必須
MISRAとは
• Motor Industry Software Reliability Association–組込みコードの安全性と信頼性を向上させるための標準規格を推進するコンソーシアム
–MISRA-C とは:oC言語規格の一部の未定義の動作を回避する言語サブセット
oコーディング標準の基礎
プログラミング言語の問題C言語規格:あえて厳密に仕様を定めず→ソフトウェアをCPUやOSの種類にかかわらず移植できるようにするため
22項目
静的記憶域の初期化方法及び時期
浮動小数点型の表現
・・・
未規定C言語規格で規定されてい
ないもの
76項目
charがsignedかunsignedか。
整数除算における剰余の符号
・・・
処理系定義どうなるかは
処理系が決める項目
97項目+5予約済みの外部識別子を再定義している場合
演算結果が与えられた記憶域で表現出来ない値を生じる場合
未定義誤った記述の場合に結果の
決まりがないもの
・・・
IARシステムズでは C-STAT を提供• IAR Embedded Workbenchに完全統合• 柔軟な適用ルール選択 と ルールセットのエクスポート/インポート• チェック項目・エラーメッセージの詳細なドキュメント• C-STAT は以下をサポート:
– CWE/CERTに基づく100以上のルール/~250個のチェック項目– MISRA-C 2004– MISRA-C 2012– MISRA-C++ 2008
MISRA-C 2012チェック項目例• Rule-2.1: (Required) A project shall not contain unreachable code (必要)プロジェクトは到達不可能なコードを含んではならない
C-STATのチェック項目2.1_a:
switchケース文で到達しないケース2.1_b:
決して実行されないアプリケーション部分
void example(void) {int x = 42;
switch(2 * x){case 42: //unreachable casebreak;
case 82:return;printf(“Hello!”); //This line cannot
execute.default:break;
}}
MISRA-C 2012チェック項目例• Rule-13.6:(Mandatory) The operand of the sizeof operator shall
not contail any expression which has potential side effects(必須)sizeof演算子のオペランドには、潜在的な副作用がある式を含んではならない。
C-STATのチェック項目13.6:
sizeof演算子の演算子が潜在的な副作用がある式を含んでいるか
Void example(void) {int i = 0;int size = sizeof(i++);
}
void example(void) {int i = 0;int size = sizeof(i);i++;
}
sizeof演算子のオペランド内の式は評価されない!
コーディングルールを適用するにあたって• 全てのコーディングルールに盲目的に従ってはならない
–全てのルールが適用する必要があるとは限らない–ただし、なぜそのルールを逸脱することができるかを明確にする必要がある
C-STATのCERTチェック:IARが長い歴史で組込み分野において重要なもの約250個を抽出⇒ 組込み開発において効率よく品質向上可能
静的解析アドオンツール C-STATの効果的な利用方法
1.各開発者の手元で随時実行し品質向上
2.逐次フィードバックで開発者スキル向上
3.複数の解析ツールを組み合わせリスク検出率向上
1. 各開発者の手元で解析実行して、品質対応効率を向上
解析サーバ
開発 解析 修正 開発
修正 開発 修
正
C-STAT C-STAT
解析 修正 開発 修
正 開発 修正
C-STAT C-STAT
・他コードへの副作用発生・次回レポートまで修正確認できない
新規コードについての修正 C-STATが検出しなかったリスクの修正
従来
解析サーバ継続解析
開発
・思い出しながら修正
2. 逐次フィードバックで、コーディングスキルを向上
C-STATを運用することで、コーディングしながら逐次フィードバック
C
コーディング C-STAT 修正 C-STAT コーディング C-STAT
あれ? ふむふむ 解消したなるほど
修正
3.複数の静的解析ツール導入で、リスク検出率を向上
静的解析ツールによって、検出アルゴリズムは異なる
C 静的解析ツール AC-STAT
複数ツール運用でダブルチェック 「機能安全」本来の品質向上に貢献
トレース
トレース
トレースなしの場合デバッグに必要な十分な情報が得られない
トレースありの場合時間をさかのぼって動作を評価することが可能になる
バグ発生 ブレイクTime
トレースなし
トレースありトレース情報
~103 … ~106命令情報
SWOトレース vs. ETMトレース
• 「トレース」と言えば、一般的にはETMトレースを指す• SWOトレース
– Arm Cortex-Mの低速トレースオプション– 全ての命令が取得できる保証はない– オンチップのバッファを使用(~2kB)– ほとんどのCortex-M3/M4/M7チップはSWOあり
• ETMトレース– 高速トレースインタフェース– デバッグプローブ内に大容量バッファをもつ– すべてのMCUがETMモジュールを持つわけではない
トレースタイミング
main()
sub_1()
sub_2()
main()
sub_1()
sub_2()
SWOトレース
ETMトレース
トレース情報が取得できない
一定間隔でサンプリング
プログラムが分岐するタイミングでトレースバッファに出力
コード プロファイリング
組込み開発における性能課題• データ/スティミュラス(シミュレーションパターン)の処理速度がアプリケーションの目標を達成するのに十分でない
• 割込み処理に非常に長い時間がかかっている
• バッテリーの消耗が激しい
• コードリファクタリングの必要性を見極めたい
コードをプロファイルする理由
• 頻繁に実行される「ホットスポット」を特定できる–コード上のボトルネック発見でとれる対応
o実行速度最適化オプションでコンパイル
o関数で使用するデータをより効率の良いメモリ内に移動する
• タスクや割り込みでの過度なコンテキストスイッチを識別できるo優先順位の見直し
ETM プロファイリング
• 下記2つの方法がある:– フラット トレースデータ (命令フルトレース)
– コール トレースデータ (関数呼び出し・リターン)
フラットトレースとコールトレース• フラットトレース:
– 命令フルトレースの各命令は、関数読み出しやリターンに関係なく、対応する関数に割り当てられる
– ボトルネックの特定に適する– RTOS使用時や、完全なデバッグ情報を持たないコードをプロファイリングする場合にも有効
– サンプリングトレース、ETMトレース、シミュレータトレースで利用可能
• コールトレース:– 命令フルトレースを解析し、全ての関数の呼び出しとリターンを判定– 過度なコンテキストスイッチを見つけるのに適する– ETMトレースとシミュレータトレースで利用可能
関数プロファイラ:フラットトレースを使用した処理性能向上の手順
関数内部で消費された時間(PCのアドレスが関数のスコープ内にあったかを検出)
フラットトレースでは、実行を止めずにリアルタイムにトレース情報を表示可能 ※EWARM 8.40.1以降
1. サイズが最も小さくなる最適化レベルを探す最適化:高(サイズ)
2.関数プロファイラで最も時間のかかっている関数を見つける
3.特定した関数に速度優先の最適化をかける#pragma optimize=no_size_constraints
4.メイク・実行し性能が向上していることを確認
5. サイズの増加が許されるまで2番目、3番目と、時間のかかる関数に対して上記を繰り返す
関数プロファイラ:コールトレース関数内部で消費された時間
関数から呼び出した関数も含めた消費時間
コード カバレッジ
なぜコードカバレッジが必要か?
• コードのすべての行を実行したか判別できる– テストマトリックスの検証
– テストケースの特定
– 到達不可能部分(デッドコード)の特定
– ほとんどの認証において必須
• コードを通してパス解析を行うのに役立つ• アプリケーションの循環的複雑度の理解を深める
コードカバレッジ• 手段
– ETMトレース– シミュレータ
• ETMトレース:– ETM上でリアルタイムにコードカバレッジ取得可能(EWARM8.40以降)
– I-jet Traceにて接続– エディタ上と逆アセンブリ画面でカバレッジを表示– 条件分岐が常に通っているか一度も通らないか表示
• シミュレータ– 自動化と割込みシミュレーションのためにC-SPYマクロを利用– CIインタフェース向けにコマンドラインでの実行も可能
循環的複雑度(Cyclomatic complexity)
• ソフトウェア測定法の一種でプログラムの複雑度を測るのに使われる– CCN(Cyclomatic complexity Number)値を算出して複雑度を測る
• プログラムのソースコードから、線形的に独立した経路の数を直接数える– if, for, while, switchなどの分岐が多いほど値が高くなる
• コードのどの部分が相互依存しすぎているかを識別できる
なぜ複雑度を考慮する必要があるのか?
• テストケースの数が増える– テスト作成や実施に時間がかかる
• 複雑なコードであればあるほど、修正や変更が困難– 相互依存関係は、コードに多くの触手があることを意味する
– デグレが発生する可能性が高く、テストはより困難に
コードカバレッジは、コードの複雑度を理解するのにも適している
エディタ上でもコードカバレッジ画面でもリアルタイムに状況を表示(EWARM8.40以降)→テストしたい箇所のカバレッジ状況を、動作させながら確認可能
タイムラインウィンドウを活用しましょう
• アプリケーション全体のプロファイルを表示- 割込みログ、データログ、イベントログ、コールスタック
• SuperSpeed USB 3.0 インタフェース対応 (5 Gbps) • USB 2.0 準拠(480 Mbps)• 動作電源はUSBポートより供給のため外部電源不要• I-jet Traceからターゲットへの電源供給可能:最大600mA(過電流保護付き)
• 自動コア認識• JTAG, SWD, ターゲット消費電流測定
I-jet Trace for ARM Cortex-A/R/M
トレース機能• 最大256MBのトレースメモリ• 最大16-bit幅のトレースデータ収集• 最大350MHzのETMトレースクロック• 正確なタイミング解析可能なCPUサイクル精度の64-bitタイムスタンプ• 各ビットごとのパラレルトレースデータ スキューを自動アライメントすることにより、PCBレイアウトや信号経路によるデジタル信号問題を補完
• ノイズの多い環境や終端処理されていないターゲットボードから、最も信頼できるキャプチャを得るための、トレースデータおよびクロック電圧閾値の自動補正
• 1.2Vから5Vまでのトレースロジックレベルに対応
Summary• 自動インスペクションはコード品質を改善するために適した方法である
• 静的コード解析により、起こりうる問題を効率的に見つけることができる
• コード内のホットスポットを特定するために、プロファイリングを使用する
• コードカバレッジのストリーミングトレースにより、無期限のテスト実行が可能
Thank you for your attention!
iar.com/jp