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

news2024/9/25 13:21:18

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 官网

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Emacs之point-undo代码步骤记忆前进/回退(一百二十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

Android 面试题 虚拟机、进程、线程 七

🔥 安卓虚拟机 🔥 虽然Android程序是使用Java语言开发的,当然,现在也可以使用kotlin语言。但是实际上我们开发出来的Android程序并不能运行在JVM上,而是只能运行在一个类似JVM的Android虚拟机上。Android虚拟机有两种&…

【数据结构】队列(Queue)的实现 -- 详解

一、队列的概念及结构 1、概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out)。 入队列:进行插入操作的一端称为队尾。 出队列:进行删除操作的…

作为程序员,你很有必要了解一下IVX

一、IVX是什么 iVX 是一个“零代码”的可视化编程平台,拥有方便的在线集成开发环境,不需要下载开发环境,打开浏览器即可随时随地进行项目编辑。iVX 还拥有“一站式”的云资源,通过这一套一站式服务,iVX 可以实现一站式…

某渣渣平台APP登录

准备 APP有壳----360的好像是,懒得回头再看了加密参数sign、password 过程就略过吧!此处只展示结果

用html+javascript打造公文一键排版系统8:主送机关排版

公文一般在标题和正文之间还有主送机关,相关规定为: 主送机关 编排于标题下空一行位置,居左顶格,回行时仍顶格,最后一个机关名称后标全角冒号。如主送机关名称过多导致公文首页不能显示正文时,应当将主送机…

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

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

IDEA将本地项目上传到码云

一、创建本地仓库并关联 用IDEA打开项目,在菜单栏点击vcs->create git repository创建本地仓库, 选择当前项目所在的文件夹当作仓库目录。 二、将项目提交本地仓库 项目名右键就会出现“GIT”这个选项->Add->Commit Directory, 先将项目add…

ORCA优化器浅析——QueryToDXL(CDXLLogical+CDXLScalar)主流程

Orca是Pivotal数据管理产品的新查询优化器,包括GPDB和HAWQ。Orca是一个基于Cascades操作时序框架的现代自上而下的查询优化器。虽然许多Cascades优化器与其主机系统紧密耦合,但Orca的一个独特功能是它能够作为独立的优化器在数据库系统之外运行。这种能力…

C++代码格式化工具clang-format详细介绍

文章目录 clang-format思考代码风格指南生成您的配置运行 clang-format禁用一段代码的格式设置clang-format的设置预览 clang-format 我曾在许多编程团队工作过,这些团队名义上都有“编程风格指南”。该指南经常被写下来并放置在开发人员很少查看的地方。几乎在每种…

ios 查看模拟器沙盒的路径

打一个断点运行程序,在xcode consol底部控制台输入: po NSHomeDirectory() 复制路径粘帖到前往文件夹打开沙盒缓存文件夹

Dig the way

前言 什么时候才能乱杀比赛的题啊,给了两个文件第一个是师傅使用ida反编译的数据库文件,有提示但不多,主要还是看程序吧 分析 程序从文件读取输入值,虽然结果和输入无关但是要用到输入时产生的一些触发条件,所以动态强行输出fl…

AI帮你制作海报

介绍 Microsoft Designer是由微软推出的图像处理软件,能够通过套用模板等方式快速完成设计加工,生成能够在社交媒体使用的图片。Designer的使用更为简单便捷,用户能够通过套用模板等方式快速完成设计加工,生成能够在社交媒体使用…

LLaMA模型论文《LLaMA: Open and Efficient Foundation Language Models》阅读笔记

文章目录 1. 简介2.方法2.1 预训练数据2.2 网络架构2.3 优化器2.4 高效的实现 3.论文其余部分4. 参考资料 1. 简介 LLaMA是meta在2023年2月开源的大模型,在这之后,很多开源模型都是基于LLaMA的,比如斯坦福大学的羊驼模型。 LLaMA的重点是比…

Vue如何实现编程式导航声明方法,前进和后退导航

编程式导航声明方法,前进和后退导航 在router中设置路由导航跳转函数 只要发生跳转 导航的声明函数 访问控制系统如何形成 就这三种 导航守卫的案例,写一个Main.Vue 和login .Vue 后台主页 如果想要展示后台主页,就用这种方法 想实现路由跳转…

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

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

基于minio的dababend部署总结

Databend 是一款开源、弹性、低成本,基于对象存储也可以做实时分析的新式数仓。期待您的关注,一起探索云原生数仓解决方案,打造新一代开源 Data Cloud。 Minio搭建 minio 192.168.10.159 cd /data mkdir minio cd minio wget https://dl…

vue3+vite——打测试包+正式包+本地预览打包后的文件——基础积累

最近在学习vue3vite的内容,发现vite和webpack类似,下面将区别及使用方法做一下记录: 1.vite添加环境配置文件 ... ├── src ... ├── .env # 通用环境变量配置 ├── .env.development …

基于Open3D的点云处理0-测试所用数据下载

地址:github 20220201-data 20220301-data

C. Binary String Copying - 思维

分析: 赛时我是直接模拟的,tle然后mle,补提,发现规律,每一个改变的字符串都只会对应一个需要改变的区间,例如第一个样例前两个101100 -> 011100和101100 -> 011100,对应区间在确定改变的范…