静态代码扫描工具—— TScanCode

一、简介


TscanCode支持以下类型规则扫描:

  1. 空指针检查,包含可疑的空指针;
  2. 数据越界;
  3. 内存泄漏,分配和释放不匹配;
  4. 逻辑错误,重复的代码分支,bool类型和INT进行比较,表达式永远True或者false等共18类检查;
  5. 可疑代码检查,if判断中含有可疑的=号;
  6. 运算错误,判断无符号数小于0,对bool类型进行++自增等,共计11类检查。

二、安装


(linux环境)进入代码仓库:https://github.com/Tencent/TscanCode, 克隆到本地(或者到码云镜像https://gitee.com/tyq123/TscanCode)

$ git clone https://github.com/Tencent/TscanCode

1、直接使用编译好的执行文件,在release目录下:

       $ cd ./TscanCode-t/release/linux
              $ cd ./TscanCodeV2.14.24.linux/TscanCodeV2.14.2395.linux
              $ chmod a+x tscancode 

2、源码编译
              $ cd trunk/ 
              $ make 
              修改cfg/cfg.xml #cfg.xml 配置不当,可能导致检测结果为空,建议value="0"的再开启一些

代码安全静态扫描工具TscanCode支持多平台运行,包括Linux、Windows和mac版本,在Linux下可通过cfg/cfg.xml对扫描的规则进行配置,
其中通过设置value=0则禁用,value=1则启用。windows下是GUI,交互比较友好。

三、扫描过程


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

执行./tscancode 或 ./tscancode -h 可获得帮助信息

一些参数:

--enable= all:检查所有    warning:检查warning级别的项目    unusedFunction:检查未使用函数 等

-I

指示头文件目录

-j [jobs]个线程同时扫描

-q 静默模式

--xml 输出xml格式的扫描报告

示例:

$ export CODE_DIR=/data/your/code/dir/

$ ./tscancode --xml --enable=all -I $CODE_DIR/include $CODE_DIR/*.cpp 2>result.xml

处理过程:

 

分析过程:

 

检查过程:

 

普通文本格式扫描结果:

查看下具体代码:

上图的给指针pp直接置空有问题,内存泄漏了。然后关闭释放资源pp也有问题,因为pp为空指针了。

上图411行,对data2这个指针求长度,被认为是异常的,应该是求变量的长度。

等等...

 

一般开发时使用可能只需要知道行号即可,也可以用xml格式输出,查看问题代码上下文。

四、规则扩展


开源代码,可根据情况修改。

五、其他代码检查工具调研


1、cppcheck

Cppcheck是 用于C / C ++代码的静态分析工具。它提供独特的代码分析以检测错误,并专注于检测未定义的行为和危险的代码构造。目标是极少出现误报。

也有windows和linux版本,windows版为图形界面。

可通过sourceforge下载安装:wget https://master.dl.sourceforge.net/project/cppcheck/cppcheck/1.75/cppcheck-1.75.tar.gz

编译同样很简单:$ make

使用和tscancode很相似:$ ./cppcheck --enable=all /home/your/code/dir/*.cpp

但是得出的结论是,准确率没有比tscancode高,而且会有较多误报:不同函数里定义的同名变量,被认为是重复定义。

 

还有其他几款代码检查工具:pclint、coverity、clang等

以下来自网上技术文章中的对比信息:

https://blog.csdn.net/bandaoyu/article/details/108114456

准确率规则也分空指针、越界、变量为初始化、内存/资源泄漏、逻辑错误等规则,以上对比是综合评分。

你可能感兴趣的:(c\c++编程基础,linux编程开发,c++,代码检查,tscancode)