マクロまたはファイルを使用した指摘の除去

Klocwork 2022.2 の時点で、外部の .sconf ファイルを使用して、マクロ、ファイル、およびディレクトリを抑制できます。他の構成ファイルと同様に、kwcheck または kwciagent で構成ファイルをインポートできます。--exclude-issues オプションで kwbuildproject を実行している間に、.sconf ファイルを準備することも、接続されたプロジェクトを実行している間に、それをポータルからインポートすることもできます。

kwbuildproject で --replace-path オプションを使用するときに、抑制は、置換されたパスではなく元のパスを使用します。したがって、--replace-path オプションで指摘の抑制を使用している場合は、パスパターンを使用することをお勧めします。完全なパスを使用する場合は、新しいパスではなく元のパスを使用してください。

それらのすべてを同じ .sconf ファイルに追加することで、複数の抑制構成を使用して指摘を抑制できます。複数の .sconf ファイルを準備することもできます。

Restriction: 複数のマクロが関わっている場合、欠陥は (埋め込まれたマクロではなく) 親マクロに関連して報告されます。たとえば、次のコードでは、欠陥 MISRA.CAST.VOID_PTR_TO_INT.2012 は check_assert() マクロに関して報告され、MAP_FAILED マクロに関しては報告されません。

#define MAP_FAILED (void *)-1
#define check_assert(expr) if (!expr) { abort(); }

void f(void *p)
{
	check_assert(p != MAP_FAILED);
}		

複数のマクロまたは埋め込まれたマクロを使用しており、親マクロを抑制できない場合は、ポータルで指摘ステータスを手動で割り当てることを検討してください (「問題ではない」に変更するなど)。

利用可能な構成

.sconf ファイルは、次の抑制設定をサポートしています:

  • kind: macro, file, or directory

  • name

  • all_issue_codes: true/false OR issue_codes
    フィルター処理する指摘を指定するには、all_issue_codes = true/false を準備するか、または issue_codes を含む指摘コードのリストを提示します。特定の指摘に対してフィルターが false の場合、抑制はスキップされます。例 1 を参照してください。

  • フィルター: true/false

  • allow_optimization: true/false
    最適化が有効になっている場合、そのファイルから翻訳単位全体がスキップされますが、その対象はパスチェッカーのみです。例 3 を参照してください。

  • コメント

パスパターンの使用

Klocwork 2022.4 の時点で、指摘の抑制は、パスのパターンだけでなく、ファイルまたはディレクトリへのフルパスにも対応しています。アスタリスクをワイルドカードとして使用することもできます (非再帰検索には *、再帰検索には **)。

指定されたパターンに一致するすべてのファイルとフォルダーは抑制されるため、パターンを定義する時は、プロジェクト内に類似のファイル名またはフォルダー名があることに注意してください。

以下の例を参照してください。

例 1

たとえば、以下のサンプルのファイル パスがあるとします: /space/workspaces/cvs/ccvs.1.11.18/diff/diff.c

フィールド以下のパターンを使用すると、

diff

パスの一部に 'diff' というテキストが含まれるあらゆるパスを含みます。

フィールド以下のパターンを使用すると、

**/ccvs.1.11.18/diff/diff.c

一致が返されます。これは、二重のアスタリスクでは、どんな数のパス (この場合は /space/workspaces/cvs) とも一致照合するためです。一方、次のパターン: では、

*/ccvs.1.11.18/diff/diff.c

一致は返されません。「*」では、1 つのファイルまたはディレクトリしか一致照合しないためです。

もう 1 つ見てみましょう。

**/diff/**

このパターンでは、先頭に '**' を置くことで /space/workspaces/cvs/ccvs.1.11.18 を照合し、'**' を続けることで 'diff' ディレクトリ下のすべてのファイルを照合します。

例 2

マイナー バージョン番号に関わらず、パス /space/workspaces/cvs/ccvs.1.11.18/ にある特定のファイルと一致照合させるには、次のパターンを使用します:

/space/workspaces/cvs/ccvs.1.11.*/diff/diff.c

「*」が「18」と一致するためです。または、このパスにあるすべてのファイルと一致照合させるには、次のパターンを使用します:

/space/workspaces/cvs/ccvs.1.11.**

例 3

ccvs.1.11.18 または任意の中間ディレクトリに存在する、's' で始まるファイルをすべて照合するには、次のパターンを使用します。

**/ccvs.1.11.18/**/s*

最後に、ccvs.1.11.18 または任意の中間ディレクトリに存在する、名前に 's' が含まれるファイルをすべて照合するには、次のパターンを使用します。

**/ccvs.1.11.18/**/*s*

.sconf ファイルの使用

例 1

以下は、特定の指摘を抑制するために上記のメソッドをパススルーできる、典型的な .sconf ファイルの例です。

コピー
{ "issue_suppressions": [                     
    { "kind": "macro",
      "name": "MAP_FAILED",
      "issue_codes": ["MISRA.CAST.VOID_PTR_TO_INT.2012"],
      "filter": true
    },
    { "kind": "file",
      "name": "dir1/file.c",
      "all_issue_codes": true,
      "filter": true
    }    
  ]
}

この構成は、パスにパターン "dir1/file.c" が含まれているすべてのファイルで指摘を抑制します。たとえば、/space/folder1/dir1/file.c または /space/folder1/folder2/dir1/file.cpp です。フィルター処理する指摘を指定するには、all_issue_codes = true/false を準備するか、または issue_codes を含む指摘コードのリストを準備する必要があります。特定の指摘に対してフィルターが false の場合、パターン "dir1/myfile.cpp" に対して次のように表示される通り、抑制はスキップされます。

コピー
{ "issue_suppressions": [
    { "kind": "macro",
      "name": "INFINITE_LOOP",
      "issue_codes": ["INFINITE_LOOP.MACRO"],
      "filter": true
    },
    { "kind": "file",
      "name": "dir1/myfile.cpp",
      "all_issue_codes": false,
      "filter": true
    },
    { "kind": "directory",
      "name": "dir2",
      "all_issue_codes": true,
      "filter": true
    }
  ]
}

例 2

ディレクトリ 'dir' に、さらにディレクトリ 'dir/file.cpp' 内のファイルにも、抑制構成を準備する場合、順序に関係なく、ディレクトリよりもファイルに対する構成が優先されます。例:

コピー
{ "issue_suppressions": [                     
    { "kind": "file",
      "name": "dir/file.cpp",
      "all_issue_codes": false,
      "filter": true
    },
    { "kind": "directory",
      "name": "dir",
      "all_issue_codes": true,
      "filter": true
    }    
  ]
}

この構成は、パスにパターン 'dir' が含まれているすべてのファイルで指摘を抑制します。そのファイルに対して all_issue_codes を false に設定しているため、パターン dir/file.cpp が含まれているファイルには、指摘は抑制されません。

例 3

Klocwork 2022.3 の時点で、ファイルとディレクトリ内の指摘を抑制する場合、最適化を有効にすることもできます。最適化が有効になっている場合、そのファイルから翻訳単位全体がスキップされますが、その対象はパスチェッカーのみです。構成にコメントを追加することもできます (それはどこにも出力されません)。例:

コピー
{ "issue_suppressions": [
    { "kind": "file",
      "name": "foo.cpp",
      "all_issue_codes": true,
       "filter": true,
      "allow_optimization": true,
      "comment": "add comment here"
    }
   ]
}