一、cppcheck简介
Cppcheck是一个用于C/C++代码的静态分析工具,它可以帮助开发者检测代码中的错误。Cppcheck可以检测出许多类型的错误,包括语法错误、未使用的函数、内存泄漏、未初始化的变量等。此外,Cppcheck还支持用户自定义规则,这使得开发者可以根据自己的需求定制Cppcheck的行为。
主要选项
- 错误(error):这是最严重的问题,Cppcheck 100%确定这是错误。例如,数组越界,空指针解引用等。
- 警告(warning):Cppcheck认为代码看起来有问题,但它并不确定这是否真的是错误。例如,有可能发生整数溢出,有可能发生除以零的情况等。
- 样式(style):这些是关于代码风格的问题,例如未使用的函数、多余的代码等。
- 可移植性(portability):当代码在不同的平台上运行时可能会出现问题。例如,使用了不可移植的函数,或者依赖于编译器特定的行为。
- 性能(performance):Cppcheck会发出警告,如果代码可以优化以提高性能。
- 信息(information):这些是一些有趣的,非关键的信息,通常可以忽略。
这些选项可以通过命令行参数进行启用或禁用,以定制Cppcheck的行为。例如,如果你只关心错误和警告,你可以使用--enable=warning,error
参数来运行Cppcheck。
检查范围
以下是 Cppcheck 的主要检查范围:
- 未定义行为:包括死指针、零除、整数溢出、无效的位移操作数、无效的转换、STL的无效使用、内存管理、空指针解引用、越界检查、未初始化的变量、写入const数据等。
- 安全性:Cppcheck 可以检测到一些常见的安全漏洞,如缓冲区错误、不当的访问控制、信息泄露等。
- 编码标准:Cppcheck 支持多种编码标准,包括 Misra C 2012、Misra C++ 2008、Cert C、Cert C++ 等。
- 其他检查:Cppcheck 还有许多其他的检查,具体可以参考 这个链接。
二、在Windows下安装Cppcheck
2.1 从Cppcheck的GitHub页面下载最新版本源码,链接:https://github.com/danmar/cppcheck
2.2 可以点击“Releases”选项,然后下载最新版本的Cppcheck的Windows安装程序。双击下载的安装程序文件,然后按照提示进行安装。安装完成后,你可以在开始菜单中找到Cppcheck,或者在命令行中输入cppcheck
来运行它。
2.3也可以下载源码根据Readme中的提示,自行编译。
三、vscode下载插件cpp-check-lint
如图:
下载好之后按ctrl+shift+p打开用户设置(user setting),在设置中追加加入以下代码:
/* cppcheck配置 */
"cpp-check-lint.--enable": true, //启用插件
"cpp-check-lint.cppcheck.--executable": "C:\\Program Files\\Cppcheck\\cppcheck.exe", //cppcheck路径
"cpp-check-lint.cppcheck.--inline-suppr": false, //取消内联
"cpp-check-lint.cppcheck.--language=": "c", //使用c语言进行检查
"cpp-check-lint.cppcheck.--onsave": false, //在文件保存时立刻检查该文件
"cpp-check-lint.cppcheck.--quick_fix": false,
"cpp-check-lint.cpplint.--enable": false, //关闭无用的cpplint
// "cpp-check-lint.cppcheck.--addon=": [ //暂时不开启插件
// "misra.py"
// ],
四、插件使用例子
使用很简单,直接在文件上右键即可,如下图:
我在程序中故意写了个除0的错误,检查结果会报错。
扩展命令
生成dump文件
cppcheck.exe --template={file}:{line}:{column}: {severity}: CWE-{cwe} {message}:[{id}] --enable=style -j4 --max-ctu-depth=2 --platform=native --std=c89 --std=c++03 --report-progress --suppress=unmatchedSuppression --suppress=missingIncludeSystem --dump ./src/thread_rs485_readmeter_entry.c
使用misra 2012进行检查
python3 /mnt/c/Program\ Files/Cppcheck/addons/misra.py --rule-texts=/mnt/f/OneDrive/Tools/cppcheck/misra_rules_dummy.txt ./src/thread_rs485_readmeter_entry.c.dump