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

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: macrofile、または directory
    適用する抑制の種類
    T

  • name
    抑制の kind が次の場合:

    • macro: 抑止設定を適用するマクロの名前

    • file または directory: 抑制設定を適用するファイルまたはディレクトリの相対パスまたは絶対パス (またはパスパターン)

  • all_issue_codes: true/false または issue_codes
    フィルタをかける指摘を指定するには、all_issue_codes = true/false または issue_codes を使用して指摘コードのリストを指定します。

  • フィルター: true/false
    特定の指摘に対して filter が false の場合、抑制はスキップされます (例 1 を参照)。

  • allow_optimization: true/false
    もし allow_optimization が true の場合、そのファイルの翻訳単位はパスチェッカーに対してのみスキップされます (例 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/diff/diff.c だとすると:

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

* はテキスト 18 に一致するため、これはマイナーバージョン番号に関係なく、パス /space/workspaces/cvs/ccvs.1.11.18/ にある特定のファイルに一致します。

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

これは、同じパスにあるすべてのファイルと一致します。

例 3

ファイルパスが /space/workspaces/cvs/ccvs.1.11.18/diff/diff.c だとすると:

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

これは、ccvs.1.11.18 および任意の中間ディレクトリにある文字 s で始まるすべてのファイルと一致します。

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

これは、ccvs.1.11.18 および任意の中間ディレクトリにある文字 s を含むすべてのファイルと一致します。

例 4

ファイルパスが /a/b*c/d/ だとすると:

/a/b!*c/d/

Windows および Linux ではパス指定にアスタリスクを文字として使用できるため、エスケープされたアスタリスク !* は、* 文字を含むパスを検索するために使用されます。

例 5

ファイルパスが /a/b!c/d/ だとすると:

/a/b!!c/d/

! 文字を含むパスを検索するには、エスケープされた感嘆符 !! を使用します。

例 6

ファイルパスが /a/b!*c/d/ だとすると:

/a/b!!!*c/d/

フォルダーパスには連続した文字列が含まれるため、パス内の一意の文字をそれぞれ感嘆符でエスケープする必要があります。

ファイルパスが /**/sub!*folder/test.c だとすると:

/!*!*/sub!!!*folder/test.c

連続する文字列内の各アスタリスクは、それぞれ感嘆符でエスケープする必要があります。

例 7

ファイルパスが /space/*!*!words/file.cpp だとすると:

/space/*/file.cpp

ワイルドカード * はその文字値と現在のパスレベル内の任意の検索語の両方に一致するため、一致を返します。

.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"
    }
   ]
}