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

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 ファイル

以下は、特定の指摘を抑制するために上記のメソッドをパススルーできる、典型的な .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.cpp" が含まれているすべてのファイルで指摘を抑制します。たとえば、/space/folder1/dir1/file.c または /space/folder1/folder2/dir1/file.cpp です。フィルター処理する指摘を指定するには、all_issue_codes = true/false を準備するか、または issue_codes を含む指摘コードのリストを準備する必要があります。特定の指摘に対してフィルターが false の場合、抑制はスキップされます。

{ "issue_suppressions": [
{ "kind": "macro", "name": "MAP_FAILED", "issue_codes" : [ "MISRA.CAST.VOID_PTR_TO_INT.2012" ], "filter": true }
,
{ "kind": "file",
"name": "dir1/file.cpp",
"all_issue_codes": false,
"filter": true
},
{ "kind": "directory",
"name": "dir2",
"all_issue_codes": true,
"filter": true
}
]
}			

ディレクトリ '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 が含まれているファイルには、指摘は抑制されません。

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

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

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*