フロー解析

静的解析ツールで、プログラムのあらゆるパスをシミュレートしバグを早期に発見

ソースコードを解析し、関数・ファイルをまたがったバグに至るまでの処理の流れをレポート

フロー解析機能は、プログラムを静的に解析して、プログラム実行時に発生し得る問題を検出する機能です。非常に複雑なアプリケーションでも、複数のファイル、メソッドにまたがるパスを自動的にトレースし、「NULLポインターの間接参照」や「バッファオーバーフロー」などプログラムの動作に致命的な影響をもたらすバグを早期に発見します。
C/C++testのフロー解析機能のルール数は125種類。問題として顕在化していなかった欠陥や、システムテストなどの後工程で見つかっていたような欠陥を、コーディングフェーズで瞬時に見つけることができるようになり、手戻りのリスクを軽減します。

フロー解析機能とは

フロー解析機能は、コードの処理フローを静的にシミュレートして、エラーの可能性があるパスを検出するフロー解析機能です。非常に複雑なアプリケーションでも、自動的にパスをトレースし、実行をシミュレートすることができます。複数のファイルにわたる処理フローも解析できるので、一般的な静的解析(コーディングルールに基づくエラーパターンの検出)では検出が難しい、実行パスとデータの組み合わせに依存するメモリリークやリソースリークなどのエラーも検出できます。さらに、単体テストなどの実際にコードを実行するテストとは違って静的な解析であるため、例外処理などのテストが難しい場所に潜むエラーもコードを実行せずに検出できます。

フロー解析機能のルールは125種類

主に検出可能な問題点
  • メモリリーク / リソースリーク
  • セキュリティ脆弱性
  • ゼロ除算
  • 未初期化メモリの使用
  • NULL ポインターの間接参照
  • 配列の範囲外のアクセス
  • バッファオーバーフロー
  • 整数オーバーフロー
  • 不適切な排他制御 / スレッド管理
  • デッドロック
  • デッドコード
  • キャッチされない例外
  • 不適切なコンテナ(STL)の操作

静的解析ツールC/C++test:静的フロー解析のイメージ図

イメージ図:ファイルをまたがる問題を検出

フロー解析の利点

複数のファイル、関数にまたがる欠陥を自動的に検出できる

単体テストは、基本的には関数単位の欠陥を検出するのに役立つテスト手法です。しかし弱点もあります。関数に対してテストを行なって、発見された問題をすべて修正してからコードを統合しても、その後でメモリ破壊などの問題が起きることがありますが、そのような問題は複数の関数、あるいは複数のファイルを通る複雑でわかりにくいパスで発生するため、原因をつきとめるのに何日もかかる場合があります。

フロー解析を使用すると、このような問題も瞬時に検出できる可能性があります。フロー解析はプログラム中のさまざまな分岐の可能性を調査し、従来のテストでは到達するのが難しいレベルのパス カバレッジを達成します。結果として、テスト中にカバーされないことも多い例外的な状況で起こる問題を検出できるケースもあります。

問題に至る処理フローを瞬時に把握

フロー解析により、問題の可能性が発見された場合は、問題が発生した箇所とそれに至るまでの処理フローがレポートされます。処理フローを確認しながら、処理フローに依存した問題の原因を確認することができます。

テストケースやスタブは、不必要。テスト資産のないソースコードでも検証可能

フロー解析は、静的解析であるため、テスト対象ソフトウェアを実行する必要はありません。
ボタンをクリックするだけで処理フローの自動検証を開始します。複雑なパスを自動でシミュレートしますので、人の目でパスを網羅するのに比べて、人的リソースを削減することができます。
また、テストケースやスタブなどのテスト資産を用意する必要もありません。テスト資産が不要ですので、過去コードを流用した派生開発の場合も、テストケースの更新や再作成をすることなく、すぐにテストを行なうことができます。

フロー解析トレースの詳細を表示

Parasoft DTPと連携することにより、フロー解析トーレースの詳細表示が可能です。フロー解析におけるデータフローのシミュレート結果がより詳しく表示されます。「なぜ条件演算子でtrueと判断されたのか」・「なぜ違反が発生しているか」の理解や、「違反の重要性」の判断が容易となっています。

静的解析ツールC/C++test:フロー解析トレースの詳細を表示

フロー解析トレースの詳細を表示


フロー解析で検出可能なエラー

以下では、フロー解析機能でどのようなエラーを検出できるのか、その一部を具体的にご紹介します。

メモリリーク

メモリリークは、プログラム内で動的に割り当てられたメモリ領域が解放されないまま残ってしまう現象です。長時間実行され続けるプログラムにメモリリークの欠陥があると、時間の経過とともに使用できるメモリ領域が少なくなり、パフォーマンスが悪化したり、動作が不安定になる可能性もあります。
下の図は、C/C++testのフロー解析でメモリリークを検出した結果の例です。

静的解析ツールC/C++test:メモリリークを検出した結果の例:フロー解析

メモリリークを検出した結果の例

ゼロ除算

ゼロによる除算は例外を発生させ、プログラムの異常終了の原因になる可能性があります。
下の図は、C/C++testのフロー解析でゼロ除算を検出した結果の例です。

静的解析ツールC/C++test:ゼロ除算を検出した結果の例:フロー解析

ゼロ除算を検出した結果の例

未初期化メモリの使用

C言語では、ローカル自動変数の初期値は不定値です。変数を初期化せずに使用すると、プログラムの予期しない動作につながる可能性があります。
下の図は、C/C++testのフロー解析で未初期化メモリの使用を検出した結果の例です。

静的解析ツールC/C++test:未初期化メモリの使用を検出した結果の例:フロー解析

未初期化メモリの使用を検出した結果の例


静的解析ツール・単体テストツール C/C++testに
関するお問い合わせ

  • テクマトリックス株式会社
    東京本社

    ソフトウェアエンジニアリング事業部

    03-4405-7853

メールでのお問い合わせ
parasoft-info@techmatrix.co.jp

お問い合わせ

製品についてやテクマトリックスについてなど、
こちらよりお気軽にお問い合わせいただけます。