cppcheck简介
Cppcheck is an analysis tool for C/C++ code. It provides unique code analysis
to detect bugs and focuses on detecting undefined behaviour and dangerous
coding constructs. The goal is to detect only real errors in the code, and generate
as few false positives (wrongly reported warnings) as possible. Cppcheck is
designed to analyze your C/C++ code even if it has non-standard syntax, as is
common in for example embedded projects.
Supported code and platforms:
• Cppcheck checks non-standard code that contains various compiler extensions,
inline assembly code, etc.
• Cppcheck should be compilable by any compiler that supports C++11 or
later.
• Cppcheck is cross platform and is used in various posix/windows/etc
environments.
The checks in Cppcheck are not perfect. There are bugs that should be found,
that Cppcheck fails to detect.
代码静态测试工具极其丰富,这里不做赘述,仅对开源工具cppcheck的命令行搭建做记录。
cppcheck安装
上官网https://cppcheck.sourceforge.io/选择所需的版本安装
我这里下载的是2.9版本,下载速度若很慢,可选择镜像地址安装
安装过程中记得勾选addon选项,否则在安装路径下不会产生addons文件夹,若在命令行执行–addon指令则会报错。ps:cppcheck会通过python misra.py去解析misra规则,从而在生成的结果中,将警告或错误和misra规则关联起来,故电脑需要安装python。
在安装完cppcheck之后,最好将添加安装路径到环境变量,方便命令行的调用。
-
cppcheck
打开命令行,键入cppcheck,会出现以下信息,说明环境变量设置成功
cppcheck关键词后面添加想要测试的文件路径,则会执行静态测试,并在命令行打印出结果 如:cppcheck C:\Users\Desktop\file1.c
-
–cppcheck-build-dir
该指令用作设置cppcheck的路径,就是新建一个文件夹以保存测试过程中产生的数据,这样做有个优点就是,当你执行一次测试之后,产生了比如800个警告或错误,在你修改完一部分之后,重新进行测试的时候,cppcheck只会重新测试有修改点的文件,不会重新拉起全部测试。而不过没有这个指令,每次都会从头执行,若测试文件特别多,这样会很浪费时间。 -
–std=c99
该指令用来设定语言标准是C99还是其他标准 -
–xml
用来指示测试完成生成结果是xml格式 -
-i
在测试中,有一些路径下的文件无需测试,比如MBD生成的文件已经满足misra的标准,那么通过-i 加文件路径的格式就可以达到这个目的,这个文件夹下的所有文件将不会被测试。当有多个路径需要被关闭时,每个路径都需要有独立的-i 如:-i “path a” -i “path b” -
–addon
如上所述,这里会添加一个json文件,这个json文件中指定python的文件,及misra的规则文件如:
{
"script": "misra.py",
"args": [
"--rule-texts=./addons/misra2012_rules_dummy_ascii.txt"
] }
这里的misra.py和misra2012_rules_dummy_ascii.txt在cppcheck的官网都可以找到
- –suppressions-list
在测试过程中,有些警告是可以接受或者无法避免的或者不适用,就需要压制这些警告,具体做法是
可以利用–suppress指令单独声明,也可以按照上图的做法,将所有需要压制的ID写在一个txt文本中,作为一个list整体压制,当然是推荐后者。另外压制可以选择统一压制,也可以选择压制某个文件的某个ID,具体做法就是在ID后面跟文件的路径即可,也可以指定哪一行来压制。 - misra2012_rules_dummy_ascii.txt
可以在cppcheck路径下找到demo,本质是从misra官网下载规范,然后将Appendix A Summary of guidelines章节的规则号,描述等信息按照demo来填写形成一个txt文本。
最后
最后提供一个范例,直接复制在命令行执行,生成结果。移植到别的项目只需要切换路径即可。
cppcheck
--cppcheck-build-dir="C:\cppcheck_demo\Cppcheck_build_folder"
--std=c99
--xml
-i"C:\cppcheck_demo\Src\folderA"
-i"C:\cppcheck_demo\Src\folderB"
--addon="C:\cppcheck_demo\misra.json"
--suppressions-list="C:\cppcheck_demo\suppress.txt"
"C:\cppcheck_demo\Src" 2> "C:\cppcheck_demo\error.xml