使用shell脚本进行clang-tidy静态代码分析
文章目录
- 0. 引言
- 1. 完整检测脚本代码 clang-tidy-check.sh
- 1.1 流程图
- 1.2 脚本功能概述
- 2. 该脚本优缺点
0. 引言
clang-tidy 是基于 Clang 的工具,提供了丰富的代码检查功能,可以根据用户配置文件进行定制化的检查和规则定义。
之前的文章《使用 Clang-Tidy 进行静态代码分析:完整的配置与 CMake 集成实例》已经对clang-tidy的安装和配置做了基本介绍,并指明了如何与CMake集成。
本文将介绍如何使用 shell脚本进行clang-tidy静态代码分析。
1. 完整检测脚本代码 clang-tidy-check.sh
#!/bin/bash
set -e# Default build directory
DEFAULT_BUILD_DIR="build"# Check if source dir path and optionally a build dir path are provided as arguments
if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; thenecho "Usage: $0 <source_dir_path> [build_dir_path]"echo "Error: Exactly one or two arguments expected."exit 1
fi# Save the user-inputted source dir path to a variable
SOURCE_DIR="$1"# If a second argument (build directory) is provided, use it; otherwise, use the default
if [ "$#" -eq 2 ]; thenBUILD_DIR="$2"echo "$2"
elseBUILD_DIR="$DEFAULT_BUILD_DIR"echo "No build directory specified, using default: '${BUILD_DIR}'"
fi# Check if the source path is an existing directory
if [ ! -d "${SOURCE_DIR}" ]; thenecho "Error: SOURCE_DIR '${SOURCE_DIR}' does not exist."exit 1
elseecho "SOURCE_DIR is '${SOURCE_DIR}'"
fi# Optionally, you can also check if the BUILD_DIR exists or handle its absence according to your needs
if [ ! -d "${BUILD_DIR}" ]; thenecho "Warning: BUILD_DIR '${BUILD_DIR}' does not exist. Depending on your script's logic, this may or may not be a problem."
fi
############## Set the source directory and build directory
ROOT_DIR="$(pwd)"
CLANG_TIDY_CONFIG="${ROOT_DIR}/.clang-tidy"
COMPILE_COMMANDS="${BUILD_DIR}/compile_commands.json"# Check if compile_commands.json exists
if [ ! -f "${COMPILE_COMMANDS}" ]; thenecho "Error: compile_commands.json not found in ${BUILD_DIR}."exit 1
fi# Find all .cc files in the source directory recursively
ALL_STATIC_CHECK_FILES=$(find "${SOURCE_DIR}" -type f -name '*.cpp')filter_clang_tidy_output() {awk '/^clang-diagnostic-unused-command-line-argument/ {next}/^[0-9]+ warnings generated/ {next}/^Suppressed [0-9]+ warnings/ {next}/^Use -header-filter=.*$/ {next}/^Use -system-headers .*$/ {next}/\/usr\// ||/\/opt\// {skipping=1} # Start skipping upon a match with any of the specified patternsskipping == 1 && $0 ~ /\| * *\^/ {skipping=0; next} # Stop skipping when encountering the flexible patternskipping == 0 {print} # Print lines when not skipping'
}# Function to run clang-tidy
run_clang_tidy() {echo "Running clang-tidy..."for file in $ALL_STATIC_CHECK_FILES; doclang-tidy-18 "${file}" -p "${BUILD_DIR}" --warnings-as-errors=* \-config-file="${CLANG_TIDY_CONFIG}" -extra-arg=-std=c++14 \2>&1| filter_clang_tidy_output \|| touch "${BUILD_DIR}/clang_tidy_failed"done
}# Run clang-tidy
run_clang_tidy# Check the results
if [ -f "${BUILD_DIR}/clang_tidy_failed" ]; thenecho "Clang-tidy detected issues."exit 1
elseecho "No Clang-tidy issues found."
fi
1.1 流程图
1.2 脚本功能概述
这段脚本的主要功能包括:
- 检查输入参数的合法性,确保源代码目录路径正确,并根据需要指定构建目录。
- 检查是否存在编译命令文件
compile_commands.json,该文件是 clang-tidy 进行分析所必需的。 - 使用
find命令递归查找源代码目录中的所有.cpp文件。 - 运行 clang-tidy 对每个找到的
.cpp文件进行静态代码分析,输出详细的警告和建议。 - 过滤和处理 clang-tidy 的输出,以排除不必要的警告信息。
- 根据分析结果判断是否有代码问题,并相应地处理结果。
2. 该脚本优缺点
这段脚本的优点在于:
- 自动化分析:有
compile_commands.json文件即可进行分析,不用依赖CMakeLists.txt。 - 灵活处理: 可以根据分析结果,灵活地处理代码中的问题或警告,确保代码质量和稳定性。
然而,该脚本也存在一些潜在的缺点:
- 依赖性问题: 脚本依赖于正确配置的
clang-tidy和compile_commands.json文件,因为不像CMake每次可以实时更新compile_commands.json文件,如果配置不正确可能导致分析失败。 - 效率问题: 因为是依次遍历列表中的文件,对大型代码库进行全面的静态分析可能会消耗较多的时间和计算资源,影响效率。
相关文章:
使用shell脚本进行clang-tidy静态代码分析
文章目录 0. 引言1. 完整检测脚本代码 clang-tidy-check.sh1.1 流程图1.2 脚本功能概述 2. 该脚本优缺点 0. 引言 clang-tidy 是基于 Clang 的工具,提供了丰富的代码检查功能,可以根据用户配置文件进行定制化的检查和规则定义。 之前的文章《使用 Clang…...
PHP和phpSpider:如何应对网站变动导致的数据爬取失败?
php和phpspider:如何应对网站变动导致的数据爬取失败? 导语: 网络爬虫是一种自动化程序,用于从网站上获取数据并进行处理。PHP是一种广泛使用的编程语言,而phpSpider是一个基于PHP的开源网络爬虫框架。然而࿰…...
聊聊etsy平台,一个年入百万的项目
聊聊etsy平台,一个年入百万的项目 什么是etsy,这是怎样一个平台,怎样盈利的?相信现在大家满脑子都是这些疑问。 这个平台也是无意间一个学员提到的,据说他朋友靠这个平台年赚好几百万。苦于门槛太高,他也做不了。今天…...
SyntaxError: Unexpected token ‘??=‘
前端运行报错: globalThis.GLOBAL_NX_VERSION ?? GLOBAL_NX_VERSION;^^^SyntaxError: Unexpected token ??解决: 检查node版本 node -v当前使用的是14.21.3的版本,切换到一个16.0.0以上的版本即可,推荐使用nvm管理node版本 …...
python如何输出list
直接输出list_a中的元素三种方法: list_a [1,2,3,313,1] 第一种 for i in range(len(list_a)):print(list_a[i]) 1 2 3 313 1 第二种 for i in list_a:print(i) 1 2 3 313 1 第三种,使用enumerate输出list_a方法: for i,j in enum…...
【面试系列】SQL 高频面试题
欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…...
【代码随想录训练营】【Day 66】【图论-3】| 卡码 101-104
【代码随想录训练营】【Day 66】【图论-3】| 卡码 101-104 需强化知识点 103,104 优化思路 题目 101. 孤岛的总面积 此处 area 多余 def dfs(grid, x, y, area):dirs [[0, 1], [0, -1], [1, 0], [-1, 0]]m, n len(grid), len(grid[0])area[0] 1grid[x][y] …...
【面试系列】C#高频面试题
欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…...
AI助力校园安全:EasyCVR视频智能技术在校园欺凌中的应用
一、背景分析 近年来,各地深入开展中小学生欺凌行为治理工作,但有的地方学生欺凌事件仍时有发生,严重损害学生身心健康,引发社会广泛关注。为此,教育部制定了《防范中小学生欺凌专项治理行动工作方案》进一步防范和遏…...
Yolov8可视化界面使用说明,含代码
⭐⭐ YOLOv8改进专栏|包含主干、模块、注意力机制、检测头等前沿创新 ⭐⭐ YOLOv8可视化界面如下 使用需要安装opencv-python、torch、numpy及PySide6(python版本>3.9) pip install PySide6 pip install numpy pip install opencv-python 使用说明 运行下方代码…...
怎么使用MarkDown画矩阵
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 今天写文章需要用到矩阵,记录一下 画矩阵需要用到特殊的语法 (1)画普通矩阵,不带括号的 $$be…...
Kafka入门-基础概念及参数
一、Kafka术语 1. Broker Kafka属于分布式的消息引擎系统,它的主要功能是提供一套完备的消息发布与订阅解决方案。可以为每个业务、每个应用甚至是每类数据都创建专属的主题。 Kafka的服务器端由被称为Broker的服务进程构成,即一个Kafka集群由多个Broke…...
Clickhouse 常见操作
数据查询 从json array string中解析字段 json array string 为json.dumps(array(dict)) select JSONExtractString(row,"Date") as Date from( select arrayJoin(JSONExtractArrayRaw(Remarks)) as row from table x )JSONExtractArrayRaw: 将JsonS…...
Docker使用daocloud镜像加速
之前给大家分享的阿里云的镜像加速,今天再给大家分享一个还可以使用的镜像加速地址daocloud。 经过测试速度还是比较快的。 [rootbogon ~]# cat /etc/docker/daemon.json {"registry-mirrors": ["https://docker.m.daocloud.io"] }[rootbogon…...
flink的窗口
目录 窗口分类 1.按照驱动类型分类 1. 时间窗口(Time window) 2.计数窗口(Count window) 2.按照窗口分配数据的规则分类 窗口API分类 API调用 窗口分配器器: 窗口函数 增量聚合函数: 全窗口函数…...
lodash.js 工具库
lodash 是什么? Lodash是一个流行的JavaScript实用工具库,提供了许多高效、高兼容性的工具函数,能够方便地处理集合、字符串、数值、函数等多种数据类型,大大提高工作效率。 lodash官网 文档参见:Lodash Documentation lodash 在Vue中怎么使用? 1、首先安装 lodash np…...
使用ElementUI组件库
引入ElementUI组件库 1.安装插件 npm i element-ui -S 2.引入组件库 import ElementUI from element-ui; 3.引入全部样式 import element-ui/lib/theme-chalk/index.css; 4.使用 Vue.use(ElementUI); 5.在官网寻找所需样式 饿了么组件官网 我这里以button为例 6.在组件中使用…...
【SkiaSharp绘图14】SKCanvas方法详解(三)URL注释、按顶点绘制、 是否裁切区域之外、旋转、缩放、倾斜、平移、保存/恢复画布
文章目录 SKCanvas方法DrawUrlAnnotation 绘制URL注释DrawVertices 按顶点绘制Flush 立即绘制QuickReject 判断区域是否在裁切区域之外ResetMatrix重置矩阵Restore、RestoreToCountRotateDegrees按角度旋转画布RotateRadians按弧度旋转画布SaveLayer保存并新建图层Scale 缩放画…...
WebDriver API (2)
本文将继续上文对WebDriver API的功能使用进行介绍。 一、浏览器操作 1. 浏览器前进forward与后退back 浏览器前进操作是指导航到前一个页面,在浏览器的历史记录中向前移动一页。 浏览器后退操作是指导航到前一个页面,在浏览器的历史记录中向后移动一…...
GCP FrontendConfig 详解:优化您的云负载均衡
目录 1. 什么是GCP FrontendConfig? 2. FrontendConfig的主要功能 2.1 协议选择 2.2 SSL/TLS配置 2.3 重定向配置 2.4 自定义响应头 3. 配置FrontendConfig 4. FrontendConfig的高级特性 4.1 智能路由 4.2 流量控制 4.3 日志和监控 5. FrontendConfig最佳实践 5.…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...
