当前位置: 首页 > news >正文

clang-前端插件-给各种无花括号的“块”加花括号-基于llvm15--clang-plugin-add-brace

处理的语句

case

术语约定或备忘

  1. case起止范围: 从冒号到下一个’case’开头, 简称有: case内 、case内容
  2. Ast: Abstract syntax tree: 抽象语法树

没插入花括号的case

若case内, 以下任一条成立,则 跳过该case 即 不会对该case内容用花括号包裹.

  • 有#define、
  • 有#include、
  • 有直属变量声明、
  • 空case、
  • 有宏调用

详述

预处理回调收集#include指令、宏定义

CollectIncMacro_PPCb:Collect Inlucde Macro PPCallbacks : 收集Inlucde和Macro的预处理回调

收集 #include、 #define , 以判断case起止范围内 有无 #include、 #define

遍历switch内某case起止范围内每条语句

RangeHasMacroAstVst: Range Has Macro Call Ast Vistor: 给定范围有无宏调用Ast遍历器

名义上遍历整个switch下的Stmt,实际遍历 给定范围内( 即 case起止范围 内) 的语句,进行以下计算:

1. hasMacro: case起止范围 有无宏调用,从而帮助过滤掉 有宏调用 的case
2. caseKSubStmtCnt:    case起止范围 语句个数(即 case子语句个数), 从而帮助 过滤掉 空case
3. VarDeclDirectlyInCaseKCnt:   直接写在'case'内的变量声明语句个数,即 直属变量声明个数 从而 帮助过滤掉 有直属变量声明 的case。直接写在'case'内的变量声明语句个数,包括以下两种情况:3.1. 直接写在'case'内,其父亲是case语句的3.2. 直接写在'case'内, 但是其父亲是switch块的.  即 存在 在case内的语句 但却不属于该case  而是直接属于switch, 此现象,直接导致 case的子语句 是伪命题,才使得 RangeHasMacroAstVst 不可能 实现无遗漏地 遍历 case下的子语句 , 只能扩大遍历范围到整个switch 并只关注case起止范围内的语句 才能 实现无遗漏地、精准地 遍历 case下的子语句。

实际运行花括号插件

到此 加花括号插件完工了,在llvm-project上正常运行:

sudo docker exec -it ubuntu2204_clang15Compile bash

弹出docker实例ubuntu2204_clang15Compile的bash命令行,以下命令都在此命令行下执行

cd /pubx/git clone https://gitcode.net/pubz/llvm-project/-/commits/brc-dev-no_tick
#即 https://gitcode.net/pubz/llvm-project/-/commit/bee38a325d0957a28b4d06cb4be3c251d143cdf0
#克隆仓库llvm-project后目录结构如下: /pubx/llvm-project/.git/config
  • 步骤1: 对每个被直接编译的源文件中单语句加花括号

对llvm-project的每个源文件的编译过程应用插件libBrcPlugin.so 以 对 该源文件中单语句加花括号

source /pubx/llvm-project/doc_clang15_build/brc_build1_plugin.sh

brc_build1_plugin.sh

  • 步骤2: 对加了花括号后的llvm-project再次做正常的普通编译
source /pubx/llvm-project/doc_clang15_build/brc_build2_directly.sh

brc_build2_directly.sh

  • 步骤3: 验证
//编写c语言源文件 hello.c,内容如下:
#include <stdio.h>
int main(int argc, char** argv){int a,b;printf("a,b:");scanf("%d,%d",&a,&b);int sum=a+b, diff=a-b, div=a/b, mod=a%b;printf("sum=%d,diff=%d,div=%d,mod=%d\n",sum,diff,div,mod);return 0;
}
/pubx/build-llvm15/bin/clang-15  hello.c  -o hello.app
./hello.app
a,b:45,21
sum=66,diff=24,div=2,mod=3

加完花括号的llvm-project源码编译出的编译器clang-15 对 hello.c 实施编译, 编译出二进制文件 hello.app,

