このセクションでは、特定の静的解析違反メッセージを C/C++test でレポートしないようにする方法を説明します。
このセクションの内容
抑制とは
抑制は、特定の静的解析違反メッセージを C/C++test でレポートしないようにするために使用されます。全般的にコーディング規約に従いつつ、レポートされたタスクのうちの一部だけをあえて無視する場合、抑制機能を使用します。
抑制はソース コード内またはローカル抑制ファイルに保存できます。これらのファイルをソース管理システムにチェックインし、チーム全体で共有できます。Parasoft GUI を使用して抑制を作成するか、抑制に関する情報を手動でソース コードまたは抑制ファイルに追加します。また、設定ファイルでプログラム的に抑制を定義することもできます。
GUI での抑制の定義
[品質タスク] ビューに表示されている静的解析違反を抑制するには、次の操作を行います。
- [品質タスク] ビューで、抑制するタスクを表すアイテムを右クリックし、ショートカット メニューの [タスクの抑制] をクリックします。
複数のタスクを抑制するには、タスクのグループを表すノード (ルール カテゴリ、特定のルール、ファイル) を右クリックし、[すべてのタスクを抑制] をクリックします。 - 抑制をどこに保存するかを選択します。以下のいずれかのオプションを選択できます。
- 抑制ファイル内で抑制 - 抑制はソース ファイルと同じディレクトリにある parasoft.suppress ファイルに保存されます。詳細は「抑制ファイルでの抑制の定義」を参照してください。
- ソースコード内での抑制 - 選択されたタスクはコード内で抑制され、ソース管理システムにチェックインされるとチーム全体で共有されます。 - 抑制の理由を入力します。
- [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
属性の使用には注意が必要です。ソース ファイルが変更され、コードが別の行に移動すると、抑制が無効になる可能性があります。message
属性では、以下のワイルドカードがサポートされています。- ? - 任意の 1 文字
- * - 任意の文字の連続
ソース コードでの抑制の定義
ソース コード中で抑制を定義することには、次のような利点があります。
- どのチーム メンバーがコードをテストしても、同じ抑制設定を確実に適用できます。
- 抑制についての説明をコメントとして追加できるため、他のチーム メンバーがコードを参照したときに抑制の理由を明快に理解できます。
- ファイル、クラス、行レベルでルールを細かく制御できます。
ソース コード中で抑制を定義する方法は 2 種類あります。 GUI で適切なオプションを選択するか ( 「GUI での抑制の定義」を参照) 、次の抑制構文を使用して、手動でソース コードに抑制を記述します。
行単位の抑制
行単位の抑制を使用すると、単一行の違反を抑制できます。次の構文を使用して、違反がある行の行末に抑制コメントを指定します。
// parasoft-suppress <rule-id>|<rule-category>|ALL "<suppression comment>"
例:
int proc1(bool a, bool b, int i) { if (a | b) // parasoft-suppress CERT_C "suppress all rules in category CERT_C" if (b = a)// parasoft-suppress CERT_C-EXP45 "suppress rule CERT_C-EXP45" { std::string emptyString1 = ""; // parasoft-suppress JSF-3 "suppress all rules in category Joint Strike Fighter with severity level 3" } else { std::string emptyString2 = ""; // parasoft-suppress CERT_C-DCL00 JSF-043 JSF-051 "suppress multiple rules" } return i++; // parasoft-suppress ALL "suppress all rules" }
次行の抑制
次行の抑制を使用すると、単一行の違反を抑制できます。次の構文を使用して、違反がある行の直前に抑制コメントを指定します。
// parasoft-suppress-next-line <rule-id>|<rule-category>|ALL "<suppression comment>"
抑制コメントと抑制対象の指摘事項を含む行の間に他のコメントまたは空の行があってはいけません。唯一の例外は、次行の抑制が複数指定されている場合です。
// parasoft-suppress-next-line AUTOSAR-A7_1_1-a "reason for suppression AUTOSAR-A7_1_1-a" // parasoft-suppress-next-line AUTOSAR-A7_1_1-b "reason for suppression AUTOSAR-A7_1_1-b" // parasoft-suppress-next-line AUTOSAR-A8_5_2-a "reason for suppression AUTOSAR-A8_5_2-a" ... code line ...
この場合、最後の抑制コメントの次の行にすべての抑制が適用されます。
例:
int proc1(bool a, bool b, int i) { // parasoft-suppress-next-line CERT_C "suppress all rules in category CERT_C" if (a | b) // parasoft-suppress-next-line CERT_C-EXP45 "suppress rule CERT_C-EXP45" if (b = a) { // parasoft-suppress-next-line JSF-3 "suppress all rules in category Joint Strike Fighter with severity level 3" std::string emptyString1 = ""; } // parasoft-suppress-next-line ALL "suppress all rules" return i++; }
ブロック単位の抑制
ブロック単位の抑制を使用すると、コード ブロックの違反を抑制できます。次の構文を使用して、違反があるコード ブロックの前後に開始/終了コメントを指定します。
// parasoft-begin-suppress <rule-id>|<rule-category>|ALL "<suppression comment>" ... code block ... // parasoft-end-suppress <rule-id>|<rule-category>|ALL "<suppression comment>"
例:
int proc2(bool a, bool b, int i) { // parasoft-begin-suppress CERT_C "begin suppress all rules in category CERT_C" if (a | b) if(b = a) // parasoft-end-suppress CERT_C "end suppress all rules in category CERT_C" { std::string emptyString1 = ""; } return i++; } int proc3(bool a, bool b, int i) { if (a | b) // parasoft-begin-suppress CERT_C-EXP45 "begin suppress rule CERT_C-EXP45" if(b = a) // parasoft-end-suppress CERT_C-EXP45 "end suppress rule CERT_C-EXP45" { std::string emptyString1 = ""; } return i++; } int proc4(bool a, bool b, int i) { // parasoft-begin-suppress JSF-3 "begin suppress all rules in category Joint Strike Fighter with severity level 3" if (a | b) if(b = a) { std::string emptyString1 = ""; } return i++; // parasoft-end-suppress JSF-3 "end suppress all rules in category Joint Strike Fighter with severity level 3" } // parasoft-begin-suppress ALL "begin suppress all rules" int proc5(bool a, bool b, int i) { if (a | b) if(b = a) { std::string emptyString1 = ""; } return i++; } // parasoft-end-suppress ALL "end suppress all rules"
ファイルで複数のルールを抑制するには、ファイルの先頭/末尾に次を含めます。
// parasoft-begin-suppress CERT_C-DCL00 JSF-043 JSF-051 "begin suppress multiple rules" ..... // parasoft-end-suppress CERT_C-DCL00 JSF-043 JSF-051 "end suppress multiple rules"
正規表現に基づく行抑制の定義
正規表現パターンに一致する行で検出された静的ルール違反を自動的に抑制するよう設定できます。これは、Qt マクロなど、行内またはコード内抑制を使用して抑制するのが難しいタスクを抑制したい場合に便利です。
コード行を指定する正規表現パターンを定義するには、次の操作を行います。
詳細設定ファイルを作成し、以下の C/C++test 詳細設定を含めます。
cpptest.result.line.suppressions.enabled=true // Enables creating regex-based suppressions. cpptest.result.line.suppressions.pattern=[regex<rule-id|rule-category|ALL>;regex<rule-id|rule-category|ALL>] // Specifies a semicolon-separated list of regex patterns.
注意: <> 括弧は、ルールを指定する場合にだけ必要です。ルールの指定は、カンマ区切りのリストでもかまいません。
- 詳細設定ファイルへのパスを指定します。「詳細設定ファイルの設定」を参照してください。
指定された正規表現パターンに一致する行で発生した静的ルール違反が抑制されます。たとえば、次のように指定すると、任意の個所に "Q_" を含むコード行で検出されたすべての違反が抑制されます。
cpptest.result.line.suppressions.enabled=true cpptest.result.line.suppressions.pattern=.*Q_.*<OPT>
非推奨の抑制の扱い
XML フォーマットでの抑制の保存はサポートされなくなりました。プロジェクトに新しいフォーマットに移行したい未サポートのフォーマットの抑制がある場合、Parasoft Support にお問い合わせください。