フロー解析の深さの設定
フロー解析エンジンは、解析されたコードからパスを分析し、さまざまな問題を検出します。アプリケーション全体にわたって「実行される可能性があるパス」をすべて解析するのは現実的ではない場合もあるため、解析レベルの深さを設定できます。解析レベルが深いほど、発見される違反の数が増えます。ただし、パフォーマンスが低下し、若干メモリの消費量が増加します。
解析の深さは、DTP でテスト コンフィギュレーション インターフェイスを使用して設定します。 Report Center > [テスト コンフィギュレーション] > [静的解析] > [フロー解析詳細設定] > [パフォーマンス] > [解析の深さ] にアクセスし、以下のいずれかのオプションを選択します。
- 最も浅く (最も高速): ソース コード中の最も明らかな問題だけを発見します。発見する対象は、問題が発生しているコード箇所に「問題の起点」が近い場合だけに制限されます。発見される違反の実行パスは通常、1 つの関数のいくつかの行にわたります。4 以上の関数呼び出しにわたることはまずありません。
- 浅く (高速): [最も浅く] オプションと同様、ソース コード中の最も明らかな問題だけを発見します。ただし、[浅く] オプションは [最も浅く] オプションよりも多くの問題を検出し、より長いパスを検証できます。
- 標準: 何十もの要素を含む実行パスにおける、多くの複雑な問題を発見します。[標準] オプションは、[浅く] オプションよりも深い解析を実行するのに加えて、より複雑な問題を探します。たとえば、「不正なフローのために1 つの関数で発生する問題」や、「解析対象プロジェクト中の異なる箇所にある異なる関数間で不適切なやり取りがあるために発生する問題」などです。多くの場合、[標準] オプションが発見する違反は、解析対象ソース コード中の重要なバグを明らかにし、そのコード行は何十行にも及びます。
- 深く (低速): [標準] オプションで定義されているのと同等の複雑さと性質の問題を、より多く検出できます。ただし、解析速度は [標準] オプションよりも遅くなります。
- 徹底的 (より低速): より複雑な問題を発見します。コードベースを徹底的に解析するため、時間を必要とします。しかし、アプリケーション中の異なる場所にある何百行というコードに違反パスがわたるような、非常に複雑な問題を数多く発見します。このオプションは夜間のテスト実行で使用することを推奨します。
デフォルトの解析レベルの深さは [標準] です。
タイムアウトの方針の設定
解析レベルの深さの他に、フロー解析エンジンはタイムアウト設定を利用して、妥当な時間内で解析が終了するようにします。タイムアウトの設定を行うには、DTP でテスト コンフィギュレーション インターフェイスを使用します。Report Center > [テスト コンフィギュレーション] > [静的解析] > [フロー解析詳細設定] > [パフォーマンス] > [タイムアウトの方針] にアクセスし、以下のいずれかのオプションを選択します。
- 時間: 指定時間が過ぎると、指定したホットスポットの解析が停止します。 注意:このオプションを選択すると、レポートされる違反件数がやや不安定になる場合があります。
- インストラクション: フロー解析エンジンのインストラクションの実行回数が指定の回数を超えると、指定したホットスポットの解析が停止します。注意: 環境に合った適切なインストラクション数を決定するには、生成されたレポートの [セットアップの問題] セクションでタイムアウト情報を確認してください。
- オフ: タイムアウトしません。注意: このオプションを選択すると、解析が終了するまで時間がかかる場合があります。
デフォルトのタイムアウト オプションは [時間] であり、タイムアウト秒数は 60 秒です。解析中に発生したフロー解析タイムアウトについての情報を得るには、解析後に生成されるレポートで [セットアップの問題] セクションを確認してください。
インクリメンタル解析モードでのフロー解析の実行
デフォルトでは、フロー解析は実行対象のスコープの完全解析を実行します。大規模なコード ベースの場合、この解析にはかなりの時間がかかることがあります。
フロー解析を使った解析を実行する最も一般的な方法は、毎日わずかに変化する 1 つのコード ベースに対して夜間テストを実行することです。インクリメンタル解析モードの目的は、この一般的なフロー解析の解析にかかる時間を短縮することです。インクリメンタル解析モードのフロー解析では、1 回目の実行中に重要な解析データが記憶され、2 回目以降のテストで再利用されます。再解析は、変更されたコードおよび変更されたコードに密接に関係するコードにだけ実行されます。
インクリメンタル解析モードで初めてフロー解析を実行すると、インクリメンタル解析モードではない場合に較べて解析に時間がかかることがあります。解析が遅くなる理由は、完全な解析を実行するのに加えて、今後のテストで再利用するためのデータも収集しているからです。
データを格納するためのディスク容量が必要です。
[インクリメンタル解析] オプションは、インクリメンタル解析機能を設定します。以下のオプションがあります。
- インクリメンタル解析を有効化: インクリメンタル解析を使用するかどうかを指定します。
- インクリメンタル キャッシュを圧縮する間隔 [日]: インクリメンタル キャッシュを圧縮する間隔を日数で指定します。インクリメンタル解析は速度を上げるために最適化されます。フロー解析は、常にキャッシュ サイズを小さくして不要なデータを削除しようとします。しかし、ソース コードの変更によって使用されなくなったデータがキャッシュに残る場合があります。このオプションを指定すると、指定した日数ごとにキャッシュが圧縮され、すべての古いデータが消去されます。前回の圧縮から経過した時間がこのオプションの日数より長い場合、フロー解析のインクリメンタル解析を実行した直後にキャッシュの圧縮が実行されます。
解析データのスワップを有効にしたフロー解析の実行
スワップ モードでは、解析データをハードディスクに書き込みます。解析データのスワップは、インクリメンタル解析と同じ永続性記憶装置を使用し、インクリメンタル解析と似たプロセスで実行されます。大きなプロジェクトで解析を実行する場合、解析するソース コードの意味論的モデルを表す解析データが、フロー解析が使用できるすべてのメモリを消費する可能性があります。この現象が発生した場合、フロー解析は現在必要ない解析データをメモリから削除し、後でディスクから再び読み込みます。
一般的に、 Xmx JVM オプションを使って JVM ヒープのサイズを大きくしてC/C++testを実行することを推奨します。これはスワップを最小限にするためであり、結果としてパフォーマンスが向上します。充分なメモリがある場合、解析データのスワップは無効化しても構いません。スワップを無効化すると、コード解析の速度が上がる場合があります。
スワップ モードを有効化/無効化するには、DTP のテスト コンフィギュレーション画面を使用します。
ディスクへの解析データのスワップを有効化: デフォルトで 有効 です。大量のメモリを必要としない小さなサイズのプロジェクトに対してフロー解析を実行する場合、または 64-bit システムのように十分なメモリがある場合、このオプションを無効化すると、解析のパフォーマンスが向上する場合があります。
フロー解析の冗長性の設定
DTP のテスト コンフィギュレーション画面では、次のオプションを設定できます。
- 原因が特定できない場合は違反をレポートしない: 原因を表示できない場合に違反をレポートするかどうかを指定します。
一部のフロー解析ルールでは、フロー解析はあるポイントに至るすべての可能なパスをチェックし、すべてのパスについて特定の条件が満たされることを検証する必要があります。そのような場合、1 つの違反が複数のパスに関連付けられます (単純なケースでは、1 つの違反が 1 つのパスによって表されます)。そのような違反のすべてのパスは、違反のすべてのパスに共通する違反ポイントで終わります。ただし、別のパスがコード中の別のポイントで開始する可能性もあります。各パスの開始点が違反の原因 (コード中のポイント。それよりも後の違反ポイントのコードで特定の条件の違反を規定する) です。「複数パスの違反」でパスによって原因が異なる場合、フロー解析は違反のポイントだけを表示します (違反の原因は表示しません)。
違反の原因から違反ポイントまでの完全なパスが表示される通常のケースと比較すると、違反ポイントだけの違反は、理解しにくい場合があります。そのため、違反の原因を表示できない場合に違反を非表示にするこのオプションが用意されています。 - 疑わしいポイントごとに違反を 1 つだけ表示: 1 つの疑わしいポイントにつき、( 1 つのルールに対する) 1 つの違反だけをレポートします。たとえば、null 値のソースが複数ある null 間接参照の可能性が検出された場合、1 つの違反だけがレポートされます。このオプションを選択すると、 フロー解析のパフォーマンスが若干速くなります。
終了関数の指定
アプリケーションを終了させる関数を定義できます。C/C++ プログラミングでは、回復が不可能な致命的なエラーが発生した場合に、関数を使ってアプリケーションの実行を終了させることがあります。たとえば標準ライブラリの abort()
や exit()
といった関数です。フロー解析はアプリケーションの実行フローを解析するため、アプリケーションを直ちに停止して実行フローをブレークする終了関数を把握することは、フロー解析にとって非常に重要です。終了関数を把握していない場合、フロー解析がアプリケーションについて誤った推測を行う可能性があります。
フロー解析は、標準ライブラリで定義された終了関数を認識します。しかし、非標準ライブラリに独自の終了関数が定義されることも多いため、それだけでは十分ではない場合もあります。独自の終了関数をアプリケーションで使用している場合、[終了関数] タブのリストにその終了関数を追加します。終了関数をリストに追加しない場合、終了関数による実行パスについてフロー解析が誤った結果をレポートする (本当は違反ではないものを違反としてレポートする) 可能性があります。
サポート対象 API が表示されたリストを使用して、各種 API の終了関数を有効化/無効化したり、終了関数を含む独自の API を定義します。特定のライブラリの終了関数の情報を追加するには、次の操作を行います。
- テーブルの一番上の行の + ボタンをクリックします。
- 矢印をクリックして [アプリケーションの実行を終了させる関数] タブを開きます。
- 表示されたテーブルに入力します。以下の列があります。
• 有効: 解析中にビルトイン終了関数またはカスタム終了関数を考慮するかどうかを指定します。
•完全修飾型名または名前空間 (ワイルドカード): 特定の終了関数のエンティティを指定します。このフィールドに何も指定しない場合、[関数名] で指定された名前のグローバル関数が終了関数と見なされます。たとえば、終了関数が名前間空間 myNameSpace の myClass で宣言されている場合、このフィールドの値は myNameSpace::myClass になります。あるいは、終了関数が型において宣言されてなく、名前空間 myNameSpace にだけ属している場合、このフィールドの値は myNameSpace になります。
• 関数名 (ワイルドカード): 終了関数の名前を指定します。
• + サブクラスの定義: サブクラス中の終了関数の定義も、終了関数として見なすかどうかを指定します。この設定は、完全修飾型名が指定されている場合にだけ意味を持ち、インスタンス関数と非インスタンス関数の両方に適用されます。
マルチスレッド オプションの指定
[マルチスレッド] タブでは、既知のマルチスレッド関数を有効化/無効化するだけでなく、スレッド間の同期化のための関数を定義することができます。このタブで定義した情報は、BD.TRS (スレッドと同期化) カテゴリのルールに影響します。BD.TRS カテゴリのルールは、[マルチスレッド] タブで定義および有効化されているすべての関数をチェックします。
サポートされる API のチェックボックスをオンにして、さまざまな API の同期化関数を有効化するだけでなく、同期化関数を含むユーザー独自の API からの関数を有効化することもできます。特定のライブラリの同期化関数の情報を追加するには、次の操作を行います。
- テーブルの一番上の行の + ボタンをクリックします。
- [API] フィールドにライブラリ名を入力します。
- 矢印をクリックしてタブを開き、表示されたテーブルに以下の関数の型を定義します (テーブルの入力の詳細については下で説明します)。
ロックする関数 (mutex の獲得など)
• ロックを解除する関数 (mutex の解放など))
• スリープ関数
• ロックを破棄する関数
ロック関数
テーブルに以下の情報を入力します。
- 有効: 解析中にロック関数を考慮するかどうかを指定します。
- 完全修飾型名または名前空間 (ワイルドカード): 関数が宣言された型または名前空間の完全修飾名です。任意の型 (または名前空間) で宣言された関数、また型や名前空間の外で宣言されたグローバル関数を指定するには '*' を使用します。
- 関数名 (ワイルドカード): ロック関数の名前を指定します。任意の数の任意の文字を表すには '*' を使用します。
- + サブクラスの定義: サブクラス中の (指定された名前の) ロック関数の定義も、ロック関数として見なすかどうかを指定します。 この設定は、インスタンス関数と非インスタンス関数の両方に適用されます。
- "this" オブジェクトが mutex である: 関数が呼び出されたオブジェクトの mutex をロックすることを示します。
- mutex を返す: 関数が mutex を返すことを示します。
- エラー時の戻り値の制約: 割り当てエラー時にリソース アロケーターが汎整数値を返す場合、戻り値の制約を指定します。<comparison operator><integer value> という書式で条件を入力します。たとえば、エラー時に関数がゼロ以外の値を返す場合、フィールドに "!=0" (引用符は入力しない) 入力します。エラー時のリターン コードが -1 の場合、"==-1" と入力します。"!=" および "==" のほかに、次の演算子を使用してエラー条件を指定できます: ">"、">="、"<"、および "<="
- mutex パラメーター: 関数がパラメーターの 1 つである mutex をロックすることを示します。
ロック解除関数
テーブルに以下の情報を入力します。
- 有効: 解析中にロック解除関数を考慮するかどうかを指定します。
- 完全修飾型名または名前空間 (ワイルドカード): 関数が宣言された型または名前空間の完全修飾名です。任意の型 (または名前空間) で宣言された関数、また型や名前空間の外で宣言されたグローバル関数を指定するには '*' を使用します。
- 関数名 (ワイルドカード): ロック解除関数の名前を指定します。任意の数の任意の文字を表すには '*' を使用します。
- + サブクラスの定義: サブクラス中の (指定された名前の) ロック解除関数の定義も、ロック解除関数として見なすかどうかを指定します。この設定は、インスタンス関数と非インスタンス関数の両方に適用されます。
- "this" オブジェクトが mutex である: 関数が呼び出されたオブジェクトの mutex をロック解除することを示します。
- mutex パラメーター: 関数がパラメーターの 1 つである mutex のロックを解除することを示します。
スリープ関数
テーブルに以下の情報を入力します。
- 有効: 解析中にスリープ関数を考慮するかどうかを指定します。
- 完全修飾型名または名前空間 (ワイルドカード): 関数が宣言された型または名前空間の完全修飾名です。任意の型 (または名前空間) で宣言された関数、また型や名前空間の外で宣言されたグローバル関数を指定するには '*' を使用します。
- 関数名 (ワイルドカード): スリープ関数の名前を指定します。任意の数の任意の文字を表すには '*' を使用します。
- + サブクラスの定義: サブクラス中の (指定された名前の) スリープ関数の定義も、スリープ関数として見なすかどうかを指定します。この設定は、インスタンス関数と非インスタンス関数の両方に適用されます。
ロックを破棄する関数
テーブルに以下の情報を入力します。
- 有効: 解析中にロック破棄関数を考慮するかどうかを指定します。
- 完全修飾型名または名前空間 (ワイルドカード): 関数が宣言された型または名前空間の完全修飾名です。任意の型 (または名前空間) で宣言された関数、また型や名前空間の外で宣言されたグローバル関数を指定するには '*' を使用します。
- 関数名 (ワイルドカード): ロック破棄関数の名前を指定します。任意の数の任意の文字を表すには '*' を使用します。
- + サブクラスの定義: サブクラス中の (指定された名前の) ロック破棄関数の定義も、ロック破棄関数として見なすかどうかを指定します。この設定は、インスタンス関数と非インスタンス関数の両方に適用されます。
- "this" オブジェクトが mutex である: 関数が呼び出されたオブジェクトの mutex を破棄することを示します。
- mutex パラメーター: 関数がパラメーターの 1 つである mutex を破棄することを示します。
リソースの指定
[リソース] タブでは、BD.RES (リソース) カテゴリのルールを使ってチェックするリソースを定義することができます。BD.RES カテゴリのルールは、[リソース] タブで定義および有効化されているすべてのリソースについて、リソースが正しく使用されているかをチェックします。
- リソースのタイプを指定します。
- [有効] チェックボックスをオンにします。
- 適切な場合、[アプリケーション終了時の違反をレポートしない] オプションをオフにします。
矢印をクリックして [リソース アロケーター]、[リソース クローザー]、[リソース チェッカー] および [セーフ関数] タブを開き、表示されたテーブルにリソースのアロケーター/クローザー/チェッカー/セーフ関数の情報を入力します。詳細については以下のセクションを参照してください。
リソース アロケーターの設定
[リソース アロケーター ] テーブルには、リソースを生成する関数の記述を入力できます。テーブルには以下の列があります。
- 有効: 解析中にアロケーターを考慮するかどうかを指定します。
- 完全修飾型名または名前空間 (ワイルドカード): 関数が宣言された型または名前空間の完全修飾名です。任意の型 (または名前空間) で宣言された関数、また型や名前空間の外で宣言されたグローバル関数を指定するには '*' を使用します。
- 関数名 (ワイルドカード): アロケーター関数の名前を指定します。任意の数の任意の文字を表すには '*' を使用します。
- リソース パラメーター: 関数が リソースを割り当てる1つ以上のパラメーターを指定します。パラメーターの位置 (1 から開始) を指定するか、アスタリスク (*) を指定して、すべてのパラメーターにリソースを割り当てます。
- + サブクラスの定義: サブクラス中の (指定された名前の) アロケーター関数の定義も、アロケーター関数として見なすかどうかを指定します。この設定は、インスタンス関数と非インスタンス関数の両方に適用されます。
- "this" オブジェクトがリソース: 関数が呼び出されたオブジェクトのリソースを割り当てることを示します。
- リソース オブジェクトを返す: 関数が割り当てられたリソースを返すことを示します。
- エラー時の戻り値の制約: 割り当てエラー時にリソース アロケーターが汎整数値を返す場合、戻り値の制約を指定します。<comparison operator><integer value> という書式で条件を入力します。たとえば、エラー時に関数がゼロ以外の値を返す場合、フィールドに "!=0" (引用符は入力しない) 入力します。エラー時のリターン コードが -1 の場合、"==-1" と入力します。"!=" および "==" のほかに、次の演算子を使用してエラー条件を指定できます: ">"、">="、"<"、および "<="
一般的に、アロケーター関数はエラー コードを返してリソース割り当ての失敗を表します。アロケーター関数 はリソースへのポインターを返し、通常 NULL ポインターはリソース割り当ての失敗を表します。リソース リークを探すときに、フロー解析はリソースの割り当てが成功したか失敗したかを把握できる必要があります。これは、割り当てが実際に発生したパス上で発見されないクローザー関数への呼び出しだけをフロー解析がレポートするのに役立ちます。リソース アロケーター関数がリソースへのポインターを返し、このポインターが NULL でない場合、フロー解析はリソースが正常に割り当てられたと推測します。
リソース クローザーの設定
[リソース クローザー] テーブルには、リソースをクローズする関数の記述を入力できます。テーブルには以下の列があります。
- 有効: 解析中にクローザーを考慮するかどうかを指定します。
- 完全修飾型名または名前空間 (ワイルドカード): 関数が宣言された型または名前空間の完全修飾名です。任意の型 (または名前空間) で宣言された関数、また型や名前空間の外で宣言されたグローバル関数を指定するには '*' を使用します。
- 関数名 (ワイルドカード): クローザー関数の名前を指定します。任意の数の任意の文字を表すには '*' を使用します。
- + サブクラスの定義: サブクラス中の (指定された名前の) クローザー関数の定義も、クローザー関数として見なすかどうかを指定します。この設定は、インスタンス関数と非インスタンス関数の両方に適用されます。
- "this" オブジェクトが リソース: 関数が呼び出されたオブジェクトのリソースをクローズすることを示します。
- リソース パラメーター: メソッドが リソースをクローズする 1つ以上のパラメーターを指定します。パラメーターの位置 (1 から開始) を指定するか、アスタリスク (*) を指定して、すべてのパラメーターにリソースを割り当てます。
リソース チェッカーの設定
[リソース チェッカー] テーブルには、リソースが開かれているかどうかをチェックする関数の記述を入力できます。テーブルには以下の列があります。
- 有効: 解析中にチェッカーを考慮するかどうかを指定します。
- 完全修飾型名または名前空間 (ワイルドカード): 関数が宣言された型または名前空間の完全修飾名です。任意の型 (または名前空間) で宣言された関数、また型や名前空間の外で宣言されたグローバル関数を指定するには '*' を使用します。
- 関数名 (ワイルドカード): チェッカー関数の名前を指定します。任意の数の任意の文字を表すには '*' を使用します。
- + サブクラスの定義: サブクラス中の (指定された名前の) チェッカーの定義も、チェッカーとして見なすかどうかを指定します。この設定は、インスタンス関数と非インスタンス関数の両方に適用されます。
- "this" オブジェクトがリソース: 関数が呼び出されたオブジェクトのリソースをチェックすることを示します。
- リソース パラメーター: 関数が リソースをチェックする 1つ以上のパラメーターを指定します。パラメーターの位置 (1 から開始) を指定するか、アスタリスク (*) を指定して、すべてのパラメーターにリソースを割り当てます。
- リソースがオープンされているときの戻り値: リソースが開かれている場合にチェッカー関数が返す値を指定します。
true
またはfalse
を指定できます。
セーフ関数の設定
[セーフ関数] テーブルには、クローズ済みのリソースで呼び出しても安全な関数 (BD-RES-FREE ルールの違反をレポートしない関数) の記述を入力できます。テーブルには以下の列があります。
- 有効: 解析中にセーフ関数を考慮するかどうかを指定します。
- 完全修飾型名または名前空間 (ワイルドカード): 関数が宣言された型または名前空間の完全修飾名です。任意の型 (または名前空間) で宣言された関数、また型や名前空間の外で宣言されたグローバル関数を指定するには '*' を使用します。
- 関数名 (ワイルドカード): セーフ関数の名前を指定します。任意の数の任意の文字を表すには '*' を使用します。
- + サブクラスの定義: サブクラス中の (指定された名前の) 定義も、安全と見なすかどうかを指定します。この設定は、インスタンス関数と非インスタンス関数の両方に適用されます。
解析スコープの拡大
コード解析を実行する際、フロー 解析はテスト対象のソース ファイルおよびヘッダー ファイルに定義された関数定義を処理します。テスト スコープ外のヘッダー ファイルで定義された関数は解析されず、フロー解析はそのセマンティクスを考慮しません。フロー解析がテスト スコープ外で定義された関数定義の情報を必要とする場合、以下のようにオプションを設定できます。
解析対象の外部ファイル: フロー解析で解析する追加のヘッダー ファイルへの絶対パスを指定します。ワイルドカードを使用してパターンを指定します。
解析対象の外部関数: フロー解析で解析する追加の関数を指定します。テーブルに以下の情報を入力します。テーブルに以下の情報を入力します。
- 有効: 解析中に関数を考慮するかどうかを指定します。
- 完全修飾型名または名前空間 (ワイルドカード): 関数が宣言された型または名前空間の完全修飾名です。任意の型 (または名前空間) で宣言された関数、また型や名前空間の外で宣言されたグローバル関数を指定するには '*' を使用します。
- 関数名 (ワイルドカード): 関数の名前を指定します。任意の数の任意の文字を表すには '*' を使用します。
- パラメーター数: 関数のパラメーターの数を指定します。任意の数のパラメーターを指定するには、'-1' を使用します。
- + サブクラスの定義: サブクラス中の (指定された名前の) 関数の定義も含めるかどうかを指定します。この設定は、インスタンス関数と非インスタンス関数の両方に適用されます。
常に解析される関数の指定
[常に解析すべき関数] オプションを使用すると、実行パス中で見つかったら常に解析する関数を定義できます。これにより、特定のパスを解析したとき、通常は入らない関数を必ず解析するようにできます。
[有効] チェックボックスをオンにして、以下の情報を指定します。
- 完全修飾型名または名前空間 (ワイルドカード): 関数を含む型または名前空間の完全修飾名を指定します。
- 関数名 (ワイルドカード): 関数の名前を指定します。
- + サブクラスの定義: サブクラス中の関数も考慮するかどうかを指定します。
コンパイラ固有の設定
"errno" 値の内部表現: 規格では、errno は変更可能な int 型の lvalue であると定義されています。errno がマクロであるか、外部リンケージを持つと宣言された識別子であるかは未指定です。処理系は、グローバル変数 "errno" または "__errno" を使用するか、呼び出し先関数の異なる "(*errno_function())" というパターンを使用できます。このオプションを使用すると、正規表現を使用してこれらの変数および関数の名前を指定できます。
- 関数名のパターン: "errno" 値が使用される場合に呼び出される関数の名前です。正規表現で名前を指定します。
- 変数名のパターン: "errno" 値が使用される場合に呼び出される変数の名前です。正規表現で名前を指定します。
ヘッダー <ctype.h> の関数への呼び出しの内部表現: 規格には、<ctype.h> ヘッダーに定義するべき関数がいくつか指定されています。一部の処理系 (C モードの GNU GCC など) は、内部配列の要素とフラグを比較してテストするコードに展開されるマクロとして、これらの関数を定義します。これは、グローバル配列または関数によって返されるポインターである可能性があります。このオプションを使用すると、正規表現を使用してこれらの変数および関数の名前を指定できます。
- 関数名のパターン: <ctype.h> ヘッダーのいずれかの関数の代わりに内部的に呼び出される関数の名前です。正規表現で名前を指定します。正規表現で名前を指定します。
- 変数名のパターン: <ctype.h> ヘッダーのいずれかの関数を呼び出した後に内部的に使用される変数の名前です。正規表現で名前を指定します。正規表現で名前を指定します。
デスクトップ解析のためのフロー解析データの再利用
デスクトップでのフロー解析のパフォーマンスを向上する方法として、デスクトップ上でサーバー解析データを再利用する方法があります。解析データを再利用するには、マッピングを定義することによって、対応するデスクトップ ファイル パスを使ってサーバー ファイル パスをフロー解析エンジンが照合できるようにする必要があります。
また、たとえば 1 個のファイルなどの小さな範囲で、解析スコープの範囲外にあるファイルで定義されたメソッドを含むビルド パスで解析を実行するために、データを再利用できます (解析スコープの範囲外にあるファイルが解析済みであることが条件です)。
この機能の詳細については Parasoft サポートにお問い合わせください。