c++静态代码扫描工具clang-tidy详细介绍

clang-tidy

在这里插入图片描述

文章目录

  • clang-tidy
    • 1. 什么是clang-tidy
    • 2. clang-tidy可以解决什么问题
    • 3. 工作原理
    • 4. 如何使用clang-tidy
    • 4. 总结
    • 5. 举例说明:

1. 什么是clang-tidy

Clang-Tidy是一个由LLVM项目提供的开源工具,是一个静态分析工具,用于进行静态代码分析和代码质量改进。它利用Clang编译器的强大功能,对C++代码进行静态分析,并提供了一系列的代码改进建议和警告。Clang-Tidy是基于Clang的AST(抽象语法树)进行分析,并能检测出许多常见的编码错误和代码风格问题。包括语法错误、逻辑错误、性能问题和风格问题。

2. clang-tidy可以解决什么问题

clang-tidy可以解决各种类型的代码问题,包括:

  1. 代码风格问题:例如缩进、空格、命名规范等。
  2. 可维护性问题:例如不必要的拷贝、错误的类型转换等。
  3. 潜在的编程错误:例如空指针引用、数组越界等。
  4. 性能问题:例如慢速算法、重复计算等。

clang-tidy可以帮助开发人员在编译时发现代码中的错误,这可以帮助开发人员提高代码质量和可靠性。clang-tidy还可以帮助开发人员提高代码风格,这可以使代码更易于阅读和维护。

3. 工作原理

Clang-tidy的工作原理是将源代码传递给Clang编译器,然后通过静态分析找到代码中的问题。Clang编译器是一个基于LLVM的项目,它提供了了一个强大的C++前端,能够解析、编译和优化C++代码。而Clang-tidy则利用了Clang编译器的这些功能,对源代码进行深度分析,并找出其中可能存在的问题。

具体来说,Clang-tidy使用了以下技术:

  1. 静态分析:Clang-tidy使用静态分析技术对源代码进行解析,从而构建出抽象语法树(Abstract Syntax Tree,AST)。通过AST,Clang-tidy能够深入理解代码的逻辑,找出其中可能存在的问题。
  2. 规则引擎:Clang-tidy还使用了一套规则引擎,用来检查代码是否符合特定的规则。这些规则可以是检查潜在的错误、风格问题或性能优化点等。
  3. 修复建议:对于发现的问题,Clang-tidy能够提供一些修复建议。例如,对于一个未初始化的变量,Clang-tidy可以建议将其初始化为零。

4. 如何使用clang-tidy

如何在mac上安装c lang-tidy

我是直接使用brew install llvm后,将工具直接软连接到系统路径下,因为mac本身自带clang编译器,如果将llvm放入系统路径,会对mac自身的环境造成影响。

# 安装指令:
brew install llvm
ln -s "/usr/local/opt/llvm/bin/clang-format" "/usr/local/bin/clang-format"
ln -s "/usr/local/opt/llvm/bin/clang-tidy" "/usr/local/bin/clang-tidy"
# 检查安装情况
(base) ➜  bin clang-format --version
clang-format version 16.0.6
(base) ➜  bin clang-tidy --version
Homebrew LLVM version 16.0.6
  Optimized build.
 find_program(CLANG_TIDY_BIN clang-tidy)
  find_program(RUN_CLANG_TIDY_BIN /usr/local/Cellar/llvm/10.0.0_3/share/clang/run-clang-tidy.py)
    list(APPEND RUN_CLANG_TIDY_BIN_ARGS
         -clang-tidy-binary ${CLANG_TIDY_BIN}
         -header-filter="\".*\\b(cpp-client/src)\""
         -checks=clan*,cert*,misc*,perf*,cppc*,read*,mode*,-cert-err58-cpp,-misc-noexcept-move-constructor,-cppcoreguidelines-*)

    add_custom_target(tidy
                      COMMAND ${RUN_CLANG_TIDY_BIN} ${RUN_CLANG_TIDY_BIN_ARGS}
                      COMMENT "running clang tidy")

主要有二种使用方式:

  1. 使用命令行

    可以直接使用命令行: clang-tidy -checks=all -p my_project my_file.cpp

    但是一般会配合githook同步使用, 在用户add或者commit的时候,触发githook,触发脚本,从而扫描用户修改的文件,达到代码静态扫描的目的。

  2. 使用cmake

    推荐参考项目: github-cmake-cpp-project-template

# 该命令会生成
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
find_program(CLANG_TIDY_BIN NAMES "clang-tidy")
if(CLANG_TIDY_BIN)
  set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_BIN}" "-checks=*")
