clang-前端插件-给各种无花括号的“块”加花括号-基于llvm15--clang-plugin-add-brace
处理的语句
case
术语约定或备忘
- case起止范围: 从冒号到下一个’case’开头, 简称有: case内 、case内容
- 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中文的意思是稳定扩散,本质上是基于AI的图像扩散生成模型。 Stable Diffusion是一个引人注目的深度学习模型,它使用潜在扩散过程来生成图像,允许模型在生成图像时考虑到文本的描述。这个模型的出现引起了广泛的关注和讨论&am…...
【机器学习】模型平移不变性/等变性归纳偏置Attention机制
Alphafold2具有旋转不变性吗——从图像识别到蛋白结构预测的旋转对称性实现 通过Alphafold2如何预测蛋白质结构,看有哪些机制或tricks可以利用? 一、等变Transformer 等变Transformer是Transformer众多变体的其中一种,其强调等变性。不变性…...
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时代 适合通信专业的 毕业设计题目
对于通信专业的本科生来说,选择一个与学习内容紧密相关的毕业设计题目十分重要。 以下是东枫科技建议的题目,它们涵盖了通信技术的不同方面: 高校老师可以申请东枫科技工程师共同对学生指导,完成毕业设计。 基于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实验:单词计数 文章目录 【智能大数据分析】实验1 MapReduce实验:单词计数一、实验目的二、实验要求三、实验原理1 MapReduce编程2 Java API解析 四、实验步骤1 启动Hadoop2 验证HDFS上没有wordcount的文件夹3 上传数据…...
KV STUDIO的安装与实践(一)
目录 什么是KV STUDIO? 如何安装KV STUDIO? 如何学习与使用KV STUDIO(在现实中的应用)? 应用一(在现实生活中机器内部plc的读取与替换) 读取 KV STUDIO实现显示器的检测!&#…...
matlab simulink ADRC控制样例
1、内容简介 略 3-可以交流、咨询、答疑 2、内容说明 用adrc控制传递函数,保证输出达到预期 ADRC控制器、传递函数 3、仿真分析 4、参考论文 略...
我是如何走上测试管理岗的
最近有小伙伴问了一个问题:他所在的测试团队规模比较大,有 50 多个人,分成了 4 ~ 5 个小组。这位同学觉得自己的技术能力在团队里应该属于比较不错的,但疑惑的是在几次组织架构调整中,直属领导一直没有让他来管理一个小…...
回溯法:雀魂启动!
题目链接:雀魂启动!_牛客题霸_牛客网 题解: 回溯法 1、用哈希思想构建映射表,标记已有的卡的种类和个数 2、遍历卡池,先从卡池中抽一张卡,因为只能抽一张卡,所以一种卡只判断一次 3、抽到卡后找…...
新的iLeakage攻击从Apple Safari窃取电子邮件和密码
图片 导语:学术研究人员开发出一种新的推测性侧信道攻击,名为iLeakage,可在所有最新的Apple设备上运行,并从Safari浏览器中提取敏感信息。 攻击概述 iLeakage是一种新型的推测性执行攻击,针对的是Apple Silicon CPU和…...
Java练习题2021-1
"从大于等于N的正整数里找到一个最小的数M,使之满足: M和M的逆序数(如1230的逆序数为321)的差的绝对值为一个[100000,200000]区间内的值。 输入说明:起始数字N; 输出说明:找到的第一个符合…...
微信小程序input输入字母自动转大写不生效问题解决
uniapp中开发的小程序,采用 style"text-transform:uppercase" H5中正常小写变大写,编译小程序后不生效 解决办法 uniapp中 input增加 input"TransFormationsFn" <input type"text" value"" input"…...
jmeter报Java.NET.BindException: Address already in use: connect
1、windows10和window11上: 修改注册表的内容: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters: 新建dword(值)的类型: MaxUserPort 65334 TcpTimedWaitDelay 30window...
2023手工测试转自动化测试后,薪资可以达到多少?
目前手工测试工作了8个月,现已辞职在家学习全栈自动化测试的课程中,之前想着学完后工资期望7.5k,开发朋友说太少了 ,想了解下这样的情况在日后找工作,薪资可以达到多少? 说到底,软件测试是技术…...
Android应用安全左移实践:Kiuwan SAST集成与漏洞修复指南
1. 项目概述:为什么Android应用安全需要“左移”?在移动应用开发这个行当里干了十几年,我见过太多团队在安全问题上“亡羊补牢”的场景。往往是应用上线后,被安全团队或第三方扫描工具揪出一堆高危漏洞,然后整个团队进…...
如何快速掌握LiteDB.Studio:面向初学者的LiteDB数据库终极GUI管理工具完整指南
如何快速掌握LiteDB.Studio:面向初学者的LiteDB数据库终极GUI管理工具完整指南 【免费下载链接】LiteDB.Studio A GUI tool for viewing and editing documents for LiteDB v5 项目地址: https://gitcode.com/gh_mirrors/li/LiteDB.Studio 在嵌入式数据库应用…...
2026年网络安全行业发展全景解析(技术从业者必看)_最新网络行业发展锐评
2026年网络安全行业发展全景解析(技术从业者必看) 摘要:随着数字化转型进入深水区,AI、云原生、物联网等技术的普及,网络安全已从“辅助保障”升级为“核心刚需”。 一、行业发展现状:政策与市场双轮驱动&…...
SLO-Warden:基于错误预算的智能SLO守护平台设计与实践
1. 项目概述:一个面向SLO的智能守护者在云原生和微服务架构成为主流的今天,服务的稳定性和可靠性不再是“锦上添花”,而是“生死攸关”的底线。作为一线的运维工程师或SRE,我们每天都在和各种监控指标、告警风暴作斗争。传统的监控…...
终极实战指南:用MifareOneTool解决Windows平台MIFARE Classic卡操作难题
终极实战指南:用MifareOneTool解决Windows平台MIFARE Classic卡操作难题 【免费下载链接】MifareOneTool A GUI Mifare Classic tool on Windows(停工/最新版v1.7.0) 项目地址: https://gitcode.com/gh_mirrors/mi/MifareOneTool 想象…...
量化交易自动化框架设计:从API客户端到策略回测的工程实践
1. 项目概述与核心价值最近在量化交易和自动化策略开发的圈子里,一个名为cbonoz/kalshi-skill的项目引起了我的注意。乍一看,这像是一个针对特定交易平台 Kalshi 的技能或工具包。对于不熟悉的朋友,Kalshi 是一个新兴的事件合约交易平台&…...
Deepin Boot Maker:Linux启动盘制作的智能化解决方案
Deepin Boot Maker:Linux启动盘制作的智能化解决方案 【免费下载链接】deepin-boot-maker 项目地址: https://gitcode.com/gh_mirrors/de/deepin-boot-maker 在Linux系统安装领域,传统命令行操作的门槛让许多用户望而却步。Deepin Boot Maker作为…...
手把手教你为全志Tina Linux添加新SPI屏驱动:以GC9306和HX8357C为例
全志Tina Linux SPI屏驱动移植实战:从裸机到内核框架的完整指南 在嵌入式Linux开发中,LCD显示屏的驱动移植是一个常见但颇具挑战性的任务。不同于裸机环境下的直接寄存器操作,Linux内核要求驱动程序遵循特定的框架和规范。本文将深入探讨如何…...
tchMaterial-parser:5分钟快速上手,轻松获取国家中小学智慧教育平台电子课本的完整指南
tchMaterial-parser:5分钟快速上手,轻松获取国家中小学智慧教育平台电子课本的完整指南 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#x…...
终极魔兽争霸3兼容性修复指南:WarcraftHelper让你的经典游戏重获新生
终极魔兽争霸3兼容性修复指南:WarcraftHelper让你的经典游戏重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔兽争霸III…...
