フロー解析の深さの設定

フロー解析エンジンは、解析されたコードからパスを分析し、さまざまな問題を検出します。アプリケーション全体にわたって「実行される可能性があるパス」をすべて解析するのは現実的ではない場合もあるため、解析レベルの深さを設定できます。解析レベルが深いほど、発見される違反の数が増えます。ただし、パフォーマンスが低下し、若干メモリの消費量が増加します。

解析の深さは、DTP でテスト コンフィギュレーション インターフェイスを使用して設定します。  Report Center > [テスト コンフィギュレーション] > [静的解析] > [フロー解析詳細設定] > [パフォーマンス] > [解析の深さ] にアクセスし、以下のいずれかのオプションを選択します。

デフォルトの解析レベルの深さは [標準] です。

タイムアウトの方針の設定

解析レベルの深さの他に、フロー解析エンジンはタイムアウト設定を利用して、妥当な時間内で解析が終了するようにします。タイムアウトの設定を行うには、DTP でテスト コンフィギュレーション インターフェイスを使用します。Report Center > [テスト コンフィギュレーション] > [静的解析] > [フロー解析詳細設定] > [パフォーマンス] > [タイムアウトの方針] にアクセスし、以下のいずれかのオプションを選択します。

デフォルトのタイムアウト オプションは [時間] であり、タイムアウト秒数は 60 秒です。解析中に発生したフロー解析タイムアウトについての情報を得るには、解析後に生成されるレポートで [セットアップの問題] セクションを確認してください。

インクリメンタル解析モードでのフロー解析の実行

デフォルトでは、フロー解析は実行対象のスコープの完全解析を実行します。大規模なコード ベースの場合、この解析にはかなりの時間がかかることがあります。

フロー解析を使った解析を実行する最も一般的な方法は、毎日わずかに変化する 1 つのコード ベースに対して夜間テストを実行することです。インクリメンタル解析モードの目的は、この一般的なフロー解析の解析にかかる時間を短縮することです。インクリメンタル解析モードのフロー解析では、1 回目の実行中に重要な解析データが記憶され、2 回目以降のテストで再利用されます。再解析は、変更されたコードおよび変更されたコードに密接に関係するコードにだけ実行されます。

インクリメンタル解析モードで初めてフロー解析を実行すると、インクリメンタル解析モードではない場合に較べて解析に時間がかかることがあります。解析が遅くなる理由は、完全な解析を実行するのに加えて、今後のテストで再利用するためのデータも収集しているからです。

データを格納するためのディスク容量が必要です。 

[インクリメンタル解析] オプションは、インクリメンタル解析機能を設定します。以下のオプションがあります。

解析データのスワップを有効にしたフロー解析の実行

スワップ モードでは、解析データをハードディスクに書き込みます。解析データのスワップは、インクリメンタル解析と同じ永続性記憶装置を使用し、インクリメンタル解析と似たプロセスで実行されます。大きなプロジェクトで解析を実行する場合、解析するソース コードの意味論的モデルを表す解析データが、フロー解析が使用できるすべてのメモリを消費する可能性があります。この現象が発生した場合、フロー解析は現在必要ない解析データをメモリから削除し、後でディスクから再び読み込みます。

一般的に、 Xmx JVM オプションを使って JVM ヒープのサイズを大きくしてC/C++testを実行することを推奨します。これはスワップを最小限にするためであり、結果としてパフォーマンスが向上します。充分なメモリがある場合、解析データのスワップは無効化しても構いません。スワップを無効化すると、コード解析の速度が上がる場合があります。

スワップ モードを有効化/無効化するには、DTP のテスト コンフィギュレーション画面を使用します。

ディスクへの解析データのスワップを有効化: デフォルトで 有効 です。大量のメモリを必要としない小さなサイズのプロジェクトに対してフロー解析を実行する場合、または 64-bit システムのように十分なメモリがある場合、このオプションを無効化すると、解析のパフォーマンスが向上する場合があります。

フロー解析の冗長性の設定

DTP のテスト コンフィギュレーション画面では、次のオプションを設定できます。

終了関数の指定

