首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ASTMatcher分析函数调用链(上)

3、ASTMatcher ASTMatcher:我们在写clang插件过程中,最大的痛点是在AST阶段快速找到自己想要的节点,RecursiveASTVisitor的方式需要递归遍历、逐层查找,不仅代码冗余...3、clang-query clang-query作为clang的一个工具,可交互式检验Matcher正确性和有效性,可探索AST的结构和关系。...-Xclang -ast-dump -fsyntax-only demoB.m得到其AST image.png 2、创建ASTMatcher 获取函数调用,也需要获取函数被调用的函数名和类名。...这里创建函数调用的ASTMatcher的策略如下: (1)寻找想匹配的节点最外层的类:函数调用 (2)在 AST Matcher Reference 中查看所需要的Matcher匹配到需要的节点:objcMessageExpr...() (3)拿到函数调用后,还需要获取该函数调用的方法定义:objcMethodDecl(),以及类声明:objcImplementationDecl() (4)创建匹配表达式,通过clang-query

7.2K81

Objective-C代码规范检测

AST如下图所示: 通过上面的语法树可以看到其描述代码的具体结构,而在Clang对代码编译时会进入一个语法树的解析阶段,则这个阶段中语法树的每个节点都会被遍历到,因此借助此阶段可以检测程序中所有代码的书写格式是否符合规范...clang -fmodules -fsyntax-only -Xclang -ast-dump HelloAST.m 我们可以看到自己的类定义、方法定义、方法调用在 AST 中所对应的节点。...clang::ASTConsumer则是用于客户读取AST的抽象基类。...它们之间的关系是clang::PluginASTAction作为一个关于AST的插件,同时也是访问clang::ASTConsumer的入口;而clang::ASTConsumer则是用于定义如何取得AST...} }; 在MatchFinder的run方法中,可以找到对应的节点进行处理 // 自定义 handler class CodeCheckHandler : public MatchFinder

