cppcheck 如何抑制内联不匹配抑制?

cppcheck How to suppress inline unmatched suppression?

我发现 --suppress=unmatchedSuppression 仅抑制 cppcheck 选项中不匹配的抑制类型,但不抑制不匹配的内联抑制。

这是预期的行为吗?

test.c

我对这两行都有内联 cppcheck-suppress

  1 void f() {
  2     char arr[5];
  3     // cppcheck-suppress arrayIndexOutOfBounds
  4     arr[10] = 0;
  5
  6     // cppcheck-suppress arrayIndexOutOfBounds
  7     const char ok[] = "this line is ok";
  8 }

Situation 1

禁止 cstyleCast,它在代码中不存在。

 cppcheck --inline-suppr --force --enable=all 
          --xml-version=2 --suppress=cstyleCast test.c 
          2>cppcheckresults.xml

我收到警告(以及其他不相关的警告)

  1. unmatchedSuppression: arrayIndexOutOfBoundstest.c line 7(如预期)

  2. unmatchedSuppression: cstyleCast* line 0(如预期)

Situation 2

与情况 1 相同,但有额外的 --suppress=unmatchedSuppression 选项

 cppcheck --inline-suppr --force --enable=all 
          --xml-version=2 --suppress=cstyleCast --suppress=unmatchedSuppressiontest.c 
          2>cppcheckresults.xml

我希望之前的两个 unmatchedSuppression 警告都消失。但我仍然得到

  1. unmatchedSuppressiontest.c line 7(不期望)

我最近发现,来自内联抑制的 unmatchedSuppression 警告无法通过通用 --suppress=unmatchedSuppression 或仅将该警告 ID 放入 --suppressions-list 文件中来抑制。您必须使用文件名对其进行限定。例如 --suppress=unmatchedSuppression:test.c.

顺序解决方案的问题是您必须对每个具有无与伦比的抑制的文件执行此操作。

一个。在命令行中使用选项 --suppress=unmatchedSuppression:{}。 (注意大括号)

乙。我发现的是,你还可以将不匹配的抑制本身抑制到位,例如:

        // cppcheck-suppress[assertWithSideEffect,unmatchedSuppression]
        assert(...);

(使用 cppcheck 2.3 和 2.5 测试)

这是必要的,例如 运行 cppcheck 2.3 没有 assertWithSideEffect 功能,后来在 cppcheck 2.5 中可用。

理想情况下,当您提高 cppcheck 版本时,您可以开始删除不必要的 unmatchedSuppression。 不用说了,这都需要命令行--inline-suppr.