アプリケーションを終了させる関数を定義できます。C/C++ プログラミングでは、回復が不可能な致命的なエラーが発生した場合に、関数を使ってアプリケーションの実行を終了させることがあります。たとえば標準ライブラリの abort()exit() といった関数です。フロー解析はアプリケーションの実行フローを解析するため、アプリケーションを直ちに停止して実行フローをブレークする終了関数を把握することは、フロー解析にとって非常に重要です。終了関数を把握していない場合、フロー解析がアプリケーションについて誤った推測を行う可能性があります。

フロー解析は、標準ライブラリで定義された終了関数を認識します。しかし、非標準ライブラリに独自の終了関数が定義されることも多いため、それだけでは十分ではない場合もあります。独自の終了関数をアプリケーションで使用している場合、[終了関数] タブのリストにその終了関数を追加します。終了関数をリストに追加しない場合、終了関数による実行パスについてフロー解析が誤った結果をレポートする (本当は違反ではないものを違反としてレポートする) 可能性があります。

サポート対象 API が表示されたリストを使用して、各種 API の終了関数を有効化/無効化したり、終了関数を含む独自の API を定義します。特定のライブラリの終了関数の情報を追加するには、次の操作を行います。

  1. テーブルの一番上の行の + ボタンをクリックします。
  2. 矢印をクリックして [アプリケーションの実行を終了させる関数] タブを開きます。
  3. 表示されたテーブルに入力します。以下の列があります。

    有効: 解析中にビルトイン終了関数またはカスタム終了関数を考慮するかどうかを指定します。
    完全修飾型名または名前空間 (ワイルドカード): 特定の終了関数のエンティティを指定します。このフィールドに何も指定しない場合、[関数名] で指定された名前のグローバル関数が終了関数と見なされます。たとえば、終了関数が名前間空間 myNameSpace の myClass で宣言されている場合、このフィールドの値は myNameSpace::myClass になります。あるいは、終了関数が型において宣言されてなく、名前空間 myNameSpace にだけ属している場合、このフィールドの値は myNameSpace になります。
    関数名 (ワイルドカード): 終了関数の名前を指定します。
    + サブクラスの定義: サブクラス中の終了関数の定義も、終了関数として見なすかどうかを指定します。この設定は、完全修飾型名が指定されている場合にだけ意味を持ち、インスタンス関数と非インスタンス関数の両方に適用されます。

マルチスレッド オプションの指定

[マルチスレッド] タブでは、既知のマルチスレッド関数を有効化/無効化するだけでなく、スレッド間の同期化のための関数を定義することができます。このタブで定義した情報は、BD.TRS (スレッドと同期化) カテゴリのルールに影響します。BD.TRS カテゴリのルールは、[マルチスレッド] タブで定義および有効化されているすべての関数をチェックします。

サポートされる API のチェックボックスをオンにして、さまざまな API の同期化関数を有効化するだけでなく、同期化関数を含むユーザー独自の API からの関数を有効化することもできます。特定のライブラリの同期化関数の情報を追加するには、次の操作を行います。

  1. テーブルの一番上の行の + ボタンをクリックします。
  2. [API] フィールドにライブラリ名を入力します。
  3. 矢印をクリックしてタブを開き、表示されたテーブルに以下の関数の型を定義します (テーブルの入力の詳細については下で説明します)。

    ロックする関数 (mutex の獲得など)
    • ロックを解除する関数 (mutex の解放など))
    • スリープ関数
    • ロックを破棄する関数

ロック関数

テーブルに以下の情報を入力します。

ロック解除関数

テーブルに以下の情報を入力します。

スリープ関数

テーブルに以下の情報を入力します。

ロックを破棄する関数

テーブルに以下の情報を入力します。

リソースの指定

[リソース] タブでは、BD.RES (リソース) カテゴリのルールを使ってチェックするリソースを定義することができます。BD.RES カテゴリのルールは、[リソース] タブで定義および有効化されているすべてのリソースについて、リソースが正しく使用されているかをチェックします。

  1. リソースのタイプを指定します。
  2. [有効] チェックボックスをオンにします。
  3. 適切な場合、[アプリケーション終了時の違反をレポートしない] オプションをオフにします。
  4. 矢印をクリックして [リソース アロケーター]、[リソース クローザー]、[リソース チェッカー] および [セーフ関数] タブを開き、表示されたテーブルにリソースのアロケーター/クローザー/チェッカー/セーフ関数の情報を入力します。詳細については以下のセクションを参照してください。

