Comments
Description
Transcript
ソフトウェアサプライチェーンを統制する 大阪編
ソフトウェアサプライチェーンを統制する 大阪編 テスト自動化技術と ソフトウェアコードメトリクスを用いたコードガバナンス コベリティ日本支社 安竹由起夫 デベロップメントテスト 早期のバグ修正で後工程の手間をいかに減らすか 設計 開発 5倍のコスト 2 QA 10倍のコスト 製品リリース & 管理 30倍のコスト デベロップメントテスト 早期のバグ修正で後工程の手間をいかに減らすか 早い段階で不具合を除去 設計 開発 5倍のコスト 3 QA 10倍のコスト 製品リリース & 管理 30倍のコスト 品質とセキュリティを 開発の内部ループに組み込んでいく テスト コード 夜間ビルド 継続的 統合 ビルド 不具合を検出し 修正 4 脆弱性を検出し 修正 適切なテストの 開発 Confidential: For Coverity and Partner use only. Copyright Coverity, Inc., 2013 マルチサプライヤー、併発する問題 5 マルチサプライヤー、併発する問題 6 サプライチェーンの整合性管理 (第三者のコードが混在するソフト開発を管理) 全世界に分散したチームおよび第三者サプライヤーの使用には 新たなレベルのソースコードの把握と管理方法が必要 プロジェクト 1 外部委託 パートナー オープン ソース プロジェクト 2 社内開発者 サードパーティ・ ソフトウェア・ ベンダ Coverity Development Testing Platform 解析 | 修正 | 統制 解析パッケージ SDLC 統合 Policy Manager サードパーティ メトリクス Dynamic Analysis IDE Coverity Connect コード カバレッジ Architecture Analysis 解析結果統合 Quality Advisor Security Advisor Test Advisor FindBugs™ | FxCop テスト 実行 ビルド/ 継続的統合 バグ トラッキング SCM 解析結果統合 ツールキット Coverity SAVE™ Static Analysis Verification Engine 商用コード | オープンソースコード 8 ALM 連携 HP | IBM 品質の高いコード ↓ 手戻りの削減 Quality Advisor Security Advisor 静的不具合・脆弱性解析 Coverity Development Testing Platform 解析 | 修正 | 統制 解析パッケージ SDLC 統合 Policy Manager サードパーティ メトリクス Dynamic Analysis IDE Coverity Connect コード カバレッジ Architecture Analysis 解析結果統合 Quality Advisor Security Advisor Test Advisor FindBugs™ | FxCop テスト 実行 ビルド/ 継続的統合 バグ トラッキング SCM 解析結果統合 ツールキット Coverity SAVE™ Static Analysis Verification Engine 商用コード | オープンソースコード 10 ALM 連携 HP | IBM 静的解析技術の種類 • コーディング規約チェック系 • ベスト・プラクティスに基づいたコードの書き方 • 標準規約など予め定義したコーディングルールに対し違反がない かを確認 • ランタイムエラー検出系 • バグ自体を検出 • 従来、実行時でないと確認できなかった、メモリリーク、データ破壊、 データ競合などを静的に検出 11 参考:東芝レビュー Vol.64 No.4 (2009) http://www.toshiba.co.jp/tech/review/2009/04/64_04pdf/b05.pdf 静的解析 - 関連性と正確さ SAT ソルバ 全パス & プロシージャ間 解析 統計的な解析 ホワイトボックス ファザー 不不具合が発⽣生しない パスを排除し、 誤検知を減らす 関数またはファイルに 跨る不具合の検出 プログラムの目的を 推測し、予期しない 動作を報告する 汚染データを投入し、 無害化されているかを 自動的に確認する void bar() { foo(p); if(p != 0) { ... } } if x=0 X!=0 X=0 ... ... int *p = malloc(sizeof(int)); if(p != 0) *p = 42; ... int *p = malloc(sizeof(int)); if(p != 0) *p = 42; 多分正しい If x != 0 X=0 X!=0 NULL の参照解除 void foo(int *p) { *p = 42; } int *p = malloc(sizeof(int)); *p = 42; 多分間違い a b c d … < > & ‘ … htmlEncode() < > & " ' Coverityで検出される欠陥(一部) C/C++ 並列列処理理の問題 • デッドロック • 競合状態 • ブロック呼び出しの誤⽤用 パフォーマンスの低下 • メモリ・リーク • スタックの使⽤用度度合い クラッシュの原因 • Null ポインタの間接参照 • ポインタの解放後のメモリ使⽤用 • ⼆二重解放 • 配列列の新規作成と削除の不不⼀一致 セキュリティ上の脆弱性 • バッファ・オーバーフロー • 外部⼊入⼒力力値の不不適切切な利利⽤用 API などの不不適切切な使⽤用 • STL の誤使⽤用 • API エラー処理理 プログラムの不不正な動作 • デッドコード • 未初期化変数 • 負の変数の無効な使⽤用 4 Java 並列列処理理の問題 • デッドロック • 競合状態 • ブロック呼び出しの誤⽤用 パフォーマンス低下/スケーリングの制限 • リソース・リーク • データベース接続リーク クラッシュの原因 • null の間接参照 • リソースの解放後の操作 プログラムの不不正な動作 • デッドコード • 未初期化変数 • 負の変数の無効な使⽤用 セキュリティ上の脆弱性 • SQLインジェクション • クロスサイトスクリプティング • OSコマンドインジェクション API の不不適切切な使⽤用 • API エラー処理理 FindBugs で検知された不不具合 FxCop で検知された不不具合 例:リソースリーク 呼出し先の関数内 のメモリアロケーシ ョンを検知 メモリ解放を行なっ ていないパスを検知 14 例:バッファーオーバーラン シングルトン の変数 Address渡し 呼出し先の 関数内表示 渡された変 数を配列とし てアクセス 15 例:コピペミス 変数名の書 き換えミス 同一の関数 以外でも、 検出可能 16 クロスサイトスクリプティング 入り口 (source) 経路 サニタイズすべき箇所 修正方法の提示 事例:NTTデータ イントラマート様 Web システムフレームワーク開発 • フリーの解析ツールでは品質確保までに至らない • フリーのツールではたとえ不具合が見つかっても、その原因をつきとめる のが困難 • コベリティ導入後 • 不具合の修正が確実に • 3.69件/K行の不具合密度が 0.55件/K行へ • 初期導入コストを早期に回収 18 事例:三菱電機株式会社 三田製作所様 カーナビ開発 • 解析精度が低いツールを初期導入したが… • 意味のないレポートが多く、余計に人手がかかる • コベリティ静的解析ツールに 入れ替え • 誤検知が低い • 不具合の根本原因が特定し易いレポート • 人的リソースを注入すべき作業に集中できる 19 事例:オムロン ソフトウェア様 スマートフォン、タブレット向けソフトウェア開発 • 派生開発への対応が必須 • 言語入力システム(Wnn)などは、メーカごとにカスタマイズが必要になる ため、ベース商品と派生商品を効率よく解析する必要がある • コベリティ導入後 • ベース商品で発生している不具合、派生商品に 引き継がれた不具合、派生商品固有の不具合、 それぞれがフィルタリングできる。 • 不具合の2重レビューがなくなった。 • 毎日解析することで、不具合の増分をすぐに確 認できる。 20 国内既存製造業顧客サーベイ(2012年) • 有効解答: 20 プロジェクト • 解析対象総コード行数:1億7千900万行 (179M step) • 主な調査データ: • • • • 解析コード行数 検出不具合数 修正済み不具合数 修正対象外(誤検知含む)数 • 高・中リスクの残不具合件数 • コベリティ導入前と導入後の不具合修正工数の変化 国内製造業既存顧客データ 1,000 行あたり の初期検出不 具合数 1,000 行あたり の不具合修正 数 1,000行あたり 不具合1件あた の高・中リスク りの修正工数 の残不具合数 の削減 最大 5.9 件/K行 4.85件/K行 0.69件/K行 15人時間/件 最低 0.05件/K行 0件/K行 0.01件/K行 1人時間/件 平均 1.47件/K行 0.69件/K行 0.16件/K行 9人時間/件 具体的なオープンソースプロジェクトの例例(赤枠は、⾼高・中リスクの残不不具合密度度) 22 SCAN Report 2012年度版 http://softwareintegrity.coverity.com/ register-for-the-2012-coverity-scan-report-jp.html 23 もう少し具体例を CEDEC2013 フロム・ソフトウェア様の発表資料より コード編集量と不具合検出件数・修正件数の推移 450,000 180 コード編集量 400,000 350,000 編 300,000 集 量 160 コード追加量 140 不 不具合検出件数 具 合 120 検 出 件 100 数 不 80 具 合 60 修 正 件 40 数 不具合修正件数 250,000 200,000 追 加 量 150,000 行 数 100,000 50,000 0 7/30 20 0 11/7 2/15 5/26 9/3 12/12 日時 3/21 6/29 10/7 コード編集量1万行あたりの不具合件数の推移 9 8 7 1 万 6 行 当 5 不 4 具 合 件 3 数 2 1 0 8/29 10/18 12/7 1/26 3/17 日時 5/6 6/25 8/14 10/3 コード編集量1万行あたりの不具合件数の推移 40 35 30 1 万 行 25 当 20 不 具 合 15 件 数 10 5 0 12/23 4/1 7/10 10/18 1/26 日時 5/6 8/14 11/22 コード編集量1万行あたりの不具合件数の推移 12 10 1 万 8 行 当 6 不 具 合 件 4 数 2 0 6/6 9/14 12/23 4/1 7/10 10/18 日時 1/26 5/6 8/14 11/22 質の高いテスト ↓ さらなる手戻りの削減 Test Advisor 影響解析 自動テスト開発支援ツールのコンセプト 独自に作り込み ソース 変更情 報 外部SCMから入力: Git, CVS, Mercurial, Subversion, Perforce, ClearCase, AccuRev, MS TFS 変更の 影響 カバレ ッジ 外部カバッレジツールから入力: gcov (C/C++) Bullseye(C/C++) IBM PureCov(C/C++) Corbertura (Java) 優先的にテストすべき箇所を 開発者に通知 30 変更の影響解析 • チェンジインパクト解析は、変更が あったコードが、他のコードに影響 を与えるかどうかを的確に判断する。 Foo f15 • 例1: 関数の挙動の変更は、その 関数を呼び出すコードに影響を与 える場合がある • 例2: クラスの継承関係の変更は、 仮想関数呼出し時の実装決定に 影響を与える場合がある f56 影響を 受ける コード f34 f25 f87 f33 f77 f76 ... ... ... f89 ... ... f34 ... ... ... f23 f32 f54 f67 ... ... 変更されたコード 31 f90 ... レガシーコード ... 変更の “波及域” 例:git のテストを解析(本当に危ないのは?) カバレッジが100%でない関数 テストコードが存在して、 カバレッジが100%に 達していない関数 32 テストコードが存在して、 カバレッジが100%に達して いない関数のうち、 ある程度(CCM>5)複雜な関数 テストコードが存在して、 例外処理をのぞき、 カバレッジが100%に達して いない関数のうち、 ある程度(CCM>5)複雜な関数 1つ前のバージョンから 変更されたコードと、 それに影響を受けるコードで、 カバレッジが100%でない関数 Coverity Test Advisor 33 Coverity Development Testing Platform 解析 | 修正 | 統制 解析パッケージ SDLC 統合 Policy Manager サードパーティ メトリクス Dynamic Analysis IDE Coverity Connect コード カバレッジ Architecture Analysis 解析結果統合 Quality Advisor Security Advisor Test Advisor FindBugs™ | FxCop テスト 実行 ビルド/ 継続的統合 バグ トラッキング SCM 解析結果統合 ツールキット Coverity SAVE™ Static Analysis Verification Engine 商用コード | オープンソースコード 34 ALM 連携 HP | IBM コード、テストの質が、 自動的に確認できる状態 ↓ ポリシーの設定により 管理可能な状態 Coverity Development Testing Platform 解析 | 修正 | 統制 解析パッケージ SDLC 統合 Policy Manager サードパーティ メトリクス Dynamic Analysis IDE Coverity Connect コード カバレッジ Architecture Analysis 解析結果統合 Quality Advisor Security Advisor Test Advisor FindBugs™ | FxCop テスト 実行 ビルド/ 継続的統合 バグ トラッキング SCM 解析結果統合 ツールキット Coverity SAVE™ Static Analysis Verification Engine 商用コード | オープンソースコード 36 ALM 連携 HP | IBM 組織レベルのコード品質・テスト状況を確認 開発組織、プロジェクト、サプライヤ全体 37 他解析ツールとの連携(PR-QA・C/C++) まとめ 不不具合未検出 解析 クリーンな ファイルを登録 最新のコードセットを 自動取得 Coverity QA/SA 単体レベル 構成管理理 不不具合検出 最新のコード セット 新規・修正 コード+テスト 修正 QNX 最新のテスト セット 開発者 Coverity 解析 QA/SA/TA 統合レベル 不不具合情報 単体レベル 通知 開発者 Jenkins-‐‑‒CI コべリティ プラグイン 不不具合管理理・ トリアージ 新規不不具合検出 テストポリシー 違反 コンプライアンス 遵守チェック +ALM製品 Coverity コードレベル 不不具合管理理 (Coverity Connect) QA・テスター 不不具合情報 統合レベル Coverity Policy Manager QA・VIP Q and A