コガネブログ

平日更新を目標にUnityやC#などのゲーム開発アレコレを書いていきます

【GTMF2015】「バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。」メモ

Coverity

  • 2002年、Stanford大学で設立
  • 2014年、Synopsysの一事業部門
  • 静的解析技術をベースにしたソリューションを提供
  • ソフトウェア品質解析と測定で#1
  • 世界的大企業を中心に1,100社余の顧客
  • 5,000以上のオープンソースの品質向上に貢献

静的解析

静的解析は、誤検出が多い(?)

  • コーディング規約チェック
    • ベスト・プラクティスに基づいたコードの書き方
    • 標準規約など予め定義したコーディングルールに対し違反がないかを確認
  • ランタイムエラー検出
    • バグ自体を検出
    • メモリリーク、データ破壊、データ競合、セキュリティなど

コードをより深く解析

  • プロシージャー間解析は、アプリケーション全体にわたって関数呼び出しを追跡します
  • 深部にわたる解析でコンポーネント間の複雑な相互作用を検出します
  • 統計的な解析手法を併用

プログラムの目的を推測し、予期しない動作を報告

int *p = my_func( sizeof( s ) );
if ( p != 0 ) *p = 42;

// 多分正しい
int *p = my_func( sizeof( s ) );
if ( p != 0 ) *p = 42;

// 多分間違い
int *p = my_func( sizeof( s ) );
*p = 42;

CoverityとFxCop

  • FxCopや他のコーディング規約チェックツールでは発見できない重要な問題を指摘
  • 誤検出率15%未満
問題のタイプ Coverityのみで発見された問題 FxCopのみで発見された問題 どちらでも発見された問題
処理されない例外 21 0 0
リソースリーク 75 0 0
ロジックエラー 4 2 0
階層問題 5 2 0
並列処理の問題 20 4 0
重要な問題の合計 125 8 0
コーディング標準やベストプラクティスの問題 3 970 0
総計 128 978 0

不具合担当者の自動アサイン

  • SCMの情報に基づき、担当者の自動アサイン
  • メール送信
  • ソースビューの各行のSCMユーザ、改定日付の参照

静的解析を取り入れたワークフロー

  1. コーディング
  2. 構成管理システムへ登録
  3. 継続的統合により最新ビルドを生成
  4. 結合レベルで解析し問題を検出
  5. 結合レベルでの品質とセキュリティ脆弱性をチェック
  6. 優先度付けされた不具合
  7. 問題を適切な開発者にアサイン
  8. 単体レベルの問題を解決

タイトルや組織ごとの品質をコントロール

  • 早い段階から各プロジェクトのリスクを判定し、リリースのための意思決定を行えます
  • 開発工程の完了時やアウトソース開発の受け入れ時の品質を確実にし、プロジェクト間の品質のばらつきを解消できます
  • 主な特徴
    • 組織全体の品質指標を可視化
    • 目標の順守状況を継続的に監視
    • ソフトウェア品質指標の例
      • 不具合密度
      • 未修正の不具合数
      • セキュリティ脆弱性の数
      • 影響度別の不具合数
      • テストポリシー違反

参考にできる指標はあるのか?

オープンソースの品質

  • コベリティを利用している顧客から得た残不具合密度データ
Size of Codebase (Lines of Code) Open Source Code Proprietary Code
Lines of Code 252,010,313 684,318,640
Number of Projects 741 493
Average Project Size (lines of code) 340,094 1,388,070
Defects Outstanding as of 12/31/13 149,597 492,578
Defects Fixed in 2013 44,641 783,799
Defect Density .59 .72

変更部分にフォーカスする

  • Coverityの自社事例
    • テスト対象のコード数:137万行
    • 115万行がテストでカバー(84%カバレッジ = かなり良い?)→まだ22万行!!が未テスト
    • 直前の変更にのみフォーカスすれば、145ファイル内の851行だけをカバーすれば良い

変更部分を知る

  • テスト作成支援のポイント
    • 変更されたコードに注目(SCMより)
    • 変更されたコードに影響を受ける箇所を特定(フロー解析)
    • テストするには複雑すぎるコード、重要なロジックなどで優先度を設定
    • 既存のテストコードのカバレッジ
  • テストコードを優先的に作成すべき箇所をリストアップ

まとめ

  • コーディング段階でわかる問題をテストフェーズに持ち越さない
  • コードの品質指標を定義して管理する
  • リスクの高いコードを明確にして、テストする

無料トライアルのご紹介

  • 無償で1ヶ月間、お試しいただけます
  • ソースコード提供の必要はありません
  • 解析対象のコード行数:20万行以上
  • 対象言語:C/C++,Java,C#