30.静态代码分析工具clang-tidy

文章目录

    • 基本介绍
    • 安装`clang-tidy`
    • 使用`clang-tidy`
    • 配置文件和格式文件
      • 配置文件
      • 格式文件
      • 使用配置文件和格式化文件
    • 在代码中设置排除`clang-tidy`检测
      • reference


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


基本介绍

clang-tidy 是一个基于 clang 的 C++ “linter” 工具。其作用主要是用来检查和修正代码中的典型编程问题,像代码风格/接口误用/通过静态分析可定位到的bugclang-tidy模块化功能做的很好,有预留接口,非常便于实现新的代码检查功能。

安装clang-tidy

直接编译安装LLVM工程,包含子工程构建,编译安装的bin路径下有clang-tidy工具。

LLVM编译安装的详细步骤可以参考这里

使用clang-tidy

clang-tidy 是一个基于 LibTooling 的工具,如果您为项目设置编译命令数据库,则使用起来会更容易(有关如何执行此操作的示例,请参阅如何为 LLVM 设置工具)。源码对应的编译命令数据库保存在compile-command.json文件中,这个文件中其实保存的是每个可执行文件的构建命令,现在很多工具可以自动生成这个文件,例如对于使用CMake管理的工程,只需要在编译的时候带上参数cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON即可在build目录下生成compile-command.json文件,在执行.clang-tidy命令时设置-p={project}/build即可。

可以在命令行添加--符号,以不使用编译命令而时使用编译选项来定制检测规则,用来实现单个文件的格式检测:

clang-tidy test.cpp -- -Imy_project/include -DMY_DEFINES ...

-I参数指定要包含的头文件路径

clang-tidy有其自己的检测器,也可以使用Clang的静态分析器,每一项检测都有其自己的名字,使用-checks参数可以指定要进行哪些检测,它指定了逗号分隔的正向和反向规则,正向规则指定了要添加的检测子集,反向规则指定了要移除的规则。示例:

clang-tidy -checks='-*,modernize-*' test.cpp --
  • -checks指定要进行哪些检测,-*表示移除所有检测,modernize-*表示保留modernize开头的所有检测。-checks支持的参数有:
checks名称前缀说明
abseil-Google Abseil相关的检测
altera-针对FPGAOpenCL相关的检测
android-Android相关检测
boost-Boost库相关检测
clang-analyzer-Clang Static Analyzer检测

更多检测名称前缀参考:

1.https://clang.llvm.org/extra/clang-tidy/index.html#using-clang-tidy

配置文件和格式文件

配置文件

clang-tidy提供了一个配置文件,可以指定要使用的检测器、检测器的参数等。配置文件使用YAML语法编写,一般放在当前工程目录下,文件名为.clang-tidy

# 指定要使用的检测器
Checks: '-*,modernize-*,performance-*'# 指定检测器的参数
CheckOptions:- key: 'modernize-use-nullptr.NullPtrBeforeZero'value: '0'

格式文件

clang-tidy命令的--format-style=参数,需要.clang-format文件作为参数来设置修复格式化代码的样式。

--format-style=可选的值有:

  • ‘none’,默认值,关闭格式化
  • ‘file’,设置此值clang-tidy会使用最近父目录下的.clang-format文件来设置格式化的样式
  • '{ }'指定格式化选项,例如:-format-style='{BasedOnStyle: llvm, IndentWidth: 8}'
  • ‘llvm’, ‘google’, ‘webkit’, ‘mozilla’

一个简单的.clang-format文件的内容:

Language:        Cpp
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlinesLeft: false
AlignOperands: true

使用配置文件和格式化文件

对于单个文件,通过命令行可以直接来运行:

clang-tidy -format-style='file' -config-file=.clang-tidy -p ../build/debug test_clang.cpp

对于工程中有很多文件,写成shell脚本的形式为:

#!/bin/bashfunction main() {local project_dirproject_dir=$(git rev-parse --show-toplevel)cd "$project_dir" || exit 1local srcssrcs=$(git ls-files src crossdock |grep -E -v 'thrift-gen|Test\.cpp' |grep -E '\.cpp$')local cmdfor src in $srcs; docmd="clang-tidy -p=build"cmd+=" -checks=\"-clang-diagnostic-unused-command-line-argument\" "cmd+=" $src"echo "$cmd"eval "$cmd"done
}main

