フロー解析とは

フロー解析には、データの取りうる値の変化を解析するデータフロー解析や、プログラムの実行パスを解析する制御フロー解析があります。

 フロー解析の利点
  • 結合テストを実施する前の早い段階でエラーを検出できる。
  • 処理フローに依存したエラーを検出できる。
  • 動的なテストでエラーを検出するのに比べて、パスを網羅するために必要な時間や人的リソースを節約できる。
フロー解析の弱点
  • 指摘された問題が本当にバグかどうか、目視での確認が必要な場合もある。
フロー解析静的解析(コーディングスタンダード解析)と同様に、開発の早い段階から動的なテストでは検出が難しい問題を効率よく検出できます。ただし、指摘された問題は、コードを実行した結果ではないので、実際はバグではない可能性もあります。フロー解析と、動的にコードを実行して検証する単体テストや実行時エラー検出を組み合わせて実施すると、より効果的です。

フロー解析

フロー解析で検出できる問題

フロー解析では、以下のようなコードの問題点を検出できます。
  • メモリリーク
    C・C++言語では、動的に割り当てたメモリを解放するのはプログラマの責任であるため、明示的にメモリを解放していないパスがあるとメモリリークが発生します。JavaやC#などのガベッジコレクション機構を備えた言語では、メモリリークは発生しないと思われがちですが、プログラマの予期しないところでオブジェクトが参照されたままになっているとメモリリークが発生する場合があります。

  • 未初期化変数の使用
    C・C++言語では、初期化していないローカル変数の値は不定です。JavaやC#では、初期化していないローカル変数の使用は、コンパイラによってレポートされます。メンバー変数は変数の型に応じた値で自動的に初期化されますが、参照型はnullで初期化されるため、適切なオブジェクトを設定せずに参照すると、null参照エラーが発生します。

  • 到達できないコード(デッドコード)
    If文が常に真または偽のどちらかに評価される場合や、switch文の条件に不可能な値が使用されている場合など、分岐の一部が到達できないコードになる可能性があります。

  • セキュリティの脆弱性
    ユーザーが入力した値の妥当性を検証せずに、データベースへのクエリーの一部やファイルパスの一部として使用している場合など、悪意のあるユーザーによって不正な値が入力されるとデータが破壊されたり機密データにアクセスされたりする可能性があります。

Parasoft社テストツールのフロー解析で検出できる問題(抜粋)

Parasoft社のテストツールは、C・C++、Java、C#/VB .NETのソースコードに対するフロー解析をサポートしています。

課題 問題 言語
C・C++ Java C#/VB .NET
C++test Jtest dotTEST
メモリ・リソースリーク メモリの解放漏れ    
DB接続のクローズ漏れ  
ソケットのクローズ漏れ
ストリームのクローズ漏れ  
セキュリティ SQLインジェクション
ファイル名インジェクション
コマンドインジェクション
クロスサイトスクリプティング  
バッファーオーバーフロー    
その他 ゼロ除算
Null チェックの前の間接参照
  C++test Jtest dotTEST


※ フロー解析はServer Editionに含まれる機能です。