TscanCode代码扫描工具

2023-11-19

TscanCode介绍

TscanCode 是腾讯研发的静态代码扫描工具,最早的版本是基于 cppcheck 二次开发。之后又重新自研,不仅支持 C++,还支持 C#,Lua 语言,在发掘 C++ 空指针、越界、未初始化、C#空引用、Lua变量未初始化等比较有效。TScanCode 比较适用于游戏开发代码扫描,有着不错的准确率和效率,其性能测试可以见:https://blog.csdn.net/wetest_tencent/article/details/51516347
TscanCode 主要能够发现的问题如下:
1、自动变量检查: 返回自动变量(局部变量)指针;
2、越界检查:数组越界返回自动变量(局部变量)指针;
3、类检查:构造函数初始化;
4、内存泄露检查;
5、空指针检查;
6、废弃函数检查;

下载TscanCode

TscanCode 已经在 Github 上开源,地址是:https://github.com/Tencent/TscanCode
其中项目文件夹对应的如下:

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

为了方便起见,下载对应平台的二进制可执行文件便可以运行,其中 Win 平台是有 GUI 图形界面,Linux 中要使用命令和手动配置规则,下面介绍一下在 Win 和 Linux 平台使用 TscanCode。

Win下使用TscanCode

安装 TscanCode 后,双击打开后,主界面上选择:扫描文件夹,然后打开代码的文件夹,点击:开始扫描。
win_tscancode_1
扫描完成后会出现结果:
win_tscancode_2
双击可以查看代码中存在的错误,比如:
win_tscancode_3
对于扫描后的结果,可以保存为 xml 配置文件,方便下一次直接在主界上直接打开:结果查看,选中该文件即可。
还可以在设置中选择扫描规则,每个规则都有对应的代码实例可供参考。
win_tscancode_4

Linux下使用TscanCode

我们将 Linux 版本二进制压缩包解压,然后进入 TscanCodeV2.14.2395.linux 目录,有一个 cfg 文件夹和一个 tscancode 二进制文件,需要使用 chmod +x tscancode 对其加上可执行权限。
在 Linux 下可通过 cfg/cfg.xml 对扫描的规则进行配置,其中通过设置 value=0 则禁用,value=1 则启用,或直接使用默认的扫描规则。
需要注意的是:扫描的路径中不能包含 root 文件夹,TscanCode特殊性。
然后再执行如下命令对 samples/cpp/下的所有 C++ 文件代码进行扫描:

./tscancode --xml --enable=all -q /home/crazyang/samples/cpp/ >scan_result.xml 2>&1

执行后,就会看到在该目录下生成了 scan_result.xml 文件,文件中就是扫描的结果,如果我们需要扫描结果重定向到文件中,最好加上 -q 参数,否则会将扫描的进度信息也重定向到文件中,这些信息仅在终端中显示进度有用。
注意:如果不熟悉后面的参数,可以使用 ./tscancode -h 查看帮助文档。

$ ./tscancode -h
TscanCode - A tool for static C/C++ code analysis

Syntax:
    tscancode [OPTIONS] [files or paths]

If a directory is given instead of a filename, *.cpp, *.cxx, *.cc, *.c++, *.c,
*.tpp, and *.txx files are checked recursively from the given directory.

Options:
    -D<ID>               Define preprocessor symbol. Unless --max-configs or
                         --force is used, TscanCode will only check the given
                         configuration when -D is used.
                         Example: '-DDEBUG=1 -D__cplusplus'.
    -U<ID>               Undefine preprocessor symbol. Use -U to explicitly
                         hide certain #ifdef <ID> code paths from checking.
                         Example: '-UDEBUG'
    --enable=<id>        Enable additional checks. The available ids are:
                          * all
                                  Enable all checks. It is recommended to only
                                  use --enable=all when the whole program is
                                  scanned, because this enables unusedFunction.
                          * warning
                                  Enable warning messages
                          * style
                                  Enable all coding style checks. All messages
                                  with the severities 'style', 'performance' and
                                  'portability' are enabled.
                          * performance
                                  Enable performance messages
                          * portability
                                  Enable portability messages
                          * information
                                  Enable information messages
                          * unusedFunction
                                  Check for unused functions. It is recommend
                                  to only enable this when the whole program is
                                  scanned.
                          * missingInclude
                                  Warn if there are missing includes. For
                                  detailed information, use '--check-config'.
                         Several ids can be given if you separate them with
                         commas. See also --std
    -h, --help           Print this help.
    -I <dir>             Give path to search for include files. Give several -I
                         parameters to give several paths. First given path is
                         searched for contained header files first. If paths are
                         relative to source files, this is not needed.
    -j <jobs>            Start [jobs] threads to do the checking simultaneously.
    -q, --quiet          Do not show progress reports.
    --xml                Write results in xml format to error stream (stderr).