而该二进制文件 hello.app 正常运行

由此说明 ,花括号加的位置基本正确。

#统计

find /pubx/llvm-project/ -not -path '*/.git/*' -type f  \( -name "*.cpp" -or -name "*.c"  \)   | xargs -I% grep -Hn    BrcXxx    % > /pubx/BrcXxx.log#把上一条bash命令抽成bash函数
findBrcCommentThenSave() {set -x #bash启用显示执行的命令keyword=$1find /pubx/llvm-project/ -not -path '*/.git/*' -type f \( -name "*.cpp" -or -name "*.c" \) | xargs -I% grep -Hn "$keyword" % |tee  /pubx/"${keyword}.log"set +x #bash禁止显示执行的命令
}
findBrcCommentThenSave BrcThen
findBrcCommentThenSave BrcSw
findBrcCommentThenSave BrcElse
findBrcCommentThenSave BrcFor
findBrcCommentThenSave BrcForRange
findBrcCommentThenSave BrcWhl
findBrcCommentThenSave BrcSw

各种语句分别加了多少花括号

ls -S /pubx/Brc* | xargs -I% sh -c  'wc -l %; ' '''
93201 /pubx/BrcThen.log
29832 /pubx/BrcSw.log
5539 /pubx/BrcElse.log
3603 /pubx/BrcFor.log
2187 /pubx/BrcForRange.log
663 /pubx/BrcWhl.log
'''

各种语句加了花括号的,有多少含有return

这些单语句return,由于没有被花括号包裹,才没有被t_clock_tick插入栈变量释放语句。
而tick插件栈变量分配、释放不平衡,具体为 栈变量共24万、最终残留2万没释放。 此不平衡是 由于 这些大约5万个单return语句没释放栈变量 导致的吗?
如下所示,被BrcPlugin插入花括号的语句中 大约5万个含有return.

ls -S /pubx/Brc* | xargs -I% sh -c  'echo -n "%    "; grep return % |wc -l ''''
/pubx/BrcThen.log    50438
/pubx/BrcSw.log    2681
/pubx/BrcElse.log    815
/pubx/BrcFor.log    6
/pubx/BrcForRange.log    4
/pubx/BrcWhl.log    2
'''

实现

CMakeLists.txt

