静的フロー解析

フロー解析で、重大な問題の引き金となるコードを検出

dotTEST:フロー解析

dotTESTの静的フロー解析機能は、シンボリックシミュレーションなどの技術を用いてコードを綿密に解析し、NullReferenceExceptionやリソース リーク、nullチェックの前の間接参照といった重大な問題の引き金となるコードを検出します。処理フローが複数のファイルに渡った複雑なパスも検証可能なので、ファイル単位で実施する静的解析や単体テストでは発見することが難しい例外的な問題も正確に検出します。
アプリケーションを実行しなければ検出することが難しい問題を静的に検証できるため、人手によるテストに比べて、網羅率の高い検証が可能となります。さらに、問題を引き起こすコードと処理フローがレポートされるので、テスト / デバッグ時間を大幅に短縮することが可能になります。

フロー解析とは

フロー解析は、複数の関数・メソッドやファイルにまたがる複雑な実行パスを解析し、処理フローに依存したプログラムの問題を容易に検出する解析方法です。
フロー解析も静的解析(コーディングスタンダード解析)と同様に、開発の早い段階から動的なテストでは検出が難しい問題を効率よく検出できます。ただし、指摘された問題は、コードを実行した結果ではないので、実際はバグではない可能性もあります。フロー解析と、動的にコードを実行して検証する単体テストを組み合わせて実施すると、より効果的です。
  • 結合テストを実施する前の早い段階でエラーを検出できる。
  • 処理フローに依存したエラーを検出できる。
  • 動的なテストでエラーを検出するのに比べて、パスを網羅するために必要な時間や人的リソースを節約できる。

dotTESTの静的フロー解析

以下のようなカテゴリーのエラーを検出可能です。
  • コレクション
  • 例外
    • NullReferenceException
  • リソース
    • リソースリーク
  • バグの可能性
    • ゼロ除算
    • null チェックの前の間接参照
    • 配列の境界外アクセス
  • セキュリティ
    • SQLインジェクション
    • クロスサイトスクリプティング(XSS)
  • スレッドと同期化

dotTESTフロー解析

複数のクラスにまたがる複雑なパスも検証可能

クラスやメソッドをまたがった問題は実行しなければ発見するのが難しく、また、網羅率の高い検証を実施するのは非常に大変な作業です。しかし、『静的フロー解析』は、アプリケーションを実行することなく、 NullReferenceException やリソースリークのような実行しなければ発見するのが難しい問題も、静的に検証/発見します。また、静的な検証なので人手によるオペレーションが必要ないため、『静的フロー解析』による検証をバッチで実施することが可能です。これにより、テストにかかる人的コストの大幅削減と網羅率の高い検証が実現できます。

問題を引き起こすコードと処理フローをレポート

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

インジェクションやクロスサイトスクリプティング(XSS)などの脆弱性を検出

Webアプリケーションに対するSQLインジェクションやクロスサイトスクリプティング(XSS)などの攻撃に対して脆弱なコードを静的に検出します。静的フロー解析のセキュリティルールには、OWASP (Open Web Application Security Project)に掲載されているWebアプリケーションの脆弱性 トップ10 (https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project)に掲載されている脆弱性について、処理フローを検証し、これらのセキュリティ上危険なコード箇所を指摘します。ソースコードの脆弱性をコーディング時に指摘されることによって、高セキュリティなアプリケーションの開発が可能になります。
※ セキュリティコンプライアンスルールによる静的解析には「セキュリティコンプライアンスパック」のライセンス(有償)が必要です

静的解析だから、網羅率が高く、確実な検証が可能

静的フロー解析は、静的に検証するので、テスト対象アプリケーションを実行する必要はありません。ボタンをクリックするだけで処理フローの自動検証を開始します。『静的フロー解析』は、ソースコード上に存在するさまざまな分岐の可能性を検査するので、通常のテストでカバーされない珍しい状況を処理するときに発生する問題を特定できるため、高い網羅率の検証が行なえます。また、バッチでも実施できるので、夜間や休日など開発作業にマシンを使用していない時間を利用して検証を自動実行させることも可能です。

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

テストケースを作成し、テストを実行しなければ検出できなかったリソースリークや、ゼロ除算、 null チェックの前の間接参照といった問題を、静的フロー解析はテストを実行することなく検出します。過去に開発したアプリケーションを拡張する場合などは、テストケースやテストスタブを編集したり、新たに作成することなく、ボタンをクリックするだけで検証できます。

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

バグ探偵におけるフロー解析でどのようなエラーを検出できるのか、その一部を具体的にご紹介します。

■リソースリーク
.NETで扱われるリソースには、.NETで管理可能なリソース(マネージリソース、メモリーなど)と、.NETで管理できないリソース(アンマネージリソース、ファイルなど)があります。マネージリソースはガベージコレクタの管理対象となるため自動的に解放されますが、アンマネージリソースはガベージコレクタの管理対象外となるため、プログラマが明示的に解放する必要があります。しかし、ガベージコレクタによるファイナライザの実行のタイミングや順序は確実ではないため、いつまでも解放が行われず、リソースの不足を起こす事があります。また、ファイナライザの実行は負荷も大きいため、性能の低下の原因となるため、適宜リソースは開放するべきです。

下記はODBCリソースのクローズ漏れを検出した例です。



この例ではOdbcConnectionクラスのOpenメソッドを呼び出していますが、Closeメソッドを呼び出さないまま変数の参照が失われる場所を検出しています。


■NullReferenceException
nullが設定されている変数に対してメソッドやフィールドの呼び出しなど間接参照を行うことで発生する例外です。リリース後にNullReferenceExceptionが発生した場合、以降の業務が継続出来ないなど、大きな損害を与える可能性があります。

以下はNullReferenceExceptionを検出した例です。



nullをリターンする可能性のあるメソッドの戻り値を確認せずに間接参照を行っているフローを検出しています。


■クロスサイトスクリプティング(XSS)
XSSはWebサイトの入力画面(掲示板や各種情報入力)で、ユーザーが入力した内容を検証せずに画面に表示することを原因とする脆弱性です。悪意のあるユーザーがスクリプトを入力することで、そのサイトを訪れる他のユーザーに被害が及びます。たとえば、Cookieの盗難による被害が生じる可能性があります。

以下はXSSの検出例です。



アプリケーションオブジェクトから取得するデータを汚染されたデータとして認識(カスタマイズによって追加、変更可能)し、それが何に検証もされずに画面に出力されるフローを検出しています。 ※ セキュリティコンプライアンスルールによる静的解析には「セキュリティコンプライアンスパック」のライセンス(有償)が必要です

C# VB.NET対応 静的解析・単体テストツール dotTESTに
関するお問い合わせ

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

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

    03-4405-7853

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

CONTACT

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