Example usage:
  # Recursively check the current folder. Print the progress on the screen and
  # write errors to a file:
  tscancode . 2> err.txt

  # Recursively check ../myproject/ and don't print progress:
  tscancode --quiet ../myproject/

  # Check test.cpp, enable all checks:
  tscancode --enable=all test.cpp

  # Check f.cpp and search include files from inc1/ and inc2/:
  tscancode -I inc1/ -I inc2/ f.cpp

最后得到的 scan_result.xml 结果文件,可以下载下来使用 Excel 工具打开 XML 报告(为了处理更直观),在左侧插入一列处理情况。
开发人员根据报告对代码上下文进行分析,判断是否为工具误报。
对于确认为问题的代码,由开发人员处理后重新进行代码安全静态扫描,直到问题关闭。

参考:
https://github.com/Tencent/TscanCode
静态代码检查
C++代码质量扫描主流工具深度比较
代码扫描工具TScanCode

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TscanCode代码扫描工具 的相关文章

随机推荐

  • 若依文件下载

    若依文件下载 都看我的 2021 4 17 找了一圈 每一个写的简单的 还得自己完成 提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 前台代码 二 加入js代码 总结 前言 提示 若依框架的文件下载 提
  • css 让内容可滑动,css实现隐藏滚动条并可以滚动内容

    代码预览 行走在光阴里的人 谁不对初见怀揣一份美好向往和期待 谁不对初见心存一份眷恋和不舍 假如人生是一场途经 初见一定是人生路上最美的绽放 人生在世 不管你是青丝如云 还是白发如霜 当你念及 人生若只如初见 时 你的嘴角一定会不由自主地泛
  • ChatGTP套壳网站总结更新

    总结一批ChatGTP套壳网站供大家学习参考 前10个网站经过测试可用 所以套壳网站 就是使用ChatGPT提供的API与ChatGPT系统连接 使用自己的网站来实现交互展示 效果与在ChatpGPT网站上聊天是一样的 ChatGTP套壳网
  • HTC-VIVE手柄使用代码

    using UnityEngine using System Collections 检测手柄功能的脚本 这个脚本挂到手柄上 controler right 和controler left 上 public class ButtonTouc
  • java包装类&简单认识泛型

    1 包装类 在 Java 中 由于基本类型不是继承自 Object 为了在泛型代码中可以支持基本类型 Java 给每个基本类型都对应了一个包装 类型 类中比如由属性 方法 使用比较方便 1 1 基本数据类型和对应的包装类 1 2 装箱和拆箱
  • vtk使用之Mapper和actor的关联

    参考博客 VTK的Mapper Dezeming的博客 CSDN博客 vtk mapper VTK 图形进阶 vtkPolyData数据生成与显示 简 单的博客 CSDN博客 vtkpolydata 类vtkMapper及其派生类 把输入的
  • 引入微信支付Java SDK WxPayAPI_JAVA.zip

    最近需要接入微信支付 百度了很多博客 关键第一步导入微信支付提供的官方sdk就卡住了 那些博客上也没说怎么导入 以前没整过sdk 一下懵了 后来发现WxPayAPI JAVA zip解压出来的文件是个maven项目 然后直接IDEA打开这个
  • Java基础知识总结(三)

    java的代码块分类 局部代码块 比较简单 在局部位置 方法定义中 定义的 作用 限定某个变量的生命周期 构造代码块 在类的成员位置 作用 在执行构造方法之前 如果存在构造代码块 优先执行构造代码块 可以将构造方法中共性内容 放在构造代码中
  • [渗透]CVE-2020-1938/CNVD-2020-10487:Apache Tomcat AJP连接器远程执行代码漏洞

    受影响版本 Apache Tomcat 6 Apache Tomcat 7x lt 7 0 100 Apache Tomcat 8x lt 8 5 51 Apache Tomcat 9x lt 9 0 31 未受影响版本 Tomcat 7
  • 设计模式(十)装饰器模式

    装饰器模式是一种非常有用的结构型模式 它允许我们在不改变类的结果的情况下 为类添加新的功能 我们来举例说明一下 首先添加一组形状 它们都实现了形状接口 public interface Shape String getShape class
  • QT使用emit时发生内存泄露

    1 场景 在QT里面使用多线程进行编程时 子线程执行的函数里面使用了emit发生了内存泄露 2 主要原因 在使用子线程时 线程使用了join 来等待子线程完成 这样使用emit也不会发送信号 因为join 是阻塞的 必须等待当前线程完成 3
  • iOS逆向工程之App脱壳

    本篇博客以微信为例 给微信脱壳 砸壳 在iOS逆向工程中是经常做的一件事情 因为从AppStore直接下载安装的App是加壳的 其实就是经过加密的 这个 砸壳 的过程就是一个解密的过程 未砸壳的App是无法在Class dump Hoppe
  • Android多进程(一)—— 开启多进程

    Android多进程 一般情况下 一个应用程序就是一个进程 进程名就是应用程序的包名 进程是系统分配资源的基本单位 每个进程都有自己独立的资源和内存空间 1 Android开启多进程的原因 单进程分配的内存不够 需要更多的内存 早期的And
  • STM32H750+LAN8720无操作系统移植lwip

    前言 本文提供移植好的工程 仅使用串口和以太网外设 见本文绑定资源 环境 STM32CubeMX V6 8 1 STM32H7 HAL Pack V1 11 1 硬件连接 STM32H750 GPIO定义如下 LAN8720 GPIO定义如
  • 使用匿名函数动态设置前置或者后置操作(装饰器模式的)

    我的个人博客 逐步前行STEP 在维护另一个同事的代码时 由于代码量比较大而且封装程度低耦合高 维护起来不太顺手 就怕哪没注意把现有的逻辑改坏了 受到laravel admin的保存回调功能的启发 想到了使用匿名函数来动态设置前置或者后置操
  • 一文带你看懂细粒度分类网络Learning Attentive Pairwise Interaction(AAAI)

    论文 https arxiv org abs 2002 10191 引用或转载请注明出处
  • [Vue warn]: Error in render: “TypeError: cellValue.replaceAll is not a function

    去除中括号 如 车门 车门 let reg new RegExp g return str replaceAll reg 上面方法 在edge浏览器 谷歌浏览器没问题 但是在搜狗和QQ浏览器就报错 解决办法 return str repla
  • unity中Input类

    这个是鼠标与键盘按键的一些操作 void Update 获取鼠标在屏幕中的位置 Vector3 mousePos Input mousePosition print mousePos 获取屏幕的宽 Screen width 获取屏幕的高 S
  • 【技术经验分享】计算机毕业设计Python+Spark视频推荐系统 短视频推荐系统 视频流量预测系统 短视频爬虫 视频数据分析 视频可视化 视频大数据 大数据毕业设计 大数据毕设

    开发技术 前端 vue js websocket element ui echarts 后端 springboot mybatis plus 数据库 mysql neo4j图数据库 知识图谱 数据分析 hadoop spark实时计算 算法
  • TscanCode代码扫描工具

    TscanCode介绍 TscanCode 是腾讯研发的静态代码扫描工具 最早的版本是基于 cppcheck 二次开发 之后又重新自研 不仅支持 C 还支持 C Lua 语言 在发掘 C 空指针 越界 未初始化 C 空引用 Lua变量未初始