このセクションでは、特定の静的解析違反メッセージを C/C++test でレポートしないようにする方法を説明します。

このセクションの内容

抑制とは

抑制は、特定の静的解析違反メッセージを C/C++test でレポートしないようにするために使用されます。全般的にコーディング規約に従いつつ、レポートされたタスクのうちの一部だけをあえて無視する場合、抑制機能を使用します。

抑制はソース コード内またはローカル抑制ファイルに保存できます。これらのファイルをソース管理システムにチェックインし、チーム全体で共有できます。Parasoft GUI を使用して抑制を作成するか、抑制に関する情報を手動でソース コードまたは抑制ファイルに追加します。また、設定ファイルでプログラム的に抑制を定義することもできます。

MISRA コンプライアンス ワークフローで誤検出を抑制する

MISRA 標準への適合を達成するためのワークフローを実装する場合、DTP で作成される MISRA コンプライアンスレポートから誤検出された違反を除外することができます。違反を抑制し、"false positive" で始まる抑制の理由を指定した場合、違反は MISRA コンプライアンス レポートに記載されません。Paraoft のコンプライアンス ソリューションの詳細については DTP ユーザー ガイドを参照してください。

GUI での抑制の定義

[品質タスク] ビューに表示されている静的解析違反を抑制するには、次の操作を行います。

  1. [品質タスク] ビューで、抑制するタスクを表すアイテムを右クリックし、ショートカット メニューの [タスクの抑制] をクリックします。
    複数のタスクを抑制するには、タスクのグループを表すノード (ルール カテゴリ、特定のルール、ファイル) を右クリックし、[すべてのタスクを抑制] をクリックします。
  2. 抑制をどこに保存するかを選択します。以下のいずれかのオプションを選択できます。
    - 抑制ファイル内で抑制 - 抑制はソース ファイルと同じディレクトリにある parasoft.suppress ファイルに保存されます。詳細は「抑制ファイルでの抑制の定義」を参照してください。
    - ソースコード内での抑制 - 選択されたタスクはコード内で抑制され、ソース管理システムにチェックインされるとチーム全体で共有されます。
    - ローカルで抑制 (非推奨) - 抑制は非推奨の XML 形式フォーマットでローカルに保存されます。詳細については「非推奨の抑制の扱い」を参照してください。
  3. 抑制の理由を入力します。
  4. [OK] をクリックして抑制を完了します。抑制されたタスクが [品質タスク] ビューから消去されます。

抑制ファイルでの抑制の定義

ファイルに抑制を保存することを選択した場合、抑制はルール違反を含むソース ファイルと同じディレクトリにある parasoft.suppress ファイルに保存されます。ファイル内抑制は以下のいずれかの方法で定義できます。

  • 手動で parasoft.suppress ファイルを作成し、抑制エントリを追加する。手動で抑制ファイルを作成する場合、抑制対処のタスクを含むソース ファイルと同じディレクトリに抑制ファイルがあることを確認してください。
  • GUI で [抑制ファイル内で抑制] オプションを選択する (「GUI での抑制の定義」を参照)

    新しく作成された抑制ファイルはプロジェクトに追加されません。抑制ファイルをプロジェクトに追加するには、次の操作を行います。

    1. Visual Studio のソリューション エクスプローラーで [Show All Files] オプションを有効にするか、オプションがすでに有効な場合はソリューション エクスプローラーをリフレッシュします。すると、Parasoft 抑制ファイルを含めたプロジェクト外のファイルが表示されます。
    2. プロジェクトに追加する抑制ファイルを右クリックし、メニューの [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(int i)    // parasoft-suppress AUTOSAR-A7_1_1-a "suppress AUTOSAR-A7_1_1-a violation"
{
  char * m = "msg"; // parasoft-suppress AUTOSAR-A27_0_4 "suppress all AUTOSAR-A27_0_4 violations (AUTOSAR-A27_0_4-a, -b, ...)"
  int j = 0;        // parasoft-suppress AUTOSAR "suppress all AUTOSAR violations"
  return i + (++j); // parasoft-suppress ALL "suppress all violations"
}

ブロック単位の抑制

ブロック単位の抑制を使用すると、コード ブロックの違反を抑制できます。次の構文を使用して、違反があるコード ブロックの前後に開始/終了コメントを指定します。

// parasoft-begin-suppress <rule-id>|<rule-category>|ALL "<suppression comment>"
... code block ...
// parasoft-end-suppress   <rule-id>|<rule-category>|ALL "<suppression comment>"

例:

int proc2(int i)
{
  // parasoft-begin-suppress ALL "suppress all violations"
  char * m = "msg";
  int j = 0;
  return i + (++j);
  // parasoft-end-suppress   ALL "suppress all violations"
}

int proc3(int i)
{
  // parasoft-begin-suppress AUTOSAR "suppress all AUTOSAR violations"
  char * m = "msg";
  int j = 0;
  // parasoft-end-suppress   AUTOSAR "suppress all AUTOSAR violations"
  return i + (++j);
}

// parasoft-begin-suppress   AUTOSAR-A8_5_2-a AUTOSAR-A0_1_1-a "suppress all AUTOSAR-A8_5_2-a and AUTOSAR-A0_1_1-a violations"
int proc4(int i)
{
  char * m = "msg";
  int j = 0;
  return i + (++j);
}
// parasoft-end-suppress     AUTOSAR-A8_5_2-a AUTOSAR-A0_1_1-a "suppress all AUTOSAR-A8_5_2-a and AUTOSAR-A0_1_1-a violations"

以下の抑制ディレクティブは非推奨になりました。

  • parasoft off: この行から開始してファイルの最後まで、すべての静的解析違反メッセージのレポートを抑制します。
  • parasoft on: この行から開始してファイルの最後まで、すべての静的解析違反メッセージのレポートを抑制解除します。
  • parasoft suppress/unsuppress [line <linewildcard>][class <classnamewildcard>][file <filenamewildcard>] [item <ruleid>][type <severity>] [reason <comment>]: パラメーターを指定して抑制を作成します。

正規表現に基づく行抑制の定義

正規表現パターンに一致する行で検出された静的ルール違反を自動的に抑制するよう設定できます。これは、Qt マクロなど、行内またはコード内抑制を使用して抑制するのが難しいタスクを抑制したい場合に便利です。

コード行を指定する正規表現パターンを定義するには、次の操作を行います。

  1. 詳細設定ファイルを作成し、以下の 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.

    注意: <> 括弧は、ルールを指定する場合にだけ必要です。ルールの指定は、カンマ区切りのリストでもかまいません。

  2. 詳細設定ファイルへのパスを指定します。「詳細設定ファイルの設定」を参照してください。

指定された正規表現パターンに一致する行で発生した静的ルール違反が抑制されます。たとえば、次のように指定すると、任意の個所に "Q_" を含むコード行で検出されたすべての違反が抑制されます。

cpptest.result.line.suppressions.enabled=true cpptest.result.line.suppressions.pattern=.*Q_.*<OPT>


非推奨の抑制の扱い

ローカルまたは Team Server への XML 形式フォーマットでの抑制の保存はで非推奨になりました。C/C++test 2020.2 から、抑制はコード内で直接、またはファイル内抑制フォーマットで作成されます (「抑制ファイルでの抑制の定義」を参照)。プロジェクトに新しいフォーマットに移行したい非推奨のフォーマットの抑制がある場合、Parasoft Support にお問い合わせください。


  • No labels