Cppcheck 是 C/C++ 代码的分析工具。它提供独特的代码分析来检测错误,并专注于检测未定义的行为和危险的编码结构。目标是仅检测代码中的实际错误,并尽可能少地生成误报(错误报告的警告)。
官方用户手册:https://cppcheck.sourceforge.io/manual.html
官方用户手册pdf版本:https://files.cppchecksolutions.com/manual.pdf
cppcheck [OPTIONS] [files or paths]
cppcheck [files]
例子:检查file.c文件
cppcheck file.c
cppcheck [path]
如果给出的是目录而不是文件名,则会递归检查*.cpp, *.cxx, *.cc, *.c++, *.c, *.ipp, *.ixx, *.tpp, *.txx 等文件
例子:检查test文件夹下的所有文件
eg:cppcheck ./test
cppcheck --enable=<id> [files or paths]
启用其他检查。可用的错误id列表有<id>:
* all 启用所有检查,建议在检查程序的时候使用,因为这个会启用检查未使用的函数(unusedFunction)
* warning 启用警告消息检查
* style 启用所有编码风格检查,且同时启动 'style', 'warning','performance' 和 'portability'
* performance 启用影响性能消息检查
* portability 启用影响可移植性消息检查
* information 启用信息消息
* unusedFunction 启用未使用函数检查,建议在检查程序的时候使用
* missingInclude 启用缺少包含的检查
例子:启用file.c文件的警告的检查
eg:cppcheck --enable=warning file.c
cppcheck --help
cppcheck --version
cppcheck -i <dir or file> [files or paths]
例子:忽略test文件夹下test1文件夹内容的检查
eg:cppcheck -i ./test1 ./test
例子:忽略test文件夹下file.c文件的检查
eg:cppcheck -i file.c ./test
cppcheck --suppress=<spec> [files or paths]
<spec> is:[error id]:[filename]:[line]
[error id] 需要屏蔽的错误id(见本文使用方法的第3条),如果是用“*”则表示屏蔽所有错误
例子:屏蔽test文件夹下,file.c文件的123行的警告
eg:cppcheck ----suppress=warning:file.c:123 ./test
cppcheck [OPTIONS] [files or paths] 2>file
例子:检查file.c的错误信息输出到err_data.txt文件中
eg:cppcheck file.c 2>err_data.txt
cppcheck -j <jobs> [files or paths]
例子:使用4个线程检查file.c文件
eg: cppcheck -j 4 file.c
eg: information: Include file: “stdio.h” not found. [missingInclude]
解决方法:增加对应的头文件(不过一般编译能通过这类的错误可以忽略)
eg: warning: Member variable ‘a’ is not initialized in the constructor. [uninitMemberVar]
error: Uninitialized variable: data [uninitvar]
error: Uninitialized struct member: s_data [uninitStructMember]
解决方法:给对应缺少初始化的变量a、data,结构体s_data 增加初始化值即可
eg: style: Unused private function: ‘mycode::_test’ [unusedPrivateFunction]
解决方法:删除或者屏蔽对应的未使用的函数
eg: style: Variable ‘data’ is reassigned a value before the old one has been used. [redundantAssignment]
解决方法:将变量data用标准的0值进行初始化,或者忽视此警告
eg: error: Memory leak: test.data [memleak]
解决方法:在报这个错误的文件行查找内存溢出的原因
eg: performance: Function parameter ‘data’ should be passed by const reference.
解决方法:变量data在函数中未被改变过,应该定义成const变量
eg: style: Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm]
解决方法:使用std::find_if算法代替原始循环
sudo apt-get install cppcheck
sudo yum install cppcheck
官网源码下载路径:http://cppcheck.net/
github 源码路径:https://github.com/danmar/cppcheck
下载完压缩包后,解压压缩包
sudo tar -zxvf cppcheck-2.12.0.tar.gz
进入解压包的路径,创建一个 build 文件夹用来存放编译出来的程序,并进入 build 文件夹,准备编译
cd ./cppcheck-2.12.0
mkdir ./build
cd ./build/
编译 cppcheck
cmake ..
make -j8
等待编译完成后,查看编译出来的程序
ls -l ./bin
得到结果,得知已编译出 cppcheck
root@ubuntu:~/app/cppcheck-2.12.0/build$ ls -l ./bin/
总用量 97640
drwxrwxr-x 4 lyx1 lyx1 4096 10月 31 09:33 addons
drwxrwxr-x 2 lyx1 lyx1 4096 10月 31 09:33 cfg
-rwxrwxr-x 1 lyx1 lyx1 95768664 10月 31 09:36 cppcheck
-rwxrwxr-x 1 lyx1 lyx1 4190336 10月 31 09:34 dmake
drwxrwxr-x 2 lyx1 lyx1 4096 10月 31 09:33 platforms
编译后可以将程序路径添加到系统环境变量中,这样可以在系统的各个地方直接调用 cppcheck 命令
进入 profile文件修改设置环境变量
sudo vi /etc/profile
在profile文件末尾添加 cppcheck的程序路径,如:/home/root/app/cppcheck-2.12.0/build/bin
export PATH=/home/root/app/cppcheck-2.12.0/build/bin:$PATH
可以选择重启系统后一直有效
或者在使用的终端输入一下命令,给本次终端更新系统环境变量
source /etc/profile
官网源码下载路径:http://cppcheck.net/
下载后,按安装包顺序点击安装即可
brew install cppcheck
选择重启系统后一直有效
或者在使用的终端输入一下命令,给本次终端更新系统环境变量
source /etc/profile
官网源码下载路径:http://cppcheck.net/
[外链图片转存中…(img-MwVe0Cuw-1698910490138)]
下载后,按安装包顺序点击安装即可
brew install cppcheck