简介
cppcheck 是一个静态代码检查工具,支持c, c++ 代码;作为编译器的一种补充检查,cppcheck对产品的源代码执行严格的逻辑检查。 执行的检查包括:
- 自动变量检查
- 数组的边界检查
- class类检查
- 过期的函数,废弃函数调用检查
- 异常内存使用,释放检查
- 内存泄漏检查,主要是通过内存引用指针
- 操作系统资源释放检查,中断,文件描述符等
- 异常STL 函数使用检查
- 代码格式错误,以及性能因素检查
安装插件
扩展搜索安装cpp-check-lint
检查设置
"cpp-check-lint.cpplint.--enable": false, //google C++ 代码风格检查
"cpp-check-lint.cppcheck.--language=": "c", //使用c语言进行检查
"cpp-check-lint.cppcheck.--inline-suppr": false, //取消内联
"cpp-check-lint.cppcheck.--onsave": true, //在文件保存时立刻检查该文件
"cpp-check-lint.cppcheck.--enable=": "style", //输出信息等级,可选为all, warning, style, performance, portability, information, unusedFunction, missingInclide
cpp-check-lint.cpplint.--enable
如果需要使用cpplint选项,具体设置可以参考:代码风格审查工具Cpplint
cpp-check-lint.cppcheck
输出信息等级说明:
warning:为了预防bug防御性编程建议信息
style:编码格式问题(没有使用的函数、多余的代码等)
performance:建议优化该部分代码的性能
portability:移植性警告。该部分如果移植到其他平台上,可能出现兼容性问题
information:一些有趣的信息,可以忽略不看的。
unusedFunction:未使用的函数
missingInclide:缺少头文件
常见错误
CWE-398 The scope of the variable 'xxx' can be reduced.cppcheck(style:variableScope)
变量的作用域可以缩小。报错的原因是可能有个局部变量可以进一步缩小作用域,可以放到更深的括号里
CWE-563 Unused variable: aacppcheck(style:unusedVariable)
变量被声明了但是从未被使用。报错的原因是可能有定义过但后来又删掉了的变量,属于多余的变量,可以删掉
CWE-401 Memory leak: xxx cppcheck(error:memleak)
变量内存泄漏
CWE-457 Memory is allocated but not initialized: xxx cppcheck(error:uninitdata)
成员变量没有被初始化
CWE-686 %d in format string (no. 1) requires 'int' but the argument type is 'signed int *'.cppcheck(warning:invalidPrintfArgType_sint)
打印类型不匹配
using C-style cast. Use reinterpret_cast<SHCP_PACKET *>(...) instead cpplint(warning:readability/casting)
原因校验使用了C++的检查方式,C++应该使用的其独有的四种强制类型转化方式更为安全,如果是C代码可以忽略
CWE-398 Local variable 'xxx' shadows outer argument cppcheck(style:shadowArgument)
局部变量与外部参数冲突,名字重了
扩展阅读
google c++风格规范:
Google C++ Style Guide
C++ 风格指南
其他静态检查工具:
静态代码检测pc-lint, visual lint, cpp-check(pclint、cppcheck、TscanCode)