このセクションでは、特定の静的解析違反メッセージを C/C++test でレポートしないようにする方法を説明します。
このセクションの内容
抑制とは
抑制は、特定の静的解析違反メッセージを C/C++test でレポートしないようにするために使用されます。全般的にコーディング規約に従いつつ、レポートされたタスクのうちの一部だけをあえて無視する場合、抑制機能を使用します。
抑制はソース コード内またはローカル抑制ファイルに保存できます。これらのファイルをソース管理システムにチェックインし、チーム全体で共有できます。Parasoft GUI を使用して抑制を作成するか、抑制に関する情報を手動でソース コードまたは抑制ファイルに追加します。また、設定ファイルでプログラム的に抑制を定義することもできます。
GUI での抑制の定義
[品質タスク] ビューに表示されている静的解析違反を抑制するには、次の操作を行います。
- [品質タスク] ビューで、抑制するタスクを表すアイテムを右クリックし、ショートカット メニューの [タスクの抑制] をクリックします。
複数のタスクを抑制するには、タスクのグループを表すノード (ルール カテゴリ、特定のルール、ファイル) を右クリックし、[すべてのタスクを抑制] をクリックします。 - 抑制をどこに保存するかを選択します。以下のいずれかのオプションを選択できます。
- 抑制ファイル内で抑制 - 抑制はソース ファイルと同じディレクトリにある parasoft.suppress ファイルに保存されます。詳細は「抑制ファイルでの抑制の定義」を参照してください。
- ソースコード内での抑制 - 選択されたタスクはコード内で抑制され、ソース管理システムにチェックインされるとチーム全体で共有されます。
- ローカルで抑制 (非推奨) - 抑制は非推奨の XML 形式フォーマットでローカルに保存されます。詳細については「非推奨の抑制の扱い」を参照してください。 - 抑制の理由を入力します。
- [OK] をクリックして抑制を完了します。抑制されたタスクが [品質タスク] ビューから消去されます。
抑制ファイルでの抑制の定義
ファイルに抑制を保存することを選択した場合、抑制はルール違反を含むソース ファイルと同じディレクトリにある parasoft.suppress ファイルに保存されます。ファイル内抑制は以下のいずれかの方法で定義できます。
- 手動で parasoft.suppress ファイルを作成し、抑制エントリを追加する。手動で抑制ファイルを作成する場合、抑制対処のタスクを含むソース ファイルと同じディレクトリに抑制ファイルがあることを確認してください。
GUI で [抑制ファイル内で抑制] オプションを選択する (「GUI での抑制の定義」を参照)
新しく作成された抑制ファイルはプロジェクトに追加されません。抑制ファイルをプロジェクトに追加するには、次の操作を行います。
- Visual Studio のソリューション エクスプローラーで [Show All Files] オプションを有効にするか、オプションがすでに有効な場合はソリューション エクスプローラーをリフレッシュします。すると、Parasoft 抑制ファイルを含めたプロジェクト外のファイルが表示されます。
- プロジェクトに追加する抑制ファイルを右クリックし、メニューの [Include in Project] をクリックします。
抑制ファイルをソース管理システムにチェックインすることを推奨します。そうすると、抑制に関する情報を他のチーム メンバーと共有でき、master、trunk などのメインの開発ストリームにコードをマージする前に SCM リポジトリのブランチで容易に抑制をレビューできます。
parasoft.suppress ファイルに抑制エントリを追加するには、次のフォーマットを使用します。
suppression-begin file: Account.cpp (required) line: 12 (optional) rule-id: CODSTA-123 (optional) message: Exact violation message (optional) reason: Approved (optional) author: devel (optional) date: 2020-09-21 (optional) suppression-end
例
最低でも、問題が検出されたソース ファイルを指定する必要があります。ソース ファイルだけを指定すると、指定されたファイルに対してレポートされたすべての指摘事項が抑制されます。次のサンプルでは、Account ファイルで検出されたすべての指摘事項が抑制されます。
suppression-begin file: Account.cpp suppression-end
他の属性は任意であり、抑制を細かく制御するのに利用できます。次のサンプルでは、Account ファイルで検出された PB.TYPO.TLS ルールの指摘事項が、行にかかわらずすべて抑制されます。
suppression-begin file: Account.cpp rule-id: PB.TYPO.TLS reason: false positive suppression-end
属性に関する注意点
- 抑制の理由を記述するのは良いプラクティスです。
line
属性の使用には注意が必要です。ソース ファイルが変更され、コードが別の行に移動すると、抑制が無効になる可能性があります。
ソース コードでの抑制の定義
ソース コード中で抑制を定義することには、次のような利点があります。
- どのチーム メンバーがコードをテストしても、同じ抑制設定を確実に適用できます。
- 抑制についての説明をコメントとして追加できるため、他のチーム メンバーがコードを参照したときに抑制の理由を明快に理解できます。
- ファイル、クラス、行レベルでルールを細かく制御できます。
ソース コード中で抑制を定義する方法は 2 種類あります。GUI で適切なオプションを選択するか ( 「GUI での抑制の定義」を参照) 、次の抑制構文を使用して、手動でソース コードに抑制を記述します。
行単位の抑制
<suppression keyword> [<rule category> | <rule category> . <rule id> | <rule category > - <rule severity> | ALL ] <suppression comment>
行単位の抑制の例
//parasoft-suppress CODSTA "suppress all rules in category CODSTA" // parasoft-suppress CODSTA.NEA "suppress rule CODSTA.NEA" // parasoft-suppress CODSTA-1 "suppress all rules in category CODSTA with severity level 1" // parasoft-suppress ALL "suppress all rules" // parasoft-suppress CODSTA FORMAT.MCH JAVADOC-3 "suppress all rules in category CODSTA and rule FORMAT.MCH and all rules in category JAVADOC with severity level 3"
ブロック単位の抑制
<begin suppression keyword> [<rule category> | <rule category> . <rule id> | <rule category > - <rule severity> | ALL ] <suppression comment> ..... source code block ..... <end suppression keyword> [<rule category> | <rule category> . <rule id> | <rule category > - <rule severity> | ALL ] <suppression comment>
ブロック単位の抑制の例
// parasoft-begin-suppress CODSTA "begin suppress all rules in category CODSTA" ..... // parasoft-end-suppress CODSTA "end suppress all rules in category CODSTA" // parasoft-begin-suppress CODSTA.NEA "begin suppress rule CODSTA.NEA" ..... // parasoft-end-suppress CODSTA.NEA "end suppress rule CODSTA.NEA" // parasoft-begin-suppress CODSTA-1 "begin suppress all rules in category CODSTA with severity level 1" ...... // parasoft-end-suppress CODSTA-1 "end suppress all rules in category CODSTA with severity level 1" //parasoft-begin-suppress ALL "begin suppress all rules" ..... // parasoft-end-suppress ALL "end suppress all rules" // parasoft-begin-suppress CODSTA FORMAT.MCH "begin suppress all rules in category CODSTA and rule FORMAT.MCH" ..... // parasoft-end-suppress CODSTA FORMAT.MCH "end suppress all rules in category CODSTA and rule FORMAT.MCH" // parasoft-begin-suppress CODSTA "begin suppress all rules in category CODSTA" ..... // parasoft-end-suppress CODSTA-1 "end suppress all rules in category CODSTA with severity level 1; however rules with severity level 2-5 in category CODSTA are still suppressed." ..... // parasoft-end-suppress CODSTA "end suppress all rules in category CODSTA" // parasoft-begin-suppress ALL "begin suppress all rules" ..... // parasoft-end-suppress CODSTA FORMAT-1 "end suppress all rules in category CODSTA and all rules in category FORMAT with severity level 1; however, others rules in CODSTA and FORMAT-1 are still suppressed." ..... // parasoft-end-suppress ALL "end suppress all rules" //parasoft-begin-suppress ALL "begin suppress all rules, since no end suppression comment, all rules will be suppressed starting from this line"
正規表現に基づく行抑制の定義
正規表現パターンに一致する行で検出された静的ルール違反を自動的に抑制するよう設定できます。これは、Qt マクロなど、行内またはコード内抑制を使用して抑制するのが難しいタスクを抑制したい場合に便利です。
コード行を指定する正規表現パターンを定義するには、次の操作を行います。
詳細設定ファイルを作成し、以下の C/C++test 詳細設定を含めます。
cpptest.result.line.suppressions.enabled=true // Enables creating regex-based suppressions. cpptest.result.line.suppressions.pattern=[regex;regex] // Specifies a semicolon-separated list of regex patterns.
- 詳細設定ファイルへのパスを指定します。「詳細設定ファイルの設定」を参照してください。
指定された正規表現パターンに一致する行で発生した静的ルール違反が抑制されます。たとえば、次のように指定すると、任意の個所に "Q_" を含むコード行で検出されたすべての違反が抑制されます。
cpptest.result.line.suppressions.enabled=true cpptest.result.line.suppressions.pattern=.*Q_.*
非推奨の抑制の扱い
ローカルまたは Team Server への XML 形式フォーマットでの抑制の保存はで非推奨になりました。C/C++test 2020.2 から、抑制はコード内で直接、またはファイル内抑制フォーマットで作成されます (「抑制ファイルでの抑制の定義」を参照)。プロジェクトに非推奨のフォーマットの抑制がある場合 (以前のバージョンの C/C++test で抑制を作成し、C/C++test のバージョンを 2020.2 にアップグレードした場合など)、引き続き抑制がコードに適用され、非推奨の抑制ビューで抑制を参照できます。
非推奨の抑制の移行
C/C++test の機能を使用して抑制をファイル内抑制に移行できます。
- IDE メニューの [Parasoft] > [ビューの表示] > [抑制 (非推奨)] をクリックして非推奨の抑制ビューをオープンします。
- メニューの [抑制の移行...] をクリックします。
- 表示されたダイアログの指示に従います。
C/C++test が Team Server に接続されている場合、C/C++test は Team Server に保存されたチーム抑制を検出して移行します。結果として、以下が行われます。
- 非推奨のチームでの抑制がプレーンテキストに変換され、対応するソース ファイルと同じディレクトリの parasoft.suppress ファイルに保存されます。
- 移行後も、非推奨のチーム抑制は Team Server および非推奨の抑制ビューに残っており、手動で削除する必要があります。
C/C++test が Team Server に接続されていない場合、C/C++test はワークスペースに保存されたローカル抑制を検出して移行します。結果として、以下が行われます。
- 非推奨のローカル抑制がプレーンテキストに変換され、対応するソース ファイルと同じディレクトリの parasoft.suppress ファイルに保存されます。
- 非推奨のフォーマットでローカル抑制を含むバックアップ ファイルが作成されます。このファイルの場所はコンソールに表示されます。
- 移行後、非推奨のローカル抑制はワークスペースおよび非推奨の抑制ビューから削除されます。
バックアップ ファイルから非推奨のローカル抑制を復元したい場合は、次の操作を行います。
- IDE を閉じます。
バックアップファイルが保存されている場所 (コンソールに表示されます) に移動します。local_suppressions_backup.zip ファイルがあります。
local_suppressions_backup.zip の内容を同じ場所に展開します。
復元されたローカル抑制を次の IDE 起動時に再移行できます。
非推奨の抑制の有効化
非推奨の抑制を有効化すると、非推奨のフォーマットで抑制を作成し、ローカルまたは Team Server に保存できるようになります。
- IDE メニューの [Parasoft] > [ビューの表示] > [抑制 (非推奨)] をクリックして非推奨の抑制ビューをオープンします。
- メニューの [非推奨の抑制を有効化] オプションをオンにします。