天天看点

cppcheck的安装与使用

一、cppcheck安装

环境:Ubuntu20.04,gcc-9.3.0/gcc-7.5.0

1、方法一:apt源安装cppcheck(推荐,无需编译安装,自动配置环境变量)

sudo

apt 

install

cppcheck

查看版本情况

cppcheck --version

2、方法二:编译安装cppcheck

http://cppcheck.net/官网下载cppcheck源码包(.tar.gz),github下载也可

首先,解压cppcheck压缩包

sudo

tar

-zxvf cppcheck-2.3.

tar

.gz

解压完成之后,进入cppcheck文件夹

cd

cppcheck-2.3/

可以看到,cppcheck包含CMakeLists.txt,可以使用CMake编译

我们先创建一个build的文件夹,进入build的文件夹

mkdir

build && 

cd

build

下面进行编译,我这里gcc版本为9.3.0,经测试7.5.0也没问题

首先使用cmake ..命令将CMakeLists.txt转换为make所需要的makefile

cmake ..

然后,通过make开始编译,-j是代表jobs,表示使用多少个线程进行编译

make

-j 8

编译完成,进入bin目录下查看是否生成cppcheck的可执行文件

cd

bin && ll

总用量 70912

drwxr-xr-x  2 inspur inspur     4096 3月  25 14:15 ./

drwxr-xr-x 11 inspur inspur     4096 3月  25 14:15 ../

-rwxrwxr-x  1 inspur inspur 72185664 3月  25 14:15 cppcheck*

ok,编译安装完成!当然也可以将可执行文件添加到环境变量中使用,方便操作,操作如下。

sudo

vim 

/etc/profile

然后点击i键进行编辑状态,文件末尾输入

export

CPPCHECK_HOME=编译生成可执行文件的目录,例如:

/home/xxx/software/cppcheck-2

.3

/build/bin

按下Esc,输入:wq保存,然后执行source  /etc/profile,即可直接使用cppcheck进行相关操作

二、cppcheck的使用

简述:cppcheck 是一种 C/C++ 代码缺陷静态检查工具。不同于 C/C++ 编译器及很多其它分析工具,它不检查代码中的语法错误。Cppcheck 只检查编译器检查不出来的 bug 类型,其目的是检查代码中真正的错误。

部分操作介绍,如需更多操作说明,请使用cppcheck --help进行查看

1、检查某一个c/c++文件

cppcheck 

file

.c

2、检查文件夹中的所有文件

cppcheck path

cppcheck将递归检查path文件夹下所有源文件

3、启用消息

默认情况下,只显示错误消息,可以通过–enable命令启用更多检查

启用警告消息:

cppcheck --

enable

=warning 

file

.c

启用性能消息:

cppcheck --

enable

=performance 

file

.c

启用信息消息:

cppcheck --

enable

=information 

file

.c

由于历史原因 

--enable=style

 可以启用警告、性能、可移植性和样式信息。当使用旧 XML 格式时,这些都由 style 表示:

cppcheck --

enable

=style 

file

.c

启用警告和性能消息:

cppcheck --

enable

=warning,performance 

file

.c

启用unusedFunction检查

cppcheck --

enable

=unusedFunction 

file

.c

启用所有消息:

cppcheck --

enable

=all

4、将检查结果保存到文件中

cppcheck 

file

.c 2> result.txt

5、多线程检查

cppcheck -j 4 path

多线程检查时,不会对ubusedFunction进行检查

6、CMake项目cppcheck检查的使用

首先,在CMakeList.txt同目录下,通过cmake生成项目的compile_commands.json文件

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

然后即可使用cppcheck对该项目进行检查

cppcheck --project=compile_commands.json

可通过重定向将检查结果导入到文件中

7、屏蔽某种错误

屏蔽syntax error: 命令行参数 --suppress=syntaxError

cppcheck --suppress=memleak:src

/file1

.cpp src/

8、使用suppressions.txt 统一屏蔽,--suppressions-list=suppressions.txt

示例:

noExplicitConstructor 

//

suppress all noExplicitConstructor errors 

in

all files

//

suppress memleak and exceptNew errors 

in

the 

file

src

/file1

.cpp

memleak:src

/file1

.cpp

exceptNew:src

/file1

.cpp

格式:

[error 

id

]:[filename]:[line]

[error 

id

]:[filename2]

[error 

id

]

三、常见错误修改

(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

继续阅读