組込みソフトウェア開発のためのコード静的解析...2020/05/20 · 3 $0.00...
TRANSCRIPT
1© 2020 The MathWorks, Inc.
組込みソフトウェア開発のためのコード静的解析
MathWorks Japan
アプリケーションエンジニアリング部 (制御)
アプリケーションエンジニア
田中 康博
2
組込みソフトウェア開発の現状ソフトウェアの大規模化・複雑化でコードは1億行を超える
https://www.meti.go.jp/shingikai/mono_info_service/jido_soko/jinzai_senryaku/pdf/2018_002_00.pdf
1億行
自動車ソフトウェアのソースコード行数
今後さらなる増加
組込みソフトウェア(自動車など)開発の現状
出典:経済産業省 「ITによる生産性向上の加速化に向けて」
– 複雑な仕様と膨大なコード
– 絶対的な信頼性が必要 (自動運転など)
– 人手によるテストは限界に
3
$0.00
$4,000.00
$8,000.00
$12,000.00
$16,000.00
Requirements Design Coding Testing Maintenance要件定義 設計 実装 テスト 保守
変更容易性
変更コスト開発のピークを前倒しする
現状理想
開発後期でのバグ検出の危険性バグの早期発見/作り込み抑制による開発の効率化が重要
要件定義
基本設計
実装
単体テスト
結合テスト
システムテスト
詳細設計
手戻りによる開発の遅延 開発コストの増大
$139.00 $455.00 $977.00
$7,136.00
$14,102.00
$0.00
$4,000.00
$8,000.00
$12,000.00
$16,000.00
Requirements Design Coding Testing Maintenance
Software Development Lifecycle PhaseSource: B.Boehm and V. Basili :Software Defect Reduction Top 10 List", IEEE Computer
Cost Per Bug
要件定義 設計 実装 テスト 保守
バグ1件あたりのコスト
静的解析による• バグの作り込みの抑制• バグの早期発見• コードの安全性の証明
手戻り
開発の流れ
手戻り
手戻り
4
なぜ静的解析を行うのか?テストケース作成・デバッグ不要でバグを検出
▪ バグの作り込みの抑制 (ルールチェッカー)
– コーディングルールの準拠性チェック
▪ 宣言の不一致、未初期化変数 など
– コードメトリクスの測定
▪ コードの規模、複雑度測定 など
▪ バグの早期発見 (バグチェッカー)
– バグ、セキュリティ脆弱性の検出
▪ メモリリーク、汚染されたポインターの使用 など
▪ コードの安全性の証明 (ランタイムエラーチェッカー)
– ランタイムエラー(実行時エラー) が存在しないことを証明
▪ 整数オーバーフロー、ゼロ除算 など
▪ ランタイムエラーの特徴
– プログラム実行時に発生するソフトウェアのバグ
– 稀にしか発生せず再現性の低い場合があり、
テストでの発見が難しい
▪ ランタイムエラーのもたらす危険性
– オーバーフローによるロケットの爆発
– 医療機器の致死量放射線の照射
プログラムのクラッシュや暴走等をもたらし、
故障の原因となる致命的なエラー
ランタイムエラー
5
Polyspace Code Prover
コードの安全性の証明
• ランタイムエラーを検出する
• ランタイムエラーの有無を証明する
• 機能安全をサポートする
Polyspace Bug Finder
バグの作り込みの抑制
バグの早期発見
• コードメトリクスを測定する
• コーディングルールの準拠性を確認する
• バグとセキュリティ脆弱性を検出する
Polyspace
コードメトリクス測定
コーディングルール /サイバーセキュリティ
ガイドライン準拠性確認
バグおよびセキュリティ脆弱性
検出
重大な欠陥および脆弱性の
欠如の証明
6
アジェンダ
▪ 堅牢なセキュアコーディングと安全性の証明
– バグの作り込みの抑制
– バグの早期発見
– コードの安全性の証明
▪ 解析の自動化と結果の共有
▪ モデルベースデザインのためのコード静的解析
▪ ユーザー事例 / まとめ
7
アジェンダ
▪ 堅牢なセキュアコーディングと安全性の証明
– バグの作り込みの抑制
– バグの早期発見
– コードの安全性の証明
▪ 解析の自動化と結果の共有
▪ モデルベースデザインのためのコード静的解析
▪ ユーザー事例 / まとめ
8
コーディングルールチェック潜在バグを早期発見、コードの可読性と保守性を向上
▪ MISRA C: 2004 チェッカー
▪ MISRA C: 2004 AC AGC チェッカー
▪ MISRA C: 2012 チェッカー
▪ MISRA C++: 2008 チェッカー
▪ JSF C++ チェッカー
▪ AUTOSAR C++14 チェッカー
▪ カスタム ルール チェッカー
ダッシュボード(違反数が最も多いルール Top10)
▪ 検証結果のレビュー
– コードにレビューコメントを記入
– GUI上でレビューコメントを記入
▪ レビューコメントのインポート
– 前回の解析結果 からインポート
– MISRA C: 2004 から 2012 へインポート
▪ レポートの自動生成
– PDF/HTML/Wordをサポート (日本語/英語)
– レビューコメントの反映
– 検証結果のフィルター
9
サイバーセキュリティについての国内の取り組み
https://www.mlit.go.jp/common/001268577.pdf
出典:交通政策審議会陸上交通分科会自動車部会自動運転等先進技術に係る制度整備小委員会報告書(概要)
10
自動車業界に見られるコーディング標準&実践
◼ CERT C / CERT C++:セキュアコーディングスタンダード
◼ ISO/IEC TS 17961:Cセキュアコーディングルール
◼ CWE:共通脆弱性タイプ
◼ MISRA-C:2012 Amendment 1:セキュリティガイドライン
サイバーセキュリティ – 業界活動と標準
11
コードメトリクスコードの品質を定量的に測定
▪ プロジェクト メトリクス (8)– 再帰の数
– 直接再帰の数
– ファイルの数
– ヘッダー ファイルの数
– 最大スタック使用量のプログラミング *1
– 最小スタック使用量のプログラミング *1
– 保護されている共有変数の数 *1
– 保護されていない可能性のある
共有変数の数 *1
▪ ファイル メトリクス (4)– コメント密度 *2
– 推定の関数結合
– コメントなし行の数
– 行数
▪ 関数 メトリクス (19)– 呼び出し元関数の数
– 呼び出された関数の数
– 本体内の行数
– 実行可能行数
– GoTo ステートメントの数
– 呼び出しレベルの数
– ローカルの静的変数の数
– ローカルの非静的変数の数
– ローカル変数サイズのより高い推定値
– ローカル変数サイズのより低い推定値
– 最大スタック使用量 *1
– 最小スタック使用量 *1
– 呼び出しの発生数
– 関数パラメータ―の数
*1:Code Proverで測定可能*2:しきい値は下限値下線:HISコード複雑度メトリクス
https://jp.mathworks.com/help/bugfinder/metrics-reference.html
関数メトリクスの測定例
– パスの数
– Return ステートメントの数
– 命令の数
– 循環的複雑度
– 言語スコープ
Polyspace Bug Finder:コード メトリクス
12
アジェンダ
▪ 堅牢なセキュアコーディングと安全性の証明
– バグの作り込みの抑制
– バグの早期発見
– コードの安全性の証明
▪ 解析の自動化と結果の共有
▪ モデルベースデザインのためのコード静的解析
▪ ユーザー事例 / まとめ
13
数値▪ ゼロ除算、オーバーフロー
▪ …
静的メモリ▪ 配列の範囲外アクセス
▪ …
動的メモリ▪ メモリリーク
▪ …
データフロー▪ 部分的にアクセスされる配列
▪ …
リソース管理▪ 読取り専用リソースに書込み
▪ …
オブジェクト指向▪ コンストラクターで未初期
▪ …
プログラミング▪ 宣言の不一致
▪ …
同時実行▪ デッドロック
▪ …
適切な手法▪ 未使用のパラメータ
▪ …
パフォーマンス▪ string長の計算が非効率
▪ …
https://jp.mathworks.com/help/bugfinder/defect-reference.html
セキュリティ脆弱性・バグ検出項目 (抜粋)開発プロセスの初期段階でバグを検出、影響度別に分類
▪ 影響度別にバグを分類
▪ バグ、関連コードの強調表示
▪ イベント追跡
– 制御フローの主要なポイントを表示
▪ 関数呼び出しツリー
– 呼び出し元/先の表示/非表示
– スタブ化されているかどうかの判断
セキュリティ▪ 疑似乱数発生器が脆弱
▪ …
汚染されたデータ▪ 汚染されたポインターの使用
▪ …
暗号化▪ 脆弱な暗号アルゴリズム
▪ …
バグ セキュリティ脆弱性 デバッグ
Polyspace Bug Finder:欠陥
14
アジェンダ
▪ 堅牢なセキュアコーディングと安全性の証明
– バグの作り込みの抑制
– バグの早期発見
– コードの安全性の証明
▪ 解析の自動化と結果の共有
▪ モデルベースデザインのためのコード静的解析
▪ ユーザー事例 / まとめ
15
Polyspace Code Prover でコードの安全性を証明全ての実行パスの結果を証明する!
▪ Quality(品質)– ランタイムエラーの証明
– 測定、向上、管理
▪ Usage(使用方法)– コンパイル、プログラム実行、テストケースは不要
– 対応言語:C/C++/Ada
▪ Process(プロセス)– ランタイムエラーの早期検出
– 自動生成コード、ハンドコードの解析可能
– コードの信頼性を測定
static void pointer_arithmetic (void) {
int array[100];
int *p = array;
int i;
for (i = 0; i < 100; i++) {
*p = 0;
p++;
}
if (get_bus_status() > 0) {
if (get_oil_pressure() > 0) {
*p = 5;
} else {
i++;
}
}
i = get_bus_status();
if (i >= 0) {
*(p - i) = 10;
}
}
Dereference of local pointer ‘p’(pointer to int 32, size: 32bits):
Points to 4 bytes at offset 400 in buffer of 400 bytes, so is outside bounds.
グリーン:正常ランタイムエラーが存在しない
レッド:エラー実行される度にランタイムエラー
グレー:デッドコード無実行
オレンジ:Unproven条件によってランタイムエラー
パープル:ViolationMISRA-C/C++, JSF++
変数値範囲ツールチップ
実機実験前にコード信頼性を確保して手戻りを削減
16
MISRAルール違反の安全性の証明
Polyspace Code Prover
MISRAルール違反
安全性の証明(オーバーフロー無し)
MISRAルール違反の正当化の根拠としてPolyspaceを活用可能
17
▪ コーディング規約– MISRA-C
– MISRA-C++
– JSF++
▪ ソフトウェアメトリクス– HIS Source Code Metrics
▪ http://www.automotive-his.de/
▪ 認証規格– DO-178C
▪ DO Qualification Kit
– IEC 61508, ISO 26262, EN 50128,
IEC62304, ISO 25119
▪ IEC Certification Kit
TÜV SÜD社より各機能安全規格のツール認証を取得済みPolyspace製品で目標規格達成をアシストします!
18
アジェンダ
▪ 堅牢なセキュアコーディングと安全性の証明
– バグの作り込みの抑制
– バグの早期発見
– コードの安全性の証明
▪ 解析の自動化と結果の共有
▪ モデルベースデザインのためのコード静的解析
▪ ユーザー事例 / まとめ
19
Polyspace Access製品
▪ チームベースのコラボレーション– Chrome, Edge, Firefox, Safari
– 解析結果 / ソースコードをブラウザで表示
– デバッグ情報の表示
– 担当者の割り当て, 解析結果の正当化
▪ ソフトウェア品質の管理– ダッシュボードで品質と問題を監視
– コードメトリクス、SQO
– バグの傾向追跡
▪ 規格遵守の追跡– 標準への進捗状況を追跡
– 標準からの逸脱を正当化
– MISRA, CERT-C など
Polyspace Bug Finder Access and Polyspace Code Prover Access
チケット作成
ソースコード表示
解析結果表示
ダッシュボード
20
ワークフロー:解析の自動実行
Bug Finder
Server
Code Prover
Server
解析結果アップロード
Server Web Browser
コマンドラインI/F
Bug Finder
Access
Code Prover
Access
Webサーバー
Source code
RepoBug Finder
Desktop
開発担当者
開発担当者
品質管理者
マネージャー /チームリーダー
レビューワー
4
開発担当者
1
スタンドアロン解析5
コードチェックイン
3
GUIコマンドラインI/FIDEプラグイン
2 解析実行
オンラインレビュー
Server
✓ Polyspace Bug Finder Server
✓ Polyspace Code Prover Server
Desktop
✓ Polyspace Bug Finder
Access
✓ Polyspace Bug Finder Access
✓ Polyspace Code Prover Access
ツール担当者
21
アジェンダ
▪ 堅牢なセキュアコーディングと安全性の証明
– バグの作り込みの抑制
– バグの早期発見
– コードの安全性の証明
▪ 解析の自動化と結果の共有
▪ モデルベースデザインのためのコード静的解析
▪ ユーザー事例 / まとめ
22
モデルベースデザインとの統合Polyspaceで自動生成コードの品質と、ハンドコード結合時の品質を確保
ソフトウェア要件定義
ソフトウェアアーキクチャ
実装モデル自動生成
C/C++コードオブジェクト
コード
設計書ハンド
C/C++コード結合
C/C++コードオブジェクト
コード
モデルベースデザイン
組込みソフトウェアのテスト
Polyspace
アプリケーション
ミドルウェア/デバイスドライバ ソフト全体
‧ コーディングルール準拠の解析‧ コードのサイズと複雑度メトリクスの決定‧ ソフトウェア品質メトリクスの決定
‧ 到達不能コードの解析‧ 関数呼び出しツリーの作成‧ グローバル変数の競合解析‧ ソフトウェア品質レポートの作成
モデルベースデザイン・ワークフローでのコード静的解析
23
モデルベースデザインとの統合PolyspaceのSimulink連携機能でモデル修正が容易
Polyspace
▪ Simulink®環境からPolyspace解析を実行
▪ Polyspace解析結果を該当ブロックで強調表示
▪ ブロックにPolyspaceの注釈を追加
▪ S-Functionコードの検証
▪ MISRA C のチェック
24
アジェンダ
▪ 堅牢なセキュアコーディングと安全性の証明
– バグの作り込みの抑制
– バグの早期発見
– コードの安全性の証明
▪ 解析の自動化と結果の共有
▪ モデルベースデザインのためのコード静的解析
▪ ユーザー事例 / まとめ
25
Polyspace ユーザー事例医療、航空、自動車など様々な分野で利用されています
日産自動車ソフトウェアの信頼性向上
ソーラー・インパルスコード証明のよる開発期間の短縮
FordSW開発プロセスに統合
miracor医療機器の安全性を証明
TGV高速鉄道
ランタイムエラーの識別加速
アレーニア・アエルマッキMISRA-C, DO-178B準拠
26
重要なコードを安全かつセキュアにする
バグの作り込みの抑制
‧ MISRA、CERT-C、CWE、ISO/IEC 17961 などの準拠性をチェック
‧ コードの規模や複雑度など特定の側面を定量的に測定
バグの早期発見
‧ テストケースやコードを実行することなくバグ・セキュリティ脆弱性を検出
‧ バグを影響度別に分類し、効率的に品質を向上
コードの安全性の証明
‧ 致命的なランタイムエラーが存在しないことを形式的に証明
‧ 安全規格を満たし、ISO 26262、IEC 61508、DO-178への準拠を文書化
27
Polyspace 技術資料のご案内
組込みソフトウェアの安全性とセキュリティを高める7つの方法
• 安全でセキュアな組込みアプリケーション (自動運転、飛行制御、医療機器など) を開発する方法を学びます。
Polyspace製品を使用した包括的な静的解析
• 組込みソフトウェアの検証における課題を解決するソリューションをご紹介します。
ランタイムエラーが存在しないコードの証明 形式検証を用いた静的解析4つのメリット
eBook
WhitePaper
• 抽象解釈を用いた静的解析のメリット、世界中で採用されている事例をご覧ください。
WhitePaper
▪ 30日無料の評価版を試す jp.mathworks.com/trial
▪ 製品、サービスのお見積もり jp.mathworks.com/quote
▪ お問合せ jp.mathworks.com/contact