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

Posted 特立独行的猫a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++代码审查工具Cppcheck和TscanCode相关的知识,希望对你有一定的参考价值。

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)跟着向导「下一步」即可。 

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

除了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)。

 其性能测试可以见:https://blog.csdn.net/wetest_tencent/article/details/51516347。

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。后面评论区有下载链接)

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

对于扫描后的结果,可以保存为 xml 配置文件,方便下一次直接在主界上直接使用。(打开->结果查看,选中该文件即可。)
还可以在设置中选择扫描规则,每个规则都有对应的代码实例可供参考。 

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++ ShellC++ Shell

Url:http://cpp.sh/

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

引用

静态代码扫描工具汇总_while_false_的博客-CSDN博客_静态代码扫描工具

TscanCode C/C++静态分析开源分析工具安装与使用_lwblovezj的博客-CSDN博客_tscancode

SPrinter:一个基于Clang-Tidy的C++程序智能指针错误检查工具_ithiker的博客-CSDN博客

C++代码自动检测工具clang-format和clang-tidy_长星照耀十三州府_的博客-CSDN博客

TscanCode代码扫描工具_code_peak的博客-CSDN博客_tscancode

代码扫描工具TScanCode - yusq77 - 博客园

C/C++代码静态分析工具调研

研发工具,你用对了吗?

Windows下 Cppcheck 的使用教程_hellokandy的博客-CSDN博客_cppcheck

C/C++代码静态分析工具调研 - 简书

C++代码质量扫描主流工具深度比较 - 51Testing软件测试网-中国软件测试人的精神家园

C++代码静态检测 - 威海云博客 - 博客园

以上是关于C++代码审查工具Cppcheck和TscanCode的主要内容,如果未能解决你的问题,请参考以下文章

C++代码质量度量工具大阅兵

静态代码分析工具(如 CppCheck)与将编译器警告设置为更严格的级别 [关闭]

如何为 C++ 代码使用 cppcheck 的内联抑制过滤器选项?

如何在 perforce 和 VMS 上为 C++ 进行代码审查/调试/编码/测试/版本控制

如何通过 Cppcheck 解释 Null 指针取消引用?

静态代码检查工具 cppcheck 的使用(可分别集成到VS和QT Creator里)