除了官方GUI,还可支持与多种IDE(如VS、Eclipse、QtCreator)等集成使用.
主要功能:
error:出现的错误
warning:为了预防bug防御性编程建议信息越
style:编码格式问题(没有使用的函数、多余的代码等)
portablity:移植性警告。该部分如果移植到其他平台上,可能出现兼容性问题
performance:建议优化该部分代码的性能
information:一些有趣的信息,可以忽略
- 检查范围分析:
(1)、自动变量检查;
(2)、数组的边界检查;
(3)、class类检查;
(4)、过期的函数,废弃函数调用检查;
(5)、异常内存使用,释放检查;
(6)、内存泄漏检查,主要是通过内存引用指针;
(7)、操作系统资源释放检查,中断,文件描述符等;
(8)、异常STL 函数使用检查;
(9)、代码格式错误,以及性能因素检查。
支持的检查规则(列举一些):
- 禁止在头文件前有可执行代码。
- 引起二义性理解的逻辑表达式,必须使用括号显式说明优先级顺序。
- 逻辑判别表达式中的运算项必须要使用括号。
- 禁止对参数指针进行赋值。
- 动态分配的指针变量定义时如未被分配空间必须初始化为NULL
- 动态分配的指针变量第一次使用前必须进行是否为NULL的判别。
- 数组禁止越界使用。
- 数组下标必须是大于等于零的整型数。
- 禁止使用已被释放了的内存空间。
- 被free的指针必须指向最初malloc、calloc分配的地址。
- 建议用宏或const定义常数。
- 动态申请的内存空间用完后及时释放。
- 建议变量在声明的同时进行初始化。
- 函数中固定长度数组变量的传递必须使用引用方式。
- 定义为const的成员函数禁止返回非const的指针或引用。
- 禁止可导致非资源性对象数据被外部修改的成员函数返回。
- 捕获的顺序必须按由派生类到基类的次序排序。
- 每个指定的抛出必须有与之匹配的捕获。
- 异常抛出的对象必须使用引用方式捕获。
- 缺省捕获必须放在所有指定捕获之后。
- 禁止显式直接抛出
自定义规则:
1. 使用
--suppress
选项过滤特定的警告:如果你想要忽略某些警告,可以在命令行中使用
--suppress
选项。例如,如果你想要忽略所有的“缺少头文件”的警告,可以使用以下命令:
cppcheck --suppress=missingInclude ./ # 这里,“missingInclude” 是要忽略的警告类型。将其替换为您希望过滤掉的警告类型。
2 . 编写自定义脚本:在 CppCheck 运行结束后,使用自定义脚本对输出结果进行过滤。例如,您可以使用 Python 编写一个脚本,读取 CppCheck 的输出,然后根据自定义规则筛选警告信息。以下是一个简单的示例:
import subprocess import sys def main(): cppcheck_command = "cppcheck --enable=all --xml --xml-version=2 ./" result = subprocess.run(cppcheck_command.split(), capture_output=True, text=True) # 在这里添加自定义规则 def custom_filter(error): # 示例规则:过滤所有包含特定文件名的警告 return "my_special_file.cpp" not in error filtered_errors = list(filter(custom_filter, result.stderr.splitlines())) for error in filtered_errors: print(error) if __name__ == "__main__": main()
这个示例脚本使用
subprocess.run
来运行 CppCheck,并捕获输出。然后,它根据自定义规则(在这里是忽略包含特定文件名的警告)对输出进行过滤。您可以在custom_filter
函数中编写自己的过滤规则。3.可以使用--rule和--rule-file选项添加此类规则。 也可以使用正则表达式,例如:
\sget[A-Za-z]+\(\)\s+{\s+return
这取决于代码库。
如果可以编写正则表达式,那么这是创建自定义规则的最直接,最简单的方法。
有关更多信息,请在此处阅读"写作规则"文章:
http://sourceforge.net/projects/cppcheck/files/Articles/
但是也许想编写更复杂的规则,可以使用Cppcheck SymbolDatabase,tokenlist和语法树来搜索此类getter方法。 则不能使用--rule和--rule-file。 然后,有以下选择:
- 使用--dump并编写自己的自定义脚本,以读取输出数据(xml)。
- 编写C ++代码并将其编译为Cppcheck。
IDE结合使用说明
QtCreator
执行挡:输入cppcheck执行文件的路径。
参数:--enable=all %{CurrentProject:Path}
工作目录:%{CurrentProject:Path}
其他都是默认的。注意,这个是全开的参数,具体参数可参考cppcheck的参数说明,都一样的。
使用:菜单 – 工具 – 外部 – cppcheck,就可以。Linux版也是一样的。
Windows VS
Cppcheck是一个用于C/C++代码的静态分析工具,它可以帮助开发者检测代码中的错误。以下是在Visual Studio 2019和2022中安装Cppcheck的步骤:
1. **下载Cppcheck**
首先,你需要下载Cppcheck。你可以从其官方GitHub页面(https://github.com/danmar/cppcheck)下载最新版本的Cppcheck。
2. **安装Cppcheck**
下载完成后,运行安装程序并按照提示进行安装。记住你安装Cppcheck的路径,因为你稍后需要在Visual Studio中使用它。
3. **下载和安装Visual Studio插件**
接下来,你需要下载并安装Cppcheck的Visual Studio插件。你可以从Visual Studio Marketplace(https://marketplace.visualstudio.com/items?itemName=MatthewManela.CppcheckforVisualStudio)下载插件。
在Visual Studio中,点击"Extensions"(扩展)菜单,然后选择"Manage Extensions"(管理扩展)。在打开的窗口中,点击"Online"(在线),然后在搜索框中输入"Cppcheck"。找到"Cppcheck for Visual Studio",点击"Download"(下载)。
下载完成后,重启Visual Studio以完成插件的安装。
4. **配置Cppcheck**
插件安装完成后,你需要配置Cppcheck。在Visual Studio中,点击"Tools"(工具)菜单,然后选择"Options"(选项)。在打开的窗口中,找到"Cppcheck",然后在"Cppcheck path"(Cppcheck路径)中输入你之前安装Cppcheck的路径。
5. **使用Cppcheck**
现在,你可以开始使用Cppcheck了。在Visual Studio中,右键点击你的项目,然后选择"Run Cppcheck"(运行Cppcheck)。Cppcheck将开始分析你的代码,并在"Error List"(错误列表)窗口中显示结果。
检测内存泄漏
首先,让我们创建一段有内存泄露的 C++ 代码。
#include <iostream> int main() { int *array = new int[100]; return 0; }
在这段代码中,我们在`main()`函数中分配了一段内存,但在函数结束时没有释放。
然后,我们使用 Cppcheck 来检查这段代码。
cppcheck --enable=all memory_leak.cpp
最后,Cppcheck 的输出可能类似下面这样:
Checking memory_leak.cpp... [Memory_leak.cpp:4]: (error) Memory leak: array
这个输出表示在 `memory_leak.cpp` 的第 4 行中,我们动态分配的内存没有被释放,导致了内存泄露。