之前在https://blog.csdn.net/fengbingchun/article/details/8887843 介绍过Cppcheck,那时还是1.x版本,现在已到2.x版本,这里再总结下。
Cppcheck是一个用于C/C++代码的静态分析工具,源码地址为https://github.com/danmar/cppcheck ,最新发布版本为2.10,License为GPL-3.0.它支持在Windows、Linux、Mac上安装。
Cppcheck提供了独特的代码分析来检测bugs,并专注于检测未定义的行为和危险的编码结构。它的目标是仅检测代码中的真正错误,并生成尽可能少的误报。Cppcheck关注bug而不是代码风格。
静态分析是一个非常大的领域,Cppcheck只涵盖了其中的一部分。没有一种工具能覆盖整个领域。每个工具都有独特的代码分析,使用一组工具比使用一种工具要好,是很好的补充。
未定义的行为(undefined behaviour)包括:
(1).dead pointers;
(2).除以0;
(3).整数溢出;
(4).无效的位移操作;
(5).无效的转换;
(6).STL的用法无效;
(7).内存管理;
(8).空指针解引用;
(9).越界检查;
(10).未初始化的变量;
(11).写const数据;
安装:从https://github.com/danmar/cppcheck/releases/tag/2.10 下载cppcheck-2.10-x64-Setup.msi,双击进行安装,并将安装路径即cppcheck.exe所在路径加入到系统环境变量中。
结果消息(messages)包括:
(1).error: 执行代码时未定义的行为或其它错误,如内存泄漏;
(2).warning: 执行代码时可能存在未定义的行为;
(3).style: 风格问题,例如未使用的函数、冗余代码、constness、运算符优先级、可能的错误;
(4).performance: 基于常识(common knowledge)的运行时性能建议;
(5).portability: 可移植性警告;
(6).information: 配置问题,与语法正确性无关.
注意事项:
(1).通过执行cppcheck.exe --help 可查看支持哪些输入参数;
(2).语法: cppcheck.exe [options] [files or paths]
(3).--file-filter=<str>: 设置文件过滤器,并且仅检查与过滤器匹配的文件;如--file-filter=*bar.cpp 只分析以bar.cpp结尾的文件;
(4).--cppcheck-build-dir=<dir>: Cppcheck将分析信息保存在该文件夹中,推荐使用.优点:加快分析速度,使增量分析成为可能;使用多个线程时也可以进行全程序(whole program)分析;
(5).--enable=<id>: id可为all, warning, style, performance, portability, information, missingInclude; all启用所有检查,当扫描整个程序时,建议只使用all,因为这会启用unusedFunction;可以指定多个id,用逗号分开;
(6).--file-list=<file>: 在文本文件中指定要check的文件;
(7).-I <dir>: 给出搜索include文件的路径,可有多个-I;
(8).--include=<file>: 在checked文件之前强制include一个文件;
(9).--output-file=<file>: 将结果写入文件;
(10).-v或--verbose: 输出更详细的错误信息.
这里使用GitHub Messy_Test/demo/Messy_Test 中的代码进行测试,执行命令如下所示:
在当前的results目录生成一些文件,打开其中的result.txt,内容如下:对有问题的代码行给出原因说明
GitHub: https://github.com/fengbingchun/Messy_Test