抑制 Cppcheck 中自动绑定事件处理程序的从未使用过的警告

Wol*_*olf 4 static-analysis c++builder cppcheck

我使用 Cppcheck 1.70 检查 C++-Builder 项目。我收到很多这样的风格警告

[source\DbgRecMain.cpp:452]: (style) The function 'FormResize' is never used.
Run Code Online (Sandbox Code Playgroud)

这些函数是使用的事件处理程序但不是在 C++ 代码中显式使用:它们在加载相应的表单或数据模块后由 VCL 运行时绑定。当然,Cppcheck 不会检查 DFM 文件,这就是为什么它无法检测其中定义的事件和处理程序之间的引用。

我想到的一些选择

  • 添加一些显式引用,但这必须手动维护。
  • 抑制所有此类警告,但这会隐藏真正的死代码。

如何专门抑制这些关于明显未使用的事件处理程序的警告?

Rem*_*eau 7

CppCheck 文档中有一个关于抑制警告/错误的章节。第 6.2 章对您尤其有用,因为您将能够根据需要抑制有关各个事件处理程序的警告:

\n\n
\n

第 6 章 抑制

\n\n

如果您想过滤掉某些错误,您可以抑制这些错误。

\n\n

6.1. 抑制某种错误类型

\n\n

您可以抑制某些类型的错误。这种抑制的格式是以下之一:

\n\n
[error id]:[filename]:[line]\n[error id]:[filename2]\n[error id]\n
Run Code Online (Sandbox Code Playgroud)\n\n

error id是您要抑制的 id。获取它的最简单方法是使用--xml命令行标志。复制并粘贴idXML 输出中的字符串。这可能是*为了抑制所有警告(针对指定的一个或多个文件)。

\n\n

可以filename包括通配符*?,它们分别匹配任何字符序列或任何单个字符。建议您在所有操作系统上使用“/”作为路径分隔符。

\n\n

6.1.1. 命令行抑制

\n\n

命令行选项--suppress=用于在命令行上指定抑制。例子:

\n\n
cppcheck --suppress=memleak:src/file1.cpp src/\n
Run Code Online (Sandbox Code Playgroud)\n\n

6.1.2. 列出文件中的抑制内容

\n\n

您可以创建抑制文件。例子:

\n\n
// suppress memleak and exceptNew errors in the file src/file1.cpp\nmemleak:src/file1.cpp\nexceptNew:src/file1.cpp\n\n// suppress all uninitvar errors in all files\nuninitvar\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,您可以在抑制文件中添加空行和注释。\n 您可以像这样使用抑制文件:

\n\n
cppcheck --suppressions-list=suppressions.txt src/\n
Run Code Online (Sandbox Code Playgroud)\n\n

6.2. 内联抑制

\n\n

还可以通过添加包含特殊关键字的注释来直接在代码中添加抑制。在添加此类注释之前,请考虑稍微牺牲代码可读性。

\n\n

此代码通常会生成一条错误消息:

\n\n
void f() {\n    char arr[5];\n    arr[10] = 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出是:

\n\n
# cppcheck test.c\nChecking test.c...\n[test.c:3]: (error) Array \xe2\x80\x99arr[5]\xe2\x80\x99 index 10 out of bounds\n
Run Code Online (Sandbox Code Playgroud)\n\n

要抑制错误消息,可以添加注释:

\n\n
void f() {\n    char arr[5];\n\n    // cppcheck-suppress arrayIndexOutOfBounds\n    arr[10] = 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在该--inline-suppr标志可用于抑制警告。这样调用cppcheck时不会报错:

\n\n
cppcheck --inline-suppr test.c\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

另请参阅以下问题以了解更多详细信息:

\n\n

如何对 C++ 代码使用 cppcheck 的内联抑制过滤器选项?

\n\n

我可以在函数头中包含 cppcheck 抑制吗?

\n