cppcheck简介

cppcheck 是一个静态代码检查工具,支持c、c++ 代码。作为编译器的一种补充检查,cppcheck对源代码执行严格的逻辑检查。

助力开发与测试工程师从代码层面挖掘问题,聚焦于包括逻辑错误、可疑的代码、运算错误、空指针、越界错误、内存泄漏这6个类,52个小类的代码异常。

相比其他的静态检查工具,cppcheck具有简单易上手、执行快、开源等优点。

执行的检查包括:

   1.  自动变量检查

   2.  数组的边界检查

   3.  class类检查

   4.  过期的函数,废弃函数调用检查

   5.  异常内存使用,释放检查

   6.  内存泄漏检查,主要是通过内存引用指针

   7.  操作系统资源释放检查,中断,文件描述符等

   8.  异常STL 函数使用检查

   9.  代码格式错误,以及性能因素检查

默认用法

$cppcheck --enable=all test.cpp 
$cppcheck --enable=all ./src

使用选项–output-file将结果存储在report.txt中。

也可以用输出重定向:

$cppcheck --enable=all test.cpp 2> report.txt

cppcheck安装

官网地址:​​Cppcheck - A tool for static C/C++ code analysis​

安装十分简便,只需在官网下载最新的可执行安装包(目前为​​cppcheck-2.7-x64-Setup.msi​​)跟着向导「下一步」即可。 

C++代码审查工具Cppcheck和TscanCode_linux

运行结果对94个例子的分析十分到位,只不过底侧的代码预览对中文注释似乎不太友好。 

C++代码审查工具Cppcheck和TscanCode_审查工具_02

除了GUI,Cppcheck还支持与多种IDE(如VS、Eclipse、QtCreator等)、版本管理系统(如Tortoise SVN、Git)集成使用。

可对每次分析进行配置甚至自定义规则,并作为项目文件进行保存或重载。

分析的结果报告可保存为格式化纯文本或XML,并可借助Python pygments将XML生成为HTML。

两种工具对比

检测能力:Cppcheck > TscanCode

易用性:TscanCode > Cppcheck 

不是说cppCheck就绝对占优,它在某些情况下可能存在误报。

下面再介绍款腾讯开源的TscanCode。

TscanCode介绍

TscanCode 是腾讯研发的静态代码扫描工具,最早的版本是基于 cppcheck 二次开发。之后又重新自研,不仅支持 C++,还支持 C#,Lua 语言,在发掘 C++ 空指针、越界、未初始化、C#空引用、Lua变量未初始化等比较有效。TScanCode 比较适用于游戏开发代码扫描,有着不错的准确率和效率。

TscanCode 主要能够发现的问题如下:

1、自动变量检查: 返回自动变量(局部变量)指针;

2、越界检查:数组越界返回自动变量(局部变量)指针;

3、类检查:构造函数初始化;

4、内存泄露检查;

5、空指针检查;

6、废弃函数检查;

主流代码审查工具

C++静态代码分析工具(cppcheck、coverity、clang、pclint)。

C++代码审查工具Cppcheck和TscanCode_linux_03

 其性能测试可以见:

TScanCode安装

TscanCode 已经在 Github 上开源。

代码仓库为:​​GitHub - Tencent/TscanCode: A static code analyzer for C++, C#, Lua​​, 我们可以自己下载下来编译,也可以使用腾讯预编译好的可执行文件(代码仓库的 release 目录)。

release ->编译后的二进制文件,分别有Linux、Mac、Windows平台
samples ->测试的代码样例,分别有C++、C#、Lua语言
trunk ->TscanCode源代码

windows平台下:

注(windows平台下,截至目前gtihub的release目录里去掉了原windows的安装包,要想使用可以网上找下载安装TscanCodeV2.14.24.windows.exe。后面评论区有下载链接)

C++代码审查工具Cppcheck和TscanCode_linux_04

扫描项目,导入即可,即可以导入一个文件夹,也可以导入单个文件。

对于扫描后的结果,可以保存为 xml 配置文件,方便下一次直接在主界上直接使用。(打开->结果查看,选中该文件即可。)

还可以在设置中选择扫描规则,每个规则都有对应的代码实例可供参考。 

C++代码审查工具Cppcheck和TscanCode_xml_05

linux平台下:

第一种:
$ git clone https://github.com/Tencent/TscanCode.git
$ cd TscanCode/release/linux/
$ unzip TscanCodeV2.14.24.linux.zip
$ cd TscanCodeV2.14.24.linux/TscanCodeV2.14.2395.linux
$ chmod a+x tscancode
$ echo "PATH=$PATH:$(pwd)" >> ~/.bashrc
$ source ~/.bashrc

第二种,建议使用:
cd trunk/
make
修改cfg/cfg.xml #cfg.xml 配置不当,可能导致检测结果为空,建议value="0"的再开启一些
./tscancode --xml --enable=all -q /home/yang/test/cpp/ >scan_result.xml 2>&1

扫描规则与配置

代码安全静态扫描工具TscanCode支持多平台运行,包括Linux、Windows版本。

在Linux下可通过cfg/cfg.xml对扫描的规则进行配置,

其中通过设置value=0则禁用,value=1则启用。

根据需要定制扫描规则,编辑规则配置文件cfg/cfg.xml,或直接使用默认的扫描规则。

将源代码放到指定路径下${SRC_CODE}(路径中不能包含root文件夹,TscanCode特殊性)。

如,export SRC_CODE=~/myprj/mysource/

执行代码扫描

./tscancode --xml --enable=all -q ${SRC_CODE} >scan_result.xml 2>&1

TscanCode会将结果按照固定的XML格式写入文件中。

选择Excel工具打开XML报告(为了处理更直观),在左侧插入一列处理情况。

开发人员根据报告对代码上下文进行分析,判断是否为工具误报。

对于确认为问题的代码,由开发人员处理后重新进行代码安全静态扫描,直到问题关闭。

其他的一些工具

Valgrind是开放源代码(GPL V2)的仿真调试工具的集合,支持Linux操作系统。它的功能同样强大:

1)Memcheck:重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等;

2)Callgrind:检查程序中函数调用过程中出现的问题,也可以用于性能调优;

3)Cachegrind:检查程序中缓存使用出现的问题;

4)Helgrind:检查多线程程序中出现的竞争问题;

5)Massif:检查程序中堆栈使用中出现的问题;

6)Extension:编写特定的内存调试工具。

推荐几个常用的在线c++代码测试网站

OnlineGDB

Url:https://www.onlinegdb.com/

C++代码审查工具Cppcheck和TscanCode_审查工具_06

​C++ Shell​C++ Shell

Url:http://cpp.sh/

C++代码审查工具Cppcheck和TscanCode_审查工具_07

​Online PHP/Java/C++... editor and compiler | paiza.IO​

C++代码审查工具Cppcheck和TscanCode_审查工具_08