cmake_minimum_required(VERSION 3.13.4)set(LIBFMT_DIR "/pubx/fmt/")
#set(LIBFMT_STATIC /pubx/fmt/include)
set(LIBFMT_INCLUDE "${LIBFMT_DIR}/include/")
#set(LIBFMT_STATIC /pubx/fmt/build/libfmt.a)
set(LIBFMT_STATIC "${LIBFMT_DIR}/build/libfmt.a")include_directories( "${CMAKE_CURRENT_SOURCE_DIR}/include")
include_directories( "${CMAKE_CURRENT_SOURCE_DIR}/base_home/include/")if (NOT EXISTS "${LIBFMT_STATIC}")MESSAGE(FATAL_ERROR "libfmt静态库${LIBFMT_STATIC} 不存在,请参照 build-libfmt.sh 构建libfmt静态库")
endif()if (NOT EXISTS "${LIBFMT_INCLUDE}")MESSAGE(FATAL_ERROR "libfmt头文件目录${LIBFMT_INCLUDE} 不存在,请参照 build-libfmt.sh 构建libfmt静态库")
endif()#===============================================================================
# 0. GET CLANG INSTALLATION DIR
#修改默认编译器
set(CT_Clang_INSTALL_DIR "/llvm_release_home/clang+llvm-15.0.0-x86_64-linux-gnu-rhel-8.4")
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CURSES_LIBRARY "/lib64/libncurses.so.6")
set(CURSES_INCLUDE_PATH "/usr/include/")
set(CMAKE_EXPORT_COMPILE_COMMANDS True)
#编译器还是使用自带的gcc, 否则 调试时 没有 libstdc++  的调试信息,导致std::string在gdb中不显示,参考:https://stackoverflow.com/questions/58356385/python-exception-class-gdb-error-there-is-no-member-named-m-dataplus-whe/58356946#58356946
#   gdb显示std::string时报错: There is no member named _M_dataplus。 因此gdb不显示std::string的值.
#set(CMAKE_C_COMPILER "/llvm_release_home/clang+llvm-15.0.0-x86_64-linux-gnu-rhel-8.4/bin/clang")
#set(CMAKE_CXX_COMPILER "/llvm_release_home/clang+llvm-15.0.0-x86_64-linux-gnu-rhel-8.4/bin/clang++")
set(LLVM_DIR "/llvm_release_home/clang+llvm-15.0.0-x86_64-linux-gnu-rhel-8.4")
#set(xxx "")project(clang-brc)
#project放到默认编译器定义之后,否则cmake会死循环set(CT_LLVM_INCLUDE_DIR "${CT_Clang_INSTALL_DIR}/include/llvm")set(CT_LLVM_CMAKE_FILE "${CT_Clang_INSTALL_DIR}/lib/cmake/clang/ClangConfig.cmake")# http://llvm.org/docs/CMake.html#embedding-llvm-in-your-project
list(APPEND CMAKE_PREFIX_PATH "${CT_Clang_INSTALL_DIR}/lib/cmake/clang/")find_package(Clang REQUIRED CONFIG)# Sanity check. As Clang does not expose e.g. `CLANG_VERSION_MAJOR` through
# AddClang.cmake, we have to use LLVM_VERSION_MAJOR instead.
# TODO: Revisit when next version is released.
if(NOT "15" VERSION_EQUAL "${LLVM_VERSION_MAJOR}")message(FATAL_ERROR "Found LLVM ${LLVM_VERSION_MAJOR}, but need LLVM 15")
endif()message(STATUS "Found Clang ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using ClangConfig.cmake in: ${CT_Clang_INSTALL_DIR}")message("CLANG STATUS:Includes (clang)    ${CLANG_INCLUDE_DIRS}Includes (llvm)     ${LLVM_INCLUDE_DIRS}"
)# Set the LLVM and Clang header and library paths
include_directories(SYSTEM "${LLVM_INCLUDE_DIRS};${CLANG_INCLUDE_DIRS}")#===============================================================================
# 3. CLANG-brc BUILD CONFIGURATION
#===============================================================================
# Use the same C++ standard as LLVM does
set(CMAKE_CXX_STANDARD 17 CACHE STRING "")# Build type
if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Debug CACHESTRING "Build type (default Debug):" FORCE)
endif()# Compiler flags
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall\-fdiagnostics-color=always")# LLVM/Clang is normally built without RTTI. Be consistent with that.
if(NOT LLVM_ENABLE_RTTI)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
endif()# -fvisibility-inlines-hidden is set when building LLVM and on Darwin warnings
# are triggered if llvm-tutor is built without this flag (though otherwise it
# builds fine). For consistency, add it here too.
include(CheckCXXCompilerFlag)
check_cxx_compiler_flag("-fvisibility-inlines-hidden"SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG

相关文章:

clang-前端插件-给各种无花括号的“块”加花括号-基于llvm15--clang-plugin-add-brace

处理的语句 case 术语约定或备忘 case起止范围: 从冒号到下一个’case’开头, 简称有: case内 、case内容Ast: Abstract syntax tree: 抽象语法树没插入花括号的case 若case内, 以下任一条成立,则 跳过该case 即 不会对该case内容用花括号包裹. 有#define、有#include、有…...

python爬虫-某政府网站加速乐(简单版)实例小记

# -*- coding:utf-8 -*- # Time : 2023/10/23 17:06 # Author: 水兵没月 # File : 哈哈哈哈.py # Software: PyCharm ####################import random import requests# 代理 def get_proxy(proxy_typerandom.choice([1,2,3,4,5])):url "http://ZZZZZZZZZZZZZZZZZZ&qu…...

stable diffusion简介和原理

Stable Diffusion中文的意思是稳定扩散&#xff0c;本质上是基于AI的图像扩散生成模型。 Stable Diffusion是一个引人注目的深度学习模型&#xff0c;它使用潜在扩散过程来生成图像&#xff0c;允许模型在生成图像时考虑到文本的描述。这个模型的出现引起了广泛的关注和讨论&am…...

【机器学习】模型平移不变性/等变性归纳偏置Attention机制

Alphafold2具有旋转不变性吗——从图像识别到蛋白结构预测的旋转对称性实现 通过Alphafold2如何预测蛋白质结构&#xff0c;看有哪些机制或tricks可以利用&#xff1f; 一、等变Transformer 等变Transformer是Transformer众多变体的其中一种&#xff0c;其强调等变性。不变性…...

c++的4中类型转换操作符(static_cast,reinterpret_cast,dynamic_cast,const_cast),RTTI

目录 引入 介绍 static_cast 介绍 使用 reinterpret_cast 介绍 使用 const_cast 介绍 使用 dynamic_cast 介绍 使用 RTTI(运行时确定类型) 介绍 typeid运算符 dynamic_cast运算符 type_info类 引入 原本在c中,我们就已经接触到了很多类型转换 -- 隐式类型转…...

CNN实现与训练--------------以cifar10数据集为例进行演示(基于Tensorflow)

本文以cifar10数据集为例进行演示 (cifar10数据集有5万张3232像素点的彩色图片,用于训练有1万张3232像素点的彩色图片,用于测试) import tensorflow as tf import os import numpy as np from matplotlib import pyplot as plt from tensorflow.keras.layers import Conv2…...

YOLOv5算法改进(21)— 添加CA注意力机制 + 更换Neck网络之BiFPN + 更换损失函数之EIoU

前言:Hello大家好,我是小哥谈。通过上节课的学习,相信同学们一定了解了组合改进的核心。本节课开始,就让我们结合论文来对YOLOv5进行组合改进(添加CA注意力机制+更换Neck网络之BiFPN+更换损失函数之EIoU),希望同学们学完本节课可以有所启迪,并且后期可以自行进行YOLOv5…...

面对6G时代 适合通信专业的 毕业设计题目

对于通信专业的本科生来说&#xff0c;选择一个与学习内容紧密相关的毕业设计题目十分重要。 以下是东枫科技建议的题目&#xff0c;它们涵盖了通信技术的不同方面&#xff1a; 高校老师可以申请东枫科技工程师共同对学生指导&#xff0c;完成毕业设计。 基于5G/6G的通信技术…...

使用Python实现一个简单的斗地主发牌

使用Python实现一个简单的斗地主发牌 1.源代码实现2.实现效果 1.源代码实现 import random# 定义扑克牌的花色和大小 suits [♠, ♥, ♣, ♦] ranks [2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A]# 初始化一副扑克牌 deck [suit rank for suit in suits for rank in ranks]# …...

Linux系统之file命令的基本使用

Linux系统之file命令的基本使用 一、file命令介绍1.1 Linux简介1.2 file命令简介 二、file命令的使用帮助2.1 file命令的help帮助信息2.2 file命令的语法解释2.3 file命令的man手册 三、文件类型介绍四、file命令的基本使用4.1 查询file版本4.2 显示文件类型4.3 输出时不显示文…...

【智能大数据分析】实验1 MapReduce实验:单词计数

【智能大数据分析】实验1 MapReduce实验&#xff1a;单词计数 文章目录 【智能大数据分析】实验1 MapReduce实验&#xff1a;单词计数一、实验目的二、实验要求三、实验原理1 MapReduce编程2 Java API解析 四、实验步骤1 启动Hadoop2 验证HDFS上没有wordcount的文件夹3 上传数据…...

KV STUDIO的安装与实践(一)

目录 什么是KV STUDIO&#xff1f; 如何安装KV STUDIO&#xff1f; 如何学习与使用KV STUDIO&#xff08;在现实中的应用&#xff09;&#xff1f; 应用一&#xff08;在现实生活中机器内部plc的读取与替换&#xff09; 读取 KV STUDIO实现显示器的检测&#xff01;&#…...

matlab simulink ADRC控制样例

1、内容简介 略 3-可以交流、咨询、答疑 2、内容说明 用adrc控制传递函数&#xff0c;保证输出达到预期 ADRC控制器、传递函数 3、仿真分析 4、参考论文 略...

我是如何走上测试管理岗的

最近有小伙伴问了一个问题&#xff1a;他所在的测试团队规模比较大&#xff0c;有 50 多个人&#xff0c;分成了 4 ~ 5 个小组。这位同学觉得自己的技术能力在团队里应该属于比较不错的&#xff0c;但疑惑的是在几次组织架构调整中&#xff0c;直属领导一直没有让他来管理一个小…...

回溯法:雀魂启动!

题目链接&#xff1a;雀魂启动&#xff01;_牛客题霸_牛客网 题解&#xff1a; 回溯法 1、用哈希思想构建映射表&#xff0c;标记已有的卡的种类和个数 2、遍历卡池&#xff0c;先从卡池中抽一张卡&#xff0c;因为只能抽一张卡&#xff0c;所以一种卡只判断一次 3、抽到卡后找…...

新的iLeakage攻击从Apple Safari窃取电子邮件和密码

图片 导语&#xff1a;学术研究人员开发出一种新的推测性侧信道攻击&#xff0c;名为iLeakage&#xff0c;可在所有最新的Apple设备上运行&#xff0c;并从Safari浏览器中提取敏感信息。 攻击概述 iLeakage是一种新型的推测性执行攻击&#xff0c;针对的是Apple Silicon CPU和…...

Java练习题2021-1

"从大于等于N的正整数里找到一个最小的数M&#xff0c;使之满足&#xff1a; M和M的逆序数&#xff08;如1230的逆序数为321&#xff09;的差的绝对值为一个[100000,200000]区间内的值。 输入说明&#xff1a;起始数字N&#xff1b; 输出说明&#xff1a;找到的第一个符合…...

微信小程序input输入字母自动转大写不生效问题解决

uniapp中开发的小程序&#xff0c;采用 style"text-transform:uppercase" H5中正常小写变大写&#xff0c;编译小程序后不生效 解决办法 uniapp中 input增加 input"TransFormationsFn" <input type"text" value"" input"…...

jmeter报Java.NET.BindException: Address already in use: connect

1、windows10和window11上&#xff1a; 修改注册表的内容&#xff1a; HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters&#xff1a; 新建dword&#xff08;值&#xff09;的类型&#xff1a; MaxUserPort 65334 TcpTimedWaitDelay 30window...

2023手工测试转自动化测试后,薪资可以达到多少?

目前手工测试工作了8个月&#xff0c;现已辞职在家学习全栈自动化测试的课程中&#xff0c;之前想着学完后工资期望7.5k&#xff0c;开发朋友说太少了 &#xff0c;想了解下这样的情况在日后找工作&#xff0c;薪资可以达到多少&#xff1f; 说到底&#xff0c;软件测试是技术…...

别再只会用百度搜了!手把手教你用site语法精准锁定CSDN、知乎等网站的技术文章

技术搜索的艺术&#xff1a;用site语法打造高效信息获取系统 每次打开搜索引擎&#xff0c;输入技术关键词后&#xff0c;铺天盖地的结果中真正有用的内容却寥寥无几——这可能是大多数开发者都经历过的困扰。广告推广、低质量转载、过时教程混杂其中&#xff0c;而真正优质的C…...

避坑指南:在K210上跑人脸68关键点,这些细节让你的疲劳检测更准

K210人脸疲劳检测实战&#xff1a;68关键点调优与工程化避坑指南 当你在车载监控或工业安全场景部署基于K210的疲劳检测系统时&#xff0c;是否遇到过这些情况&#xff1f;明明按照开源代码跑通了68关键点检测&#xff0c;但实际场景中闭眼判断总是不准&#xff1b;白天阳光直射…...

Qwen3-Embedding-4B入门必看:Embedding模型vs LLM生成模型的核心差异

Qwen3-Embedding-4B入门必看&#xff1a;Embedding模型vs LLM生成模型的核心差异 1. 引言&#xff1a;从关键词搜索到语义理解 你是否曾经遇到过这样的困扰&#xff1a;在搜索引擎中输入"苹果"&#xff0c;结果既出现了水果苹果的信息&#xff0c;又出现了苹果公司…...

别再手动改配置了!用Docker Compose一键部署Pikachu靶场,5分钟搞定测试环境

5分钟极速搭建Pikachu靶场&#xff1a;Docker Compose自动化实战指南 每次准备网络安全练习环境时&#xff0c;最头疼的莫过于反复安装配置各种服务——PHP版本不兼容、MySQL连接失败、Web服务器配置错误...这些琐碎问题消耗了本应用于渗透测试学习的宝贵时间。今天要分享的这套…...

别再手算LLC参数了!用Mathcad Prime 8.0自动生成增益曲线,附我验证过的产品级模板

告别手工计算&#xff1a;用Mathcad Prime 8.0打造智能LLC设计工作流 深夜的办公室里&#xff0c;电源工程师小王盯着屏幕上密密麻麻的公式叹了口气——这已经是本周第三次因为手工计算LLC谐振参数出错导致样机测试失败了。在中小型电源企业&#xff0c;像小王这样的场景每天都…...

Kubernetes 环境下 SkyWalking 的高效部署与性能调优

1. Kubernetes 环境下的 SkyWalking 部署实战 第一次在 Kubernetes 上部署 SkyWalking 时&#xff0c;我踩了不少坑。记得当时为了调试一个存储配置问题&#xff0c;整整熬了两个通宵。现在回想起来&#xff0c;如果当时有人能给我一份详细的实战指南&#xff0c;至少能节省 80…...

Cassandra在大数据图像存储中的应用探索

Cassandra在大数据图像存储中的应用探索关键词&#xff1a;Cassandra、大数据、图像存储、分布式系统、数据管理摘要&#xff1a;本文旨在深入探索Cassandra在大数据图像存储领域的应用。我们将先介绍Cassandra的基本概念和特点&#xff0c;再详细分析它与大数据图像存储的适配…...

科哥二次开发Image-to-Video:性能提升39%,小白友好度大增

科哥二次开发Image-to-Video&#xff1a;性能提升39%&#xff0c;小白友好度大增 1. 项目背景与核心价值 Image-to-Video技术正在改变内容创作的方式&#xff0c;它能够将静态图片转化为生动的视频内容。然而&#xff0c;原始I2VGen-XL模型在实际应用中面临两大挑战&#xff…...

Kandinsky-5.0-I2V-Lite-5s技术解析:如何在24GB显存跑通完整图生视频栈

Kandinsky-5.0-I2V-Lite-5s技术解析&#xff1a;如何在24GB显存跑通完整图生视频栈 1. 开箱即用的轻量级图生视频方案 Kandinsky-5.0-I2V-Lite-5s是一款让静态图片动起来的AI工具。想象一下&#xff0c;你只需要上传一张照片&#xff0c;再简单描述想要的动态效果&#xff0c…...

Phi-4-mini-reasoning惊艳效果:线性代数矩阵运算推理全过程展示

Phi-4-mini-reasoning惊艳效果&#xff1a;线性代数矩阵运算推理全过程展示 1. 模型概述 Phi-4-mini-reasoning是一款仅有3.8B参数的轻量级开源模型&#xff0c;专为数学推理、逻辑推导和多步解题等强逻辑任务设计。这款模型由微软Azure AI Foundry开发&#xff0c;主打"…...