endif()
  1. 使用脚本

clang-tidy官方脚本

4. 总结

Clang-tidy是一种强大的源代码自动检查与修复工具,它能够帮助开发人员发现并修复代码中的各种问题。通过使用Clang-tidy,我们可以提高开发效率,确保代码的质量和可维护性。在未来,我们期待看到Clang-tidy在更多领域的应用,以及其进一步的改进和优化。

5. 举例说明:

在没有任何特定命令行参数的情况下运行该工具将运行该实用程序启用的默认检查器集。让我们检查一下它还提供了哪些其他检查器(通过传递–checks='*'来查看所有检查器),特别是 grep 查找名称中带有现代化的检查器。这些检查器提倡使用现代语言结构:

$ clang-tidy --list-checks -checks='*' | grep "modernize"
    modernize-avoid-bind
    modernize-deprecated-headers
    modernize-loop-convert
    modernize-make-shared
    modernize-make-unique
    modernize-pass-by-value
    modernize-raw-string-literal
    modernize-redundant-void-arg
    modernize-replace-auto-ptr
    modernize-shrink-to-fit
    modernize-use-auto
    modernize-use-bool-literals
    modernize-use-default
    modernize-use-emplace
    modernize-use-nullptr
    modernize-use-override
    modernize-use-using

选项列表已经令人印象深刻,不是吗?Clang-Tidy 确实开箱即用地提供了一些有趣的检查器(从 Clang/LLVM 3.9 开始),并且列表随着版本的不同而不断增长。

检查器的名称几乎是不言自明的(例如,modernize-use-auto将在适用的情况下使用auto),但如果您想探索每个检查器的含义,请查阅clang-tidy 主页上的检查器列表:

为了展示该工具的使用方式,让我们重点关注现代化使用覆盖检查器,因为它是最适用且最无争议的检查器。

% clang-tidy-3.9 -checks='modernize-use-override' test.cpp -- -std=c++11
1 warning generated.
/home/kfunk/test.cpp:5:18: warning: prefer using 'override' or (rarely) 'final' instead of 'virtual' [modernize-use-override]
    virtual void reimplementMe(int a) {}
                 ^
                                      override

好吧。所以它注意到Derived::reimplementMe(int) 重写了基类方法但缺少override说明符!现在我们可以手动添加…或者只是让该工具通过传递*-fix来为我们完成它!在示例上运行它(启用现代化使用覆盖*检查器和修复功能):

有几件事值得一提:

  • 并非所有clang-tidy 的检查器实际上都带有修复功能,但以现代化开头的检查器都带有修复功能。
  • 您可以同时使用多个检查器中的修复程序(考虑*-checks=‘modernize-use-override,modernize-use-auto’ -fix)*
  • 运行 clang-tidy 会调用完整的 Clang 编译器前端,因此需要一些时间才能完成
  • clang-tidy 的重构结果非常准确,因为它得到了成熟的 C++ 解析器的支持

注意:强烈建议使用run-clang-tidy.py在整个项目上运行 clang-tidy,因为它将并行运行该工具多次并确保并发执行不会相互干扰(例如通过避免并行修改共享标头并进而生成损坏的代码)。

  • 参考:

clang-tidy 官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/50793.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【雕爷学编程】MicroPython动手做(15)——掌控板之AB按键3

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

win10日程怎么同步到安卓手机?电脑日程同步到手机方法

在如今快节奏的生活中,高效地管理时间变得至关重要。而对于那些经常在电脑上安排日程的人来说,将这些重要的事务同步到手机上成为了一个迫切的需求。因为目前国内使用win10系统电脑、安卓手机的用户较多,所以越来越多的职场人士想要知道&…

macos下安装john the ripper并配置zip2john+破解加密zip文件

为了破解加密的zip文件,需要用到john进行爆破密码。 1、首先使用homebrew安装john,可以安装它的增强版john-jumbo: brew install john-jumbo 2、安装后可以使用 john 命令验证: john 3、配置zip2john的环境——.zshrc下,&#x…

HashMap查找

文章目录 1 哈希表的基本概念1.1 两个例子1.2 如何查找1.3 若干术语 2 哈希函数的构造方法2.1 直接定址法2.2 除留余数法 3 处理冲突的方法3.1 开放地址法3.1.1 线性探测法3.1.2 二次探测法3.1.3 伪随机探测法 3.2 链地址法(拉链法)3.2.1 创建步骤3.2.2 …

C#..上位机软件的未来是什么?

C#是一种流行的编程语言,广泛应用于桌面应用程序和上位机软件开发。未来,C#上位机软件将继续不断发展和创新,以满足用户日益增长的需求。以下是我认为C#上位机软件未来可能会涉及的一些方向: 更加智能化:随着人工智能…