リソース アロケーターの設定

[リソース アロケーター ] テーブルには、リソースを生成する関数の記述を入力できます。テーブルには以下の列があります。

一般的に、アロケーター関数はエラー コードを返してリソース割り当ての失敗を表します。アロケーター関数 はリソースへのポインターを返し、通常 NULL ポインターはリソース割り当ての失敗を表します。リソース リークを探すときに、フロー解析はリソースの割り当てが成功したか失敗したかを把握できる必要があります。これは、割り当てが実際に発生したパス上で発見されないクローザー関数への呼び出しだけをフロー解析がレポートするのに役立ちます。リソース アロケーター関数がリソースへのポインターを返し、このポインターが NULL でない場合、フロー解析はリソースが正常に割り当てられたと推測します。

リソース クローザーの設定

[リソース クローザー] テーブルには、リソースをクローズする関数の記述を入力できます。テーブルには以下の列があります。

リソース チェッカーの設定

[リソース チェッカー] テーブルには、リソースが開かれているかどうかをチェックする関数の記述を入力できます。テーブルには以下の列があります。

セーフ関数の設定

[セーフ関数] テーブルには、クローズ済みのリソースで呼び出しても安全な関数 (BD-RES-FREE ルールの違反をレポートしない関数) の記述を入力できます。テーブルには以下の列があります。

解析スコープの拡大

コード解析を実行する際、フロー 解析はテスト対象のソース ファイルおよびヘッダー ファイルに定義された関数定義を処理します。テスト スコープ外のヘッダー ファイルで定義された関数は解析されず、フロー解析はそのセマンティクスを考慮しません。フロー解析がテスト スコープ外で定義された関数定義の情報を必要とする場合、以下のようにオプションを設定できます。

解析対象の外部ファイル: フロー解析で解析する追加のヘッダー ファイルへの絶対パスを指定します。ワイルドカードを使用してパターンを指定します。

解析対象の外部関数: フロー解析で解析する追加の関数を指定します。テーブルに以下の情報を入力します。テーブルに以下の情報を入力します。

常に解析される関数の指定

[常に解析すべき関数] オプションを使用すると、実行パス中で見つかったら常に解析する関数を定義できます。これにより、特定のパスを解析したとき、通常は入らない関数を必ず解析するようにできます。

[有効] チェックボックスをオンにして、以下の情報を指定します。

コンパイラ固有の設定

"errno" 値の内部表現: 規格では、errno は変更可能な int 型の lvalue であると定義されています。errno がマクロであるか、外部リンケージを持つと宣言された識別子であるかは未指定です。処理系は、グローバル変数 "errno" または "__errno" を使用するか、呼び出し先関数の異なる "(*errno_function())" というパターンを使用できます。このオプションを使用すると、正規表現を使用してこれらの変数および関数の名前を指定できます。

ヘッダー <ctype.h> の関数への呼び出しの内部表現: 規格には、<ctype.h> ヘッダーに定義するべき関数がいくつか指定されています。一部の処理系 (C モードの GNU GCC など) は、内部配列の要素とフラグを比較してテストするコードに展開されるマクロとして、これらの関数を定義します。これは、グローバル配列または関数によって返されるポインターである可能性があります。このオプションを使用すると、正規表現を使用してこれらの変数および関数の名前を指定できます。

デスクトップ解析のためのフロー解析データの再利用

デスクトップでのフロー解析のパフォーマンスを向上する方法として、デスクトップ上でサーバー解析データを再利用する方法があります。解析データを再利用するには、マッピングを定義することによって、対応するデスクトップ ファイル パスを使ってサーバー ファイル パスをフロー解析エンジンが照合できるようにする必要があります。

また、たとえば 1 個のファイルなどの小さな範囲で、解析スコープの範囲外にあるファイルで定義されたメソッドを含むビルド パスで解析を実行するために、データを再利用できます (解析スコープの範囲外にあるファイルが解析済みであることが条件です)。

この機能の詳細については Parasoft サポートにお問い合わせください。