1.4K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    ASTMatcher分析函数调用链(下)

    上一篇文章(ASTMatcher分析函数调用链(上))讲到ASTMatcher的原理以及创建,本文将详细介绍ASTMatcher获取函数调用链在iOS app中的应用。...一、ASTMatcher部分 1、无消息调用的函数定义获取 上篇中的ASTMatcher只能获取有消息调用的函数定义,那没有消息调用的函数定义就无法匹配到,所以无消息调用的函数定义也需要获取 DeclarationMatcher...=~/www/AST_Matcher_Result/func-category-new -- -I ~/www/CYHTest/get_func_link/ 二、脚本部分 分析整个app的函数调用关系,.../build/bin/func-call-category-only {} -extra-arg={} -- -I {}".format(file_one_category, ast_matcher_cache_dir...生成的func-call获取调用链不全 clang8.0生成的func-call可执行文件获取调用链不全,具体原因没有去研究 解决:func-call使用clang6.0生成的可执行文件,func-call-category-only

    2.6K50

    详解unable to execute clang-tidy

    这篇文章将解释为什么会出现这个错误消息以及如何解决它。...你可以从官方Clang-Tidy的网站上下载所需的安装文件,并按照指示进行安装。clang-tidy未在系统路径中:如果Clang-Tidy没有被正确地添加到系统路径中,系统将无法找到该工具并执行。...在这种情况下,你需要手动将Clang-Tidy的路径添加到系统路径中,或者在调用Clang-Tidy时指定完整的路径。...它可以捕捉到一些常见的编码问题,例如未使用的变量、弃用的函数、不安全的类型转换、内存泄漏等。...Clang-Tidy的功能主要基于两个组件:语法树匹配器(AST Matcher):Clang-Tidy使用语法树匹配器根据给定的模式匹配源代码中的特定结构。

    51510

    教你如何用AST语法树对代码“动手脚”

    作为程序猿,每天都在写代码,但是有没有想过通过代码对写好的代码”动点手脚”呢?今天就与大家分享——如何通过用AST语法树改写Java代码。 先抛一个问题:如何将图一代码改写为图二?...但是我短一点还不方便进行错误日志分析,调用callSomeMethod返回的结果是:”+rst); …… } 图一 void someMethod(){     String rst=callAnotherMethod...你可能会想通过万能的“正则表达式”匹配替换,但当代码较为复杂时(如下图所示),使用“正则表达法”则会将问题复杂化,难以确保所有代码的完美覆盖并匹配。若通过AST语法树,可以很好地解决此问题。...个推log-rewrite项目改写日志,就是用AST语法树进行的,流程图如下图所示。 ?...先把所有源码解析为AST语法树,遍历每一个编译单元与单元的类声明,在类声明里根据日志方法的签名找到所有的方法调用,然后遍历每个方法调用,将方法调用的第二个参数表达式放入递归方法,对字符串字面值进行改写。

    2.7K60

    微信安全下一代特征计算引擎的探索与实践

    了解语法规则后,分析下语法解析的过程,下图展示了右侧代码的Parse过程,以解析其中 n 函数调用栈Call Stack 调用栈20-15: 这5个函数是Clang Driver函数,其中...源代码对应的AST结构如图: 怎么访问/遍历/修改AST,如何基于Clang AST实现有趣的工具和功能呢,后面介绍基于Clang开始时展开。...以构建if语句条件表达式 n 的LLVM IR为例, CodeGen调用栈Call Stack如下: 调用栈19-15: 这5个函数是Clang Driver函数 调用栈13-12:AST的顶层节点是一个...构造输出IR,继续递归访问AST子节点 调用栈4: 为if语句的条件表达‘n AST子节点 调用栈3-2:构造二元运算符‘的IR 调用栈1: 输出二元运算符‘的功能,玩转编程语言,本章介绍如何基于这些库做开发。

    28810

    企业微信零耦合集成腾讯会议和腾讯文档插件化架构实践

    分析头文件依赖、分析链接日志、解析 AST,前两种方案简单易实现,但是得到的结果精度不够,不能满足企微团队的需求,最终企微团队选择了解析AST方案,使用 Clang LibTooling 编写工具,通过解析...最终方案:解析 AST。LibTooling 是 LLVM 工具链里的接口,它提供了强大的 AST 解析和控制能力,用于编写基于 Clang 能力的独立工具。...企微团队可以基于它的 ASTMatcher 编写工具解析源码,得到函数定义、函数调用等信息,从中可以分析出组件的依赖关系。...工具解析流程如下:首先,使用 ASTMatcher 编写 Matchers 从 AST 中匹配企微团队需要的节点,提取出每个文件的函数定义/调用、变量定义/调用、类定义/引用列表,列表中还包含每个符号的代码文本...6)组件拆分 完成了组件依赖关系分析之后就可以启动组件拆分工作了,组件拆分工作需要投入大量人力完成,开发同事根据依赖关系输出的表格找到需要改造的代码位置,然后动手封装接口,修改接口调用方式,完成代码逻辑的解耦

    1.4K80

    企业微信 iOS 工程演进之路(一)- 组件化

    、分析链接日志、解析 AST,前两种方案简单易实现,但是得到的结果精度不够,不能满足我们的需求,最终我们选择了解析AST方案,使用 Clang LibTooling 编写工具,通过解析 AST 来分析依赖关系...最终方案、解析 ASTLibTooling 是 LLVM 工具链里的接口,它提供了强大的 AST 解析和控制能力,用于编写基于 Clang 能力的独立工具。...我们可以基于它的 ASTMatcher 编写工具解析源码,得到函数定义、函数调用等信息,从中可以分析出组件的依赖关系。...,接下来就是编写工具完成解析工作,工具解析流程如下:使用 ASTMatcher 编写 Matchers 从 AST 中匹配我们需要的节点,提取出每个文件的函数定义/调用、变量定义/调用、类定义/引用列表...图片2.6 组件拆分完成了组件依赖关系分析之后就可以启动组件拆分工作了,组件拆分工作需要投入大量人力完成,开发同事根据依赖关系输出的表格找到需要改造的代码位置,然后动手封装接口,修改接口调用方式,完成代码逻辑的解耦

    1.5K31

    微信团队分享:极致优化,iOS版微信编译速度3倍提升的实践总结

    因此我们可以做这样的工具,通过 AST 找到代码里出现的标识符(包括类型、函数、宏),以及标识符定义所在文件,然后分析是否需要 include 它定义所在文件。...ClangTool 类读入命令行配置项后初始化 CompilerInstance;CompilerInstance 成员函数 ExcutionAction 会调用 ASTFrontendAction 3...个成员函数 BeginSourceFile(准备遍历 AST)、Execute(解析 AST)、EndSourceFileAction(结束遍历)。...ASTFrontendAction 有个重要的纯虚函数 CreateASTConsumer(会被自己 BeginSourceFile 调用),用于返回读取 AST 的 ASTConsumer 对象。...8、参考文献 [1] 如何将 iOS 项目的编译速度提高5倍 [2] 深入剖析 iOS 编译 Clang / LLVM [3] Clang之语法抽象语法树AST [4] time-trace:

    2.7K43

    iOS 微信编译速度优化分享

    因此我们可以做这样的工具,通过 AST 找到代码里出现的标识符(包括类型、函数、宏),以及标识符定义所在文件,然后分析是否需要 include 它定义所在文件。...ClangTool 类读入命令行配置项后初始化 CompilerInstance;CompilerInstance 成员函数 ExcutionAction 会调用 ASTFrontendAction 3...个成员函数 BeginSourceFile(准备遍历 AST)、Execute(解析 AST)、EndSourceFileAction(结束遍历)。...ASTFrontendAction 有个重要的纯虚函数 CreateASTConsumer(会被自己 BeginSourceFile 调用),用于返回读取 AST 的 ASTConsumer 对象:...参考文献 如何将 iOS 项目的编译速度提高5倍 深入剖析 iOS 编译 Clang / LLVM Clang之语法抽象语法树AST time-trace: timeline / flame chart

    10.1K128

    Hades:移动端静态分析框架

    LibTooling 提供 C++ 接口,更新快,可以通过标准的 main() 函数作为入口,可独立运行,能够完全掌控 AST,相比 Plugin 更容易设置。...但是,Code Review 时我们并不会将目标代码转换为 AST 然后再去分析代码的语义如何,更多的是直接理解代码的具体逻辑和调用关系。AST 树状结构分析的复杂性容易带来理解上的差异鸿沟。...它能够表达一个编译单元定义了哪些接口声明、实现了哪些类/类别的方法、定义和展开了哪些宏定义、对象的方法调用和函数使用情况等等。...HadesModel 使我们不需要了解 Clang 编译器以及 AST 如何表达源码。 HadesModel 以一个完整的编译单元为单位,支持 JSON 格式表达。...HadesLint 应用案例:打印项目中的类名 需求描述:我们需要找到项目中定义的所有类名。

    2.2K20

    www6663388com请拨18687679362环球国际iOS 微信编译速度优化分享

    因此我们可以做这样的工具,通过 AST 找到代码里出现的标识符(包括类型、函数、宏),以及标识符定义所在文件,然后分析是否需要 include 它定义所在文件。...ClangTool 类读入命令行配置项后初始化 CompilerInstance;CompilerInstance 成员函数 ExcutionAction 会调用 ASTFrontendAction 3...个成员函数 BeginSourceFile(准备遍历 AST)、Execute(解析 AST)、EndSourceFileAction(结束遍历)。...ASTFrontendAction 有个重要的纯虚函数 CreateASTConsumer(会被自己 BeginSourceFile 调用),用于返回读取 AST 的 ASTConsumer 对象:...参考文献 如何将 iOS 项目的编译速度提高5倍 深入剖析 iOS 编译 Clang / LLVM Clang之语法抽象语法树AST time-trace: timeline / flame chart

    2.4K20

    Hades:移动端静态分析框架

    LibTooling 提供 C++ 接口,更新快,可以通过标准的 main() 函数作为入口,可独立运行,能够完全掌控 AST,相比 Plugin 更容易设置。...但是,Code Review 时我们并不会将目标代码转换为 AST 然后再去分析代码的语义如何,更多的是直接理解代码的具体逻辑和调用关系。AST 树状结构分析的复杂性容易带来理解上的差异鸿沟。...它能够表达一个编译单元定义了哪些接口声明、实现了哪些类/类别的方法、定义和展开了哪些宏定义、对象的方法调用和函数使用情况等等。...HadesModel 使我们不需要了解 Clang 编译器以及 AST 如何表达源码。 HadesModel 以一个完整的编译单元为单位,支持 JSON 格式表达。...HadesLint 应用案例:打印项目中的类名 需求描述:我们需要找到项目中定义的所有类名。

    2.9K30

    深入剖析 iOS 编译 Clang LLVM

    在 C 函数的调用上孙源有个 slides 可以看看: Calling Conventions in Cocoa by sunnyxx bang 也有篇文章: 如何动态调用 C 函数 « bang’s...看到这里大家肯定会好奇 swift 是如何与 C 和 OC 交互的比如系统底层的模块,这里就要提提 swift 的模块映射了(Module map),它调用 Clang 的模块,将其传入 Clang importer...每次编译后生成的 dSYM 文件 在每次编译后都会生成一个 dSYM 文件,程序在执行中通过地址来调用方法函数,而 dSYM 文件里存储了函数地址映射,这样调用栈里的地址可以通过 dSYM 这个映射表能够获得具体函数的位置...ABI 是 application binary interface 的缩写表示应用二进制接口,它指定了函数调用是如何在汇编代码层面上工作的。...printf() 是个可变参数的函数,按照 ABI 调用约定存储参数的寄存器数量存储在寄存器 al 中,可变所以数量设置为0,callq 会调用 printf() 函数。

    8K20

    iOS底层原理之LLVM & Clang

    2.1: 编译流程 通过下面命令可以打印源码的编译阶段: clang -ccc-print-phases main.m 打印结果如下: 输入文件:找到源文件。...通过下面命令,可以查看语法分析后的结果: clang -fmodules -fsyntax-only -Xclang -ast-dump main.m // 如果导入头文件找不到,可以指定SDK clang...2.3.1: IR的基本语法 @ 全局标识 % 局部标识 alloca 开辟空间 align 内存对齐 i32 32个bit,4个字节 store 写入内存 load 读取数据 call 调用函数 ret...其他的懒绑定符号,比如此处的_printf,在首次使用的时候通过dyld_stub_binder来将真实的函数地址与符号进行绑定,调用的时候就可以通过符号找到对应库里面的函数地址进行调用了。...语法分析 clang -fmodules -fsyntax-only -Xclang -ast-dump main.m // 3.

    1.5K10
    领券