idea连接远程服务器上传war包文件

idea连接远程服务器&上传war包 文章目录 idea连接远程服务器&上传war包1. 连接服务器2.上传war包 1. 连接服务器 选择Tools -> Start SSH Session 添加配置 连接成功 2.上传war包 Tools -> Deployment -> Browse Remote Host 点击右侧标签,点击&…

Manjaro KDE 22.1.3vmware无法复制文件

Wayland 是 X11 的现代替代品,几十年来 X11 一直是 Linux 上的默认窗口系统。 Wayland 是一种通信协议,定义 X Window 显示服务器和客户端应用程序之间的消息传递。 软件还不兼容 使用X11即可

linux查看服务器系统版本命令

有时我们需要在linux服务器上安装DB、Middleware等,为了保证兼容性,我们需要知晓被提供的linux服务器版本是否满足需求,下面就说一说linux查看服务器系统版本命令。 1.cat /etc/redhat-release 适用于:rhel/centos等 2.cat /etc…

java static修饰的静态成员

静态成员 特点: 1.静态成员可以被本类所有对象共享2.静态成员可以通过类名调用也可以推荐对象调用,但是推荐使用类名调用!3.静态成员随着类的加载而加载,优先于对象存在的静态方法的注意事项: 1.非静态方法可以访问任…

大数据Flink(四十九):框架版本介绍和编程语言选择

文章目录 框架版本介绍和编程语言选择 一、框架版本介绍 二、编程语言选择 框架版本介绍和编程语言选择

1-Linux的目录结构

Linux的目录结构是规定好的,不可以随意进行更改! Linux的文件系统是采用级层式的树状目录结构,最上层是根目录–/,然后再在根目录下创建其它的目录。 各个目录中主要负责的功能和作用如下:(主体的结构一定…

Cisco 路由器配置管理

大多数网络中断的最常见原因是错误的配置更改。对网络设备配置的每一次更改都伴随着造成网络中断、安全问题甚至性能下降的风险。计划外更改使网络容易受到意外中断的影响。 Network Configuration Manager 网络更改和配置管理 (NCCM)解决方案&#xff…

springboot编写mp4视频播放接口

简单粗暴方式 直接读取指定文件,用文件流读取视频文件,输出到响应中 GetMapping("/display1/{fileName}")public void displayMp41(HttpServletRequest request, HttpServletResponse response,PathVariable("fileName") String fi…

掌握文件锁:使用flock实现多个进程之间的无缝文件同步

使用flock实现多个进程之间的无缝文件同步? 博主简介一、引言二、文件锁的概述2.1、定义文件锁2.2、文件锁的种类2.3、文件锁的作用 三、使用flock实现文件锁3.1、flock的简介3.2、flock的使用方法3.3、flock文件锁命令3.4、flock对文件同步的帮助 四、实现多个进程…

GRE TAP的工作原理与5G工业物联网中的应用

随着互联网新技术的发展以及智能化水平的提高,各企业对实时数据传输的需求也在不断提升,企业愈发重视数据中心的建设,以保障企业内网数据安全。 GRE(Generic Routing Encapsulation,通用路由封装)协议属于…

物理机安装ESXI时遇到No Network Adapters

前不久在虚拟机下安装完成了ESXI,果断地使用了,确实很不错了, 配合我上次发的密匙(https://www.cnntt.com/archives/5556)妥妥爽。 虚拟机中试玩了一下,就开始布置到我的物理机上了,毕竟我以后…

【LeetCode】142.环形链表Ⅱ

题目 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部…

无涯教程-jQuery - Highlight方法函数

Highlight 效果可以与effect()方法一起使用。这将以特定的颜色突出显示元素的背景,默认为黄色(yellow)。 Highlight - 语法 selector.effect( "highlight", {arguments}, speed ); 这是所有参数的描述- color - 高亮显示颜色。默认值为"#fff…

(八九)如何与InfluxDB交互InfluxDB HTTP API

以下内容来自 尚硅谷,写这一系列的文章,主要是为了方便后续自己的查看,不用带着个PDF找来找去的,太麻烦! 第 8 章 前言:如何与InfluxDB交互 1、InfluxDB启动后,会向外提供一套HTTP API。外部程…

【Rust教程 | 基础系列 | Cargo工具】Cargo介绍及使用

文章目录 前言一,Cargo介绍1,Cargo安装2,创建Rust项目2,编译项目:3,运行项目:4,测试项目:5,更新项目的依赖:6,生成项目的文档&#xf…