在代码中设置排除clang-tidy检测

对于工程中的代码,有时候可以确认代码是正常的,但是不满足clang-tidy的规则,这个时候需要增加设置使目标代码免除检测。

通用抑制检测的机制:

  • 对于一行,使用NOLINT注释:

int main(int argc, char** argv) // NOLINT
{return 0;
}
  • 下一行免除检测
// NOLINTNEXTLINEint main(int argc, char** argv)
{return 0;
}
  • 设置一段代码免除检测
int main(int argc, char** argv)
{// NOLINTBEGINint x;int y;// NOLINTENDreturn 0;
}

上面的NOLINT注释后可以接参数,设置具体要避免哪些规则的检测:


int main(int argc, char** argv)
{// NOLINTBEGIN(google*)int x;int y;int array[10]; // NOLINT(*-avoid-c-arrays)// NOLINTEND(google*)return 0;
}

reference

1.https://clang.llvm.org/extra/clang-tidy/index.html#using-clang-tidy

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

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

相关文章

JDBC总结

目录 JDBC(java database connection) JDBC连接数据库步骤: 1. 在项目中添加jar文件,如图所示 2.加载驱动类 向数据库中插入数据代码示例: 第一种: 第二种: 查询操作 : 第一种: 第二种: JDBC(java database connection) java数据库连接.api(应用程序编程接口) ,可…

Java中的垃圾回收机制

在Java编程语言中,垃圾回收(Garbage Collection, GC)机制是内存管理的一个核心部分。它的主要目标是自动释放那些不再被程序使用的对象所占用的内存空间,从而防止内存泄漏,并确保程序的稳定运行。下面,我将…

一文讲清!传统企业的进销存管理难题该怎么解决?

有没有开源的进销存软件啊? 确实,市面上存在不少开源的进销存软件。但客观地讲,开源软件往往面临着安全隐患,因为代码公开,容易成为黑客攻击的目标。此外,开源软件的功能模块通常较为固定,难以…

初出茅庐的小李博客之MQTT.fx客户端接入EMQX Platform

EMQX Platform 概览 EMQX Platform 是 EMQ 推出的一款面向物联网领域的 MQTT 消息中间件产品。作为全球首个 MQTT 5.0 消息云服务,EMQX Platform 提供了一站式运维代管、独有隔离环境的 MQTT 消息服务。在万物互联的时代,EMQX Platform 可以帮助您快速构…

python数据类型之列表

目录 1.创建列表 2.列表基础操作 常用操作 对列表元素顺序随机打乱 列表下标和切片 字符串分割为列表 列表位移 列表切片替换 3.列表内置方法 4.列表排序 简单排序 使用key参数按指定规则排序 二维列表排序 自定义排序规则函数 5.列表排序算法 选择排序 柱状图…

C# 利用Xejen框架源码,我们来开发一个基于Dapper技术的数据库通用的帮助访问类,通过Dapper的增删改查,可以访问Sqlite数据库

Dapper 是一个轻量级的对象关系映射(ORM)工具,适用于 .NET 平台。它由 Stack Overflow 团队开发,旨在提供简单、高效的数据访问功能。与其他重量级 ORM(如 Entity Framework)相比,Dapper 更加轻…

基于Python图像增强算法:低光增强+图像修复+超分辨率重建

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在图像处理与计算机视觉领域,图像增强技术是提高图像质量和可用性的重要手段。在实…

单片机io扩展

输入输出扩展 i2c扩展 方案1:PCF8575 PCF8575双向IO口扩展模块 16位输入输出I2C通讯 单片机级联扩展板 方案2:PCA955A 输出扩展 74HC595 io口扩展模块输出口扩展 参考链接 中微爱芯发[2004] 1号           签发人: (szlcsc.com)https://…

❤ Vscode和Idea都可以使用的-AI插件(官方-百度出的)

❤ Vscode和Idea都可以使用的-AI插件(官方-百度出的) 最新AI特别火,给大家推荐一下最新出的VScode插件,辅助我们写代码! 1、下载地址: > https://comate.baidu.com/zh/shopping?inviteCodefkzlak8f …

jmeter中Ultimate Thread Group设计梯度压测场景

Ultimate Thread Group Ultimate Thread Group 线程组是模拟波浪式压测或者阶梯式负载压测 1、Start Threads Count:线程数量 2、Initial Delay,sec:每组开始添加到测试执行之前的延迟(xx秒开始启动线程) 3、Startu…

python中的线程并行

文章目录 1. 单线程2. 线程池ThreadPoolExecutor 1. 单线程 现在有1154张图片需要顺时针旋转后保存到本地,一般使用循环1154次处理,具体代码如下所示,img_paths中存储1154个图片路径,该代码段耗时约用97ms。 t1time.time() for …

Python筑基之旅-MySQL数据库(四)

目录 一、数据表操作 1、新增记录 1-1、用mysql-connector-python库 1-2、用PyMySQL库 1-3、用PeeWee库 1-4、用SQLAlchemy库 2、删除记录 2-1、用mysql-connector-python库 2-2、用PyMySQL库 2-3、用PeeWee库 2-4、用SQLAlchemy库 3、修改记录 3-1、用mysql-conn…

Java轻松转换Markdown文件到Word和PDF文档

Markdown 凭借其简洁易用的特性,成为创建和编辑纯文本文档的常用选择。但某些时候我们需要更加精致的展示效果,例如在专业分享文档或打印成离线使用的纸质版时,就需要将Markdown文件以其他固定的文档格式呈现。通过将 Markdown 转换为 Word 和…

OpenHarmony实战开发——网络组件axios可以在OpenHarmony上使用了

什么是axios 上古浏览器页面在向服务器请求数据时,因为返回的是整个页面的数据,页面都会强制刷新一下,这对于用户来讲并不是很友好。并且我们只是需要修改页面的部分数据,但是从服务器端发送的却是整个页面的数据,十分…

高效写代码java-推荐插件1(格式转化 ConverterX )-日后待更新

ConverterX 主要功能:格式转化 字符串格式转换 日期转换 Json格式转义 字符格式 快捷键 ctrl shiftS Upper(CODEEASE)字符串全部变成大写Lower(codeease)字符串全部变成小写Camel(codeEase)字符串变成小驼峰ClassCaemel(CodeEase)字符串变成大驼峰UnderlineUpper(CODE_EAS…

项目管理:Jira,禅道,GitHub Issues对比

Jira、禅道(ZenTao)和GitHub Issues都是项目管理工具,但它们在功能、适用场景和特性上有所不同。以下是它们之间的对比: 功能: Jira:是一款强大的项目管理工具,适用于各种项目,尤其…

Vue3组件间通信通过回调函数传递数据

Vue3组件间通信通过回调函数传递数据 一、前言1、使用场景2、实现方法1. 父组件中定义回调方法2. 子组件中触发回调方法 二、结论 一、前言 在 Vue 3 中,组件之间的通信是一个重要的主题。在许多情况下,你可能需要从子组件向父组件传递数据或触发父组件…

python实用系列:按顺序重命名文件

啊,好久没更博客了,今天偶然想换个桌面壁纸,于是上网搜了两个比较满意的桌面壁纸,都是压缩包: 当我想要给他们放到我的桌面壁纸文件里的时候患了难,因为他们的名字有相同的: anime文件夹里边&a…

揭秘!亚马逊、Vinted卖家如何借助自养号测评实现爆单?

​作为一名跨境卖家,你一定梦想着能够在亚马逊上实现爆单,让产品火爆销售。下面就分享五个秘诀,帮助你实现这个梦想: 1. 优质产品:首先,确保你的产品质量优秀,能够满足消费者的需求。品质好的产…

基于Matlab使用BP神经网络进行电力系统短期负荷预测

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 电力系统的短期负荷预测对于电力调度和能源管理具有至关重要的作用。通过准确地预测电力负荷&…