clang-query 的编译安装与使用示例
1,clang query 概述
作用:
检查一个程序源码的抽象语法树,测试 AST 匹配器;
帮助检查哪些 AST 节点与指定的 AST 匹配器相匹配;
2,clang-query 安装
准备:
git clone --recursive https://github.com/llvm/llvm-project.git
cd llvm-project/
git checkout llvmorg-3.5.0
cp -r ./clang ./llvm/tools/
cp -r clang-tools-extra ./llvm/tools/clang/tools/extra
mkdir build_d ../local_d
cd build_d #其绝对路径为:/home/hipper/llvm_3_4_0_ex/browse/local_d,如下配置所用
配置:
cmake -G "Unix Makefiles" \
-DCLANG_ENABLE_STATIC_ANALYZER=1 \
-DLLVM_ENABLE_ASSERTIONS=On \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_INSTALL_PREFIX=/home/hipper/llvm_3_4_0_ex/browse/local_d \
-DLLVM_ENABLE_LIBCXX=1 \
-DLLVM_ENABLE_PROJECTS="all" \../llvm
编译安装:
make -j34
make install
cp bin/clang-query /home/hipper/llvm_3_4_0_ex/browse/local_d/bin/
3,测试运行
待测试程序源代码:
hello.c
hello.cextern int write(int, const char*, unsigned long);int main(){write(1, "Hello, ", 7);write(1, "world", 5);write(1, "!\n", 2);return 0;}
测试:
$ clang-query hello.c --
效果:
识别出函数调用表达式,并打印出来了

4, 更多测试
wildanimal-sim.cpp
class Plane{public:int run(int x)
{return 10*x;
}};class Animal {
public:int position;
public:Animal(int pos) : position(pos) {}// Return new positionint run(int quantity) {return position += quantity;}
};
class Cat : public Animal {
public:Cat(int pos) : Animal(pos) {}void meow() {}void destroySofa() {}bool wildMood() {return true;}int run(int quantity){return position += 2*quantity;}
};
int main() {Cat c(50); c.meow();if (c.wildMood())c.destroySofa();c.run(2);Plane pp;pp.run(3);return 0;
}
可以直接输出 AST 的clang 命令:
clang -Xclang -ast-dump hello.c
clang -cc1 -ast-dump hello.c
clang-query wildanimal-sim.cpp
测试如下命令:
clang-query> set output dump
clang-query> match recordDecl()
clang-query> match methodDecl(hasName("run"))
clang-query> match recordDecl(isSameOrDerivedFrom(hasName("Animal")))
clang-query> match recordDecl(allOf(hasMethod(methodDecl(hasName("run"))), isSameOrDerivedFrom(hasName("Animal"))))
LLVM-18:
clang-query> match cxxMemberCallExpr()
clang-query> match cxxMemberCallExpr(callee(memberExpr(member(hasName("run")))))
# not work。 clang-query> match cxxMemberCallExpr(callee(memberExpr(member(hasName("run")))), thisPointerType(recordDecl(isSameOrDerivedFrom(hasName("Animal")))))
LLVM-3.5
clang-query> match memberCallExpr()
clang-query> match memberCallExpr(callee(memberExpr(member(hasName("run")))))
clang-query> match memberCallExpr(callee(memberExpr(member(hasName("run")))), thisPointerType(recordDecl(isSameOrDerivedFrom(hasName("Animal")))))
效果

相关文章:
clang-query 的编译安装与使用示例
1,clang query 概述 作用: 检查一个程序源码的抽象语法树,测试 AST 匹配器; 帮助检查哪些 AST 节点与指定的 AST 匹配器相匹配; 2,clang-query 安装 准备: git clone --recursive https://git…...
echarts数据下钻如何配置
官方范例:https://echarts.apache.org/examples/zh/editor.html?cbar-multi-drilldown 看了一眼范例直接晕了,你这,一堆数据直接写死,这怎么用啊! 一般来说,实现步骤是: 1)后台&a…...
git 提交空目录
git 提交空目录 1. git 无法感应空目录2. git 提交空目录References 1. git 无法感应空目录 Git FAQ https://archive.kernel.org/oldwiki/git.wiki.kernel.org/index.php/GitFaq.html Currently the design of the Git index (staging area) only permits files to be liste…...
【优化方案】Java 将字符串中的星号替换为0-9中的数字,并返回所有可能的替换结果
需求 将输入的字符串中的星号替换为0-9中的数字,并返回所有可能的替换结果,允许存在多个*号。 分析: 在每个星号位置,我们需要进行 0-9 的循环遍历,因此每个星号位置都有 10 种可能性。如果字符数组中有k个星号&#x…...
C语言复习-链表
链表: 特点: 通过 next 指针 把内存上不连续 的几段数据 联系起来 set nu -- 打印行号 概念: 一种数据结构 -- 数据存放的思想 比如 -- 数组 -- 内存连续的一段空间,存放相同类型的一堆数据 缺点 -- 增删元素很 难 -- 不灵活 --> 引入链表 next指针的初步认识…...
Redis面试题-缓存雪崩、缓存穿透、缓存击穿问题
1 穿透: 两边都不存在(皇帝的新装) (黑名单) (布隆过滤器) 2 击穿:一个热点的key失效了,这时大量的并发请求直接到达数据库. (提前预热) 3 雪崩:…...
【Node.js】npx
概述 npx 可以使用户在不安装全局包的情况下,运行已安装在本地项目中的包或者远程仓库中的包。 高版本npm会自带npx命令。 它可以直接运行 node_modules/.bin 下的 exe 可执行文件。而不像之前,我们需要在 scripts 里面配置,然后 npm run …...
hive授予指定用户特定权限及beeline使用
背景:因业务需要,需要使用beeline对hive数据进行查询,但是又不希望该用户可以查询所有的数据,希望有一个新用户bb给他指定的库表权限。 解决方案: 1.赋权语句,使用hive管理员用户在终端输入hive进入命令控…...
Vmware虚拟机无法用root直连说明
Vmware虚拟机无法用root直连说明 背景目的SSH服务介绍无法连接检查配置 背景 今天在VM上新装了一套Centos-stream-9系统,网络适配器的连接方式采用的是桥接,安装好虚拟机后,在本地用ssh工具进行远程连接,ip、用户、密码均是成功的…...
Visio中存在问题的解决方法
公式缩放 mathtype公式在visio缩放之后,出现了变形。 解决方法:每次输入公式都通过 插入->对象->mathType Equation 新建一个公式。可以避免 注:网上有的说在word中使用mathtype编写公式,之后复制到visio中。 插入波形 选择…...
taro之Swiper的使用
图样: 往往我们需要轮播图去显示我们想要的图片之类的 这是工作的代码 <View classNametop-title><SwiperclassNamebanner-swiperinterval{3000}circularautoplay>{homeBannerList.map((item) > {return (<SwiperItem key{item.id}><View…...
正大国际:金融行业发展趋势
2024金融科技趋势研究报告 大模型生态揭秘!金融行业迎来变革,中控成生态核心,大模型在金融行业的应用 随着大模型的不断发展,越来越多的金融机构开始尝试在一些业务场景中引入大模型和生成式A能力,预计2024年,领先的金…...
vue中实现超出一行 展开和收起的功能
html中: <divclass="txttype"ref="txttype"style="margin-bottom: 6px":class="hidetext == true ? hidetext : "><div style="width: 96%"><el-tagtype="info"style="margin-right: 10px&…...
记录一次使用cert-manager-颁发CA证书
一、官网 SelfSigned - cert-manager Documentation 二、例子 apiVersion: v1 kind: Namespace metadata:name: sandbox --- apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata:name: selfsigned-issuer spec:selfSigned: {} --- apiVersion: cert-manager.io/v…...
生成式AI的风险与挑战
生成式AI,即通过训练数据生成新的文本、图像或音频等内容的人工智能技术,具有很多潜在的风险与挑战。 1. 信息可信度:生成式AI往往是基于大量训练数据,但这些数据可能存在偏见、错误或虚假信息。生成的内容可能会引入不准确或误导…...
让IIS支持.NET Web Api PUT和DELETE请求
前言 有很长一段时间没有使用过IIS来托管应用了,今天用IIS来托管一个比较老的.NET Fx4.6的项目。发布到线上后居然一直调用不同本地却一直是正常的,关键是POST和GET请求都是正常的,只有PUT和DELETE请求是有问题的。经过一番思考忽然想起来了I…...
运维小技能:IP多号段配置、重置Mac电脑密码、修改系统级别的文件
文章目录 I 清除last_run_metadata_path数据。1.1 删除文件1.2 清空一个目录下所有文件的内容1.3 定期重启Logstash,并清除last_run_metadata_path数据。II 配置IP2.1 CentOS系统的IP参数2.2 shell脚本-静态网络配置III 电脑的IP多号段配置3.1 Mac电脑3.2 windows系统IV mac Ro…...
Docker的Ubuntu上的安装教程及相关命令
一、简介 Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,这个容器是完全使用沙箱机制(限制容器内部对系统资源的访问),更重要的是容器性能开销极低。 正是因为…...
一些常见的nacos问题和答案
什么是Nacos?它的作用是什么? Nacos是一个动态服务发现、配置管理和服务管理平台。它的作用是帮助应用程序实现服务注册与发现、动态配置管理和服务健康管理等功能。 Nacos的核心功能包括哪些: 服务注册与发现:Nacos支持基于DN…...
华为OD机22道试题
华为OD机试题 2.查找小朋友的好朋友位置 在学校中,N 个小朋友站成一队,第 i 个小朋友的身高为 height[i],第 i 个小朋友可以看到第一个比自己身高更高的小朋友j,那么 j 是 i 的好朋友 (要求:j>i) 。 请重新生成一个…...
【AI】-----向量数据库核心应用场景
向量数据库核心应用场景 1. 大模型 / RAG 知识库(最主流) 企业内部文档、合同、产品手册语义检索解决大模型幻觉、知识过时问题客服机器人、智能问答、私域知识库 2. 推荐系统 电商:相似商品、猜你喜欢短视频/内容:基于用户兴趣的…...
SwiftHub:终极GitHub iOS客户端开发指南 - RxSwift与MVVM-C架构实践
SwiftHub:终极GitHub iOS客户端开发指南 - RxSwift与MVVM-C架构实践 【免费下载链接】SwiftHub GitHub iOS client in RxSwift and MVVM-C clean architecture 项目地址: https://gitcode.com/gh_mirrors/sw/SwiftHub SwiftHub是一款功能强大的GitHub iOS客户…...
避坑指南:CentOS虚拟机重启报rdsosreport.txt错误时,为什么xfs_repair有时需要-L参数?
CentOS虚拟机XFS文件系统修复实战:为什么-L参数是最后的救命稻草? 当你深夜加班部署服务,突然虚拟机异常断电,重启后屏幕上赫然出现"generating /run/initramfs/rdsosreport.txt"的报错——这个场景足以让任何Linux管理…...
Pixel Mind Decoder 效果对比评测:在不同文体和语言风格下的表现
Pixel Mind Decoder 效果对比评测:在不同文体和语言风格下的表现 1. 核心能力概览 Pixel Mind Decoder 是一款专注于文本情绪解码的模型,能够识别和分析不同文本中蕴含的情感倾向。与通用情感分析工具不同,它特别擅长处理复杂语境下的微妙情…...
【Serverless架构生死线】:Java函数冷启动超时率>17%?2024最新CNCF基准测试下的3层防御体系构建
第一章:Serverless架构下Java函数冷启动的生死挑战在Serverless平台(如AWS Lambda、阿里云函数计算、腾讯云SCF)中,Java函数因JVM初始化、类加载、字节码验证及Spring等框架启动开销,常面临数百毫秒至数秒级的冷启动延…...
Vulnhub靶机实战:Momentum-2渗透测试全流程解析
1. 靶机环境搭建与网络配置 Momentum-2是Vulnhub平台上经典的Web渗透测试靶机,模拟了真实环境中常见的漏洞组合。我们先从最基本的虚拟机配置开始说起。下载完OVA文件后,用VMware Workstation导入时会遇到一个小坑——系统会提示"重试"&#…...
5步打造高效知识管理系统:Obsidian模板库实战指南
5步打造高效知识管理系统:Obsidian模板库实战指南 【免费下载链接】OB_Template OB_Templates is a Obsidian reference for note templates focused on new users of the application using only core plugins. 项目地址: https://gitcode.com/gh_mirrors/ob/OB_…...
51单片机之按键控制RGB灯
51单片机之按键控制RGB灯描述:利用KEIL5编程,使AT89C52通过按键输入控制RGB灯显示不同颜色。硬件:电路仿真图(未运行)电路仿真图(运行)程序:主要是按键消抖,机械按键按下…...
gemma-3-12b-it镜像开箱即用:3分钟完成多模态服务启动与测试
gemma-3-12b-it镜像开箱即用:3分钟完成多模态服务启动与测试 1. 快速了解Gemma-3-12b-it 如果你正在寻找一个既能理解文字又能看懂图片的AI模型,而且希望它能在普通电脑上运行,那么Gemma-3-12b-it就是为你准备的。 Gemma是Google推出的轻量…...
告别单行代码:在Python IDLE中编写完整函数的完整指南
告别单行代码:在Python IDLE中编写完整函数的完整指南 对于刚接触Python的开发者来说,IDLE是一个既熟悉又陌生的环境。熟悉是因为它随Python安装包一起提供,陌生则是因为很多人仅仅把它当作一个简单的交互式Shell,而忽略了它作为完…...
