文章目录
一、简述
Cppcheck是一种C/C++代码缺陷静态检查工具。不同于 C/C++ 编译器及很多其它分析工具,它不检查代码中的语法错误。Cppcheck只检查编译器检查不出来的bug类型,其目的是检查代码中真正的错误。
支持的代码和平台:
- 可以检查非标准代码,包括不同的编译器扩展、内联汇编代码等。
- Cppcheck应该被处理最新C++标准的任何C++编译器所编译。
- Cppcheck应该在任何有足够CPU和内存的平台上工作。
要知道Cppcheck有限制,Cppcheck很少在报告错误方面出错,但有很多bug,它不能检测。
通过仔细测试软件,你会发现软件中有更多的bug,而不是使用Cppcheck。但Cppcheck仍可以检测到在测试和评估软件时错过的一些bug。
二、安装
可以直接在GitHub上克隆代码,然后切换到对应版本后进行编译安装:
$ git clone git@github.com:danmar/cppcheck.git
$ cd cppcheck
$ git checkout 1.87
$ cd ..
$ mkdir build
$ cd build
$ cmake -DCMAKE_INSTALL_PREFIX=/opt/cppcheck-1.87 ../cppcheck/
$ make SRCDIR=build CFGDIR=cfg HAVE_RULES=yes CXXFLAGS="-O2 -DNDEBUG -Wall -Wno-sign-compare -Wno-unused-function"
$ make install
然后修改PATH环境变量,添加/opt/cppcheck-1.87/bin到PATH中。
二、使用
2.1 第一个测试程序
下面是一个简单的代码:
int main()
{
char a[0];
a[10] = 0;
return 0;
}
将代码保存进file1.c中,然后执行:
cppcheck file1.c
将得到如下输出:
Checking file1.c...
[file1.c:4]: (error) Array 'a[10]' index 10 out of bounds
2.2 检查文件夹中所有文件
通常一个项目会有许多源文件,如果需要同时检查,Cppcheck可以检查文件夹中的所有文件:
cppcheck path
如果path是一个文件夹,cppcheck将递归检查这个文件夹中的所有源文件。
···
Checking path/file1.cpp…
1/2 files checked 50% done
Checking path/file2.cpp…
2/2 files checked 100% done
···
2.3 检查部分或过滤部分文件
排除一个文件或文件夹有两个选项,第一个选项是只提供你想检查的路径和文件:
cppcheck src/a src/b
所有位于 src/a 和 src/b 下的文件都会被检查。
如果使用-i选项,将会忽略指定的文件/文件夹,使用下面命令src/c将不会被检查:
cppcheck -isrc/c src
三、严重性
cppcheck的严重性等级可能为:
- 错误(error): 当发现bug时使用
- 警告(warning): 关于防御性编