マクロまたはファイルを使用した指摘の除去
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 ファイルの使用
以下は、特定の指摘を抑制するために上記のメソッドをパススルーできる、典型的な .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 が含まれているファイルには、指摘は抑制されません。
Klocwork 2022.3 の時点で、ファイルとディレクトリ内の指摘を抑制する場合、最適化を有効にすることもできます。最適化が有効になっている場合、そのファイルから翻訳単位全体がスキップされますが、その対象はパスチェッカーのみです。構成にコメントを追加することもできます (それはどこにも出力されません)。例:
{ "issue_suppressions": [
{ "kind": "file",
"name": "foo.cpp",
"all_issue_codes": true,
"filter": true,
"allow_optimization": true,
"comment": "add comment here"
}
]
}