摘要:介绍代码缺陷静态检查工具(static code analyzer)cppcheck,以及其vs、qtcreator、git、jenkins插件及用法。
Cppcheck着重于检测未定义的行为和危险的编码结构,未定义行为包括:
死去的指针
除零
整数溢出
无效位移位操作数
无效的转换
STL的无效使用
内存管理
空指针取消引用
出界检验
未初始化变量
文字常量数据
更多检查范围参考cppcheck/wiki/ListOfChecks/
cppcheck项目主页
一. 源码编译
项目github地址
使用cmake、qmake、vs等编译方式直接参考项目readme.md
一. 可执行文件
安装
windows安装文件github-release下载地址
linux下可使用dnf、yum、apt-get等直接安装
安装过程略,如果被外部引用,将cppcheck.exe所在目录加入Path,打开cppcheckgui.exe即可进行代码检查。命令行基本用法示例【参考地址】:
cppcheck foo.cpp src/a.cc # 检查指定的[多个]文件
cppcheck dir # 递归检查dir中所有文件
cppcheck -isrc/a.cc src # 检查src下除a.cc以外的文件,使用-i选项排除.
cppcheck --enable=warning,performance,style,information,all foo.cc #警告等级
cppcheck -j4 src # 多线程
cppcheck --inconclusive src # 包括不确定错误
cppcheck --project=cmake_check_project.json # 检查cmake管理的项目
# 其中json文件使用cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON生成
cppcheck --project=some.sln # 检查整个vs解决方案
cppcheck --project=some.vcxproj # 检查单个vs项目
#默认情况下,Cppcheck 将检查所有预处理器配置。
cppcheck -D_MACRO_ src # 只检查_MACRO_宏启用的情况,不检查其他
cppcheck -D_MACRO_ --force src # 检查_MACRO_宏启用条件下的其他宏所有配置
cppcheck -U_MACRO_ --force src # 检查_MACRO_宏非启用的情况
cppcheck --xml-version=2 src # 输出xml结果文件,并使用version2
cppcheck --template=vs|gcc|{file},{line},{severity},{id},{message}" src # 使用vs或gcc或自定义格式输出
缺陷的严重性等级:
- 错误error
当发现 bug 时使用- 警告warning
关于防御性编程,以防止 bug 的建议- 风格style
风格有关问题的代码清理(未使用的函数、冗余代码、常量性等等)- 可移植性portability
可移植性警告。64 位的可移植性,代码可能在不同的编译器中运行结果不同。- 性能performance
建议使代码更快。这些建议只是基于常识,即使修复这些消息,也不确定会得到任何可测量的性能提升。- 信息information
配置问题,建议在配置期间仅启用这些。
二. 客户端与插件
qtcreator
下载安装QtProjectTool,qpt,qpt支持cppcheck、cpplint、krazy、vera++等工具。在creator中,qpt作为外部工具(工具->外部),具体配置和使用见qpt_manaul.pdf
使用高版本qtcreator(4.10已有)自带功能【Analyzing Code with Cppcheck】,直接在编辑器中提示缺陷信息,并可自动按建议修改。
Analyzing Code with Cppcheck
Cppcheck is a static analysis tool that detects errors in C++ code. Static analysis is performed on the source code without actually executing the application.
The experimental Cppcheck Diagnostics plugin integrates diagnostics that are generated by the Cppcheck tool into the C++ editor.
To enable running Cppcheck automatically on currently open files:
- Select Help > About Plugins > Code Analyzer > Cppcheck to enable the plugin.
- Restart Qt Creator to load the plugin.
- Select Tools > Options > Analyzer > Cppcheck to specify settings for running Cppcheck.
- In the Binary field, enter the path to the Cppcheck executable file.
- In the Checks group, select the checks to perform on currently open files.
**Note: **By default, Cppcheck uses multiple threads to perform checks. Selecting the Unused functions option disables the default behavior.- In the Custom arguments field, enter additional arguments for running Cppcheck. The arguments might be shadowed by automatically generated ones. To avoid possible conflicts in configuration, select the Show raw output check box to see the final arguments.
- In the Ignored file patterns field, enter a filter for ignoring files that match the pattern (wildcard). You can enter multiple patterns separated by commas. Even though Cppcheck is not run on files that match the provided patterns, they might be implicitly checked if other files include them.
- Select the Inconclusive errors check box to also mark possible false positives.
- Select the Check all define combinations check box to check all define combinations. Enabling this option can significantly slow down analysis, but might help to find more issues.
- Select the Add include paths check box to pass the current project's include paths to Cppcheck. Enabling this option slows down checks on big projects, but can help Cppcheck to find missing includes.
- Select the Calculate additional arguments check box to calculate additional arguments based on current project's settings (such as the language used and standard version) and pass them to Cppcheck.
Qt Creator automatically runs Cppcheck on currently opened documents and displays results via text marks or annotations.
visual studio
需要本地cppcheck.exe支持(标题一)。
- 下载安装cppcheck-vs-addin,双击vsix文件自动安装,支持VS2015和VS2017,安装完成后位于工具菜单,可对当前代码文件和项目进行缺陷静态分析。
或者安装cppcheck后手动添加外部工具: 在Visual Studio菜单栏"工具"→"外部工具",点击"添加",内容如下:
标题:Cppcheck
命令:D:\Program Files\Cppcheck\cppcheck.exe
参数:--enable=all --template=vs $(SolutionDir)
勾选"使用输出窗口"
git
将cppcheck/tools/git-pre-commit-cppcheck文件加入 .git/hooks目录,每次commit时候,会自动执行cppcheck检查缓冲区的文件,如果有错误,即不允许commit.
jenkins
其他客户端与插件
CLion - Cppcheck插件
Code :: Blocks - 集成
CodeDX(软件保障工具) - 集成
CodeLite - 集成
CppDepend 5 - 整合
Eclipse - Cppcheclipse
KDevelop - 自v5.1开始集成
gedit - gedit插件
Hudson - Cppcheck插件
Jenkins - Cppcheck插件
Mercurial(Linux) - 预提交钩子 - 检查提交时的新错误(需要交互式终端)
Tortoise SVN - 添加预提交钩子脚本
Git(Linux) - 预提交钩子 - 检查进入提交的文件中的错误(需要交互式终端)
Visual Studio - Visual Studio插件
QtCreator - Qt项目工具(qpt)
Sep.2019
mdo_lpf@163.com