一、cppcheck安装
环境:Ubuntu20.04,gcc-9.3.0/gcc-7.5.0
1、方法一:apt源安装cppcheck(推荐自动配置环境变量,无需编译安装)
|
|
查看版本
|
|
2.方法二:编译安装:cppcheck
http://cppcheck.net/官网下载cppcheck源码包(.tar.gz),github下载也可
首先,解压cppcheck压缩包
|
|
解压完成后,进入cppcheck文件夹
|
|
可以看到,cppcheck包含CMakeLists.txt,可以使用CMake编译
我们先创造一个build的文件夹,进入build的文件夹
|
|
下面是编译,我在这里gcc版本为9.3.0,经测试7.5.0也没问题
首先使用cmake ..命令将CMakeLists.txt转换为make所需要的makefile
|
|
然后,通过make开始编译,-j是代表jobs,编译多少个线程
|
|
完成编译,进入bin检查目录下是否生成cppcheck的可执行文件
|
|
ok,编译安装完成!当然,可执行文件也可以添加到环境变量中,操作方便,操作如下。
|
|
然后点击i键编辑状态,输入文件末尾
|
|
按下Esc,输入:wq保存,然后执行source /etc/profile,可直接使用cppcheck相关操作
二、cppcheck的使用
简述:cppcheck 是一种 C/C 静态检查工具代码缺陷。 C/C 编译器及很多其它分析工具,它不检查代码中的语法错误。Cppcheck 只检查编译器检查不出来的东西 bug 类型的目的是检查代码中的真实错误。
部分操作介绍,如需更多操作说明,请使用cppcheck --help进行查看
1.检查一个c/c 文件
|
|
2.检查文件夹中的所有文件
|
|
cppcheck将递归检查path所有源文件都夹在文件夹中
3、启用消息
在默认情况下,只显示错误信息,可以通过–enable命令使用更多的检查
使用警告信息:
|
|
启用性能信息:
|
|
启用信息消息:
|
|
由于历史原因--enable=style警告、性能、可移植性和样式信息可以使用。使用旧的 XML 在格式上,这些都是由 style 表示:
|
|
启用警告和性能消息:
|
|
启用unusedFunction检查
|
|
启用所有消息:
|
|
4、将检查结果保存到文件中
|
|
5、多线程检查
|
|
多线程检查时,不会对ubusedFunction进行检查
6、CMake项目cppcheck检查的使用
首先,在CMakeList.txt同目录下,通过cmake生成项目的compile_commands.json文件
|
|
然后即可使用cppcheck对该项目进行检查
|
|
可通过重定向将检查结果导入到文件中
7、屏蔽某种错误
|
|
8、使用suppressions.txt 统一屏蔽,--suppressions-list=suppressions.txt
示例:
|
|
格式:
|
|
三、常见错误修改
(1)隐式构造问题
示例: (style) Class 'Slice' has a constructor with 1 argument that is not explicit.
解决方法:在Slice构造函数前加上explicit,使其必须显示构造,当然这种有时并非必须显示构造
(2)变量未初始化问题
示例:(warning) Member variable 'TableFileCreationInfo::file_size' is not initialized in the constructor.
解决方法:在构造函数中加入变量初始值
(3)变量/函数未使用问题
示例:(style) Unused variable: output
示例:(style) The function 'rocksmt_wal_iter_status' is never used.
解决方法:考虑后期是否还需要,不需要的及时删除,需要的保留
(4)raw loop问题
示例:(style) Consider using std::fill algorithm instead of a raw loop. [useStlAlgorithm]
示例:(style) Consider using std::transform algorithm instead of a raw loop. [useStlAlgorithm]
解决办法:将循环便利替换为STL标准库算法函数
(5)引用传递问题
示例:(performance) Function parameter 'f' should be passed by reference.
解决办法:在声明function时,能用引用传递的尽量使用引用传递,尽量避免值传递
(6)const参数问题
示例:(performance) Function parameter 's' should be passed by const reference. [passedByValue]
解决办法:形参s前加上const,在函数中未被修改的变量,尽量声明为const