1.clang-query 文件目录 -p json文件目录(用于调用clang-query 工具对匹配器语法进行验证)

2.match functionDecl(isExpansionInMainFile())(用于匹配主文件中的函数节点)

3. 匹配器的工作步骤

3.1 通过匹配表达式描述一项具体任务中感兴趣的抽象语法树

3.2 匹配器匹配到抽象语法树具体节点并将节点绑定到指定字符串上

3.3 在回调函数中对匹配到的节点进行处理

3.4 示例:functionDecl(hasName("test_checkWhileLoopCondition")).bind("funcDecl")将匹配的functionDecl节点绑定到字符串“funcDecl”

4. AST匹配器的类型

节点匹配器:匹配特定节点

eg: objcPropertyDecl() :匹配 OC 属性声明节点(如@interface Foo)

缩小匹配器:匹配具有相应属性的节点

eg: hasName():用于匹配具有指定名称的节点

hasAttr():匹配具有指定属性的节点

遍历匹配器:允许在节点之间递归匹配

eg:hasAncestor():匹配祖先节点

hasDescendant():匹配后代节点

5.遍历模式

当使用 C++ API 时,例如在 clang-tidy 检查中,traverse() 匹配器用于设置模式:

Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource,returnStmt(hasReturnArgument(integerLiteral(equals(0))))), this);

6.节点匹配器

节点匹配器是匹配器表达式的核心——它们指定预期的节点类型。每个匹配表达式都以一个节点匹配器开始,然后可以使用缩小或遍历匹配器进一步细化。

为方便起见,所有节点匹配器都采用任意数量的参数并隐式充当 allOf 匹配器。

节点匹配器是唯一支持bind(“id”)调用的匹配器,用于将匹配的节点绑定到给定的字符串,稍后将从匹配回调中检索。

7.缩小匹配器

缩小匹配器匹配当前节点上的某些属性,从而缩小要匹配的当前类型的节点集。

有特殊的逻辑缩小匹配器(allOf、anyOf、anything 和unless)允许用户创建更强大的匹配表达式

8.遍历匹配器

遍历匹配器指定与当前节点可达的其他节点的关系。

注意,有特殊的遍历匹配器(has、hasDescendant、forEach 和 forEachDescendant)适用于所有节点,并允许用户编写更通用的匹配表达式。

m decl(has(functionDecl(hasName("test_FloatEqualChecker"))))

9.举例说明

recordDecl(hasName("Foo"), isDerivedFrom("Bar"))

recordDecl 、hasName 、isDerivedFrom都属于 clang matcher 提供给我们的功能函数。

recordDecl用来匹配类、结构体、联合体声明的节点

hasName 可以知道它是用来匹配具有指定名称的节点

isDerivedFrom(xxx) 是匹配从 xxx 派生的类

缩小定位的方位,匹配所有类、结构体、联合体声明的节点中名称为 Foo 的节点且必须是从 Bar 派生出来的节点

recordDecl(anyOf(hasName("Foo"), isDerivedFrom("Bar")))

allOf(A, B) 标识 A 与 B 要同时成立才可以(类似 & )

unless(A) 匹配 A 不成立的节点(类似 ! )

anyOf(A,B) 标识A与B任一成立即可 (类似 or)

10.实际截图

// 基类 class Animal {     // eat() 函数     // sleep() 函数 };

//派生类 class Dog : public Animal {     // bark() 函数 };

m cxxRecordDecl()

m cxxRecordDecl(hasName("Dog"))

m cxxRecordDecl(allOf(hasName("Dog"), isDerivedFrom("Animal")))

11.其他语句

首先将程序代码设置如下

​​​​

使用m functionDecl(isMain())语句进行匹配,结果如下

随后将程序更改为

 调用m decl(has(functionDecl(hasName("test_FloatEqualChecker"))))对程序进行检测

将程序修改为

 使用m binaryOperator(hasOperatorName("=="))进行匹配

clang-tidy学习笔记-1相关推荐

  1. 源码 状态机_LLVM学习笔记(1)--初探源码

    一直耳闻LLVM相比于GCC: well documented 架构灵活,前后端解耦符合龙书的讲解 昨天读到了一篇虽然概括却很周到的llvm入门导引 陈钦霖:LLVM Pass入门导引​zhuanla ...

  2. C语言学习笔记-P1 初识C语言(1)

    C语言学习笔记-P1 初识C语言(1) P1 初识C语言(1) 一.什么是C语言 1.定义 2.发展 二.第一个C语言程序 Hello World 三.数据类型 四.变量,常量 未完待续!!! P1 ...

  3. 《C Primer Plus》学习笔记—第9章

    目录 <C Primer Plus>学习笔记 第9章 函数 1.复习函数 1.引入 2.创建并使用简单的函数:程序lethead1.c 3.分析程序 4.函数参数 1.程序lethead2 ...

  4. OPENMP学习笔记(1)——简介,模型,运行

    OPENMP学习笔记(1)--简介,模型,运行 简介: OpenMP的英文全称是Open Multiprocessing,一种应用程序接口(API,即Application Program Inter ...

  5. ggplot2学习笔记7:通过图层逐层构建图形

    Build a Plot Layer by Layer 5.1 介绍(Introduction) ggplot2背后的一个关键思想是,它允许轻松地迭代,一次一层地构建一个复杂的绘图.每个图层可以来自不 ...

  6. golang学习笔记(基础篇)

    LCY~~Golang学习笔记 一.Go语言开发环境 ##安装Go开发包以及VsCode Go开发包与vscode配置安装教程网址:https://www.liwenzhou.com/posts/Go ...

  7. C语言学习笔记-入门整合篇(十万字长文)

    (该篇学习内容全部来自于C语言中文网, 本篇内容仅仅是简易学习笔记 , 以自己的理解+网站部分描述结合+个人补充,并不适合编程初学者观看!!! 需要有一定的编程基础) 数据在内存中存储 内存条包含了上 ...

  8. Go Web学习笔记(Gin和Gorm)

    本人在学长的推荐下,之后就要用Go开发后端啦!之前已经把go的基础语法过了一遍,现在学习Gin和Gorm框架,特此记录一下,也希望对你们有帮助,当然因为本人是Go新手,所以有写的不对的地方尽情指教,谢 ...

  9. Modern C++ 学习笔记——C++函数式编程

    往期精彩: Modern C++ 学习笔记--易用性改进篇 Modern C++ 学习笔记 -- 右值.移动篇 Modern C++ 学习笔记 -- 智能指针篇 Modern C++ 学习笔记 -- ...

  10. Makefile学习笔记07|编译静态库并通过ifeq语句

    Makefile学习笔记07|编译静态库并通过ifeq语句   希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢.   这里是目录   本篇与上一篇有较多联系,有兴趣的可以先看上一 ...

最新文章

  1. 启动子级时出错_减速机安装与使用时需注意的八个要点,细节很重要!
  2. 从键盘输入10个互不相同的整数,找出其中最小的元素将其与数组中的第一个元素进行交换。
  3. Spark源码阅读03-Spark存储原理之共享变量
  4. C# winform combobox 在绑定数据之后插入一项选择项
  5. Python 爬虫浏览器伪装技术
  6. The writeAsCsv() method can only be used on data sets of tuples.
  7. SAP Commerce Cloud CMS page 和 page template 的概念
  8. ogg oracle 测试kafka_基于OGG的Oracle与Hadoop集群/kafka准实时同步
  9. 复杂性思维中文第二版 六、生命游戏
  10. Oracle数据库用户名密码【转载自百度经验】
  11. 5导出word_妙招技法 | 教你如何快速导出Word文档中的图片
  12. python背景怎么自定义铃声_Python 上课铃声的定时播放(具有较强的自我管理意识.jpg)...
  13. 安卓Android类原生系统官网集合
  14. lan和adsl是什么信号_路由器上的adsl是什么意思【图】
  15. 什么是对称加密(对称加密简介)
  16. 批处理修改win10密码以及密码提示
  17. javascript中的jQuery简单应用
  18. 小强在用计算机计算968,最新苏教版三年级数学下册第四单元测试题及答案3套...
  19. 使用vba把一个工作簿的多个sheet拆分成两个sheet为一个工作簿的多个工作簿
  20. akka-typed(0) - typed-actor, typed messages

热门文章

  1. mod 运算与乘法逆元
  2. [转]google工具大全
  3. oracle 编译时权限不足,ORA-01031权限不足解决方法
  4. 基于51单片机的程控放大器proteus仿真程序设计 数码管显示
  5. openwrt修改密码
  6. java 令牌访问_Microsoft Graph API访问令牌验证失败(java)
  7. 我怎样一步一步引导ChatGPT写完一篇本科毕业论文
  8. SQLMap在windows下的安装、使用及进阶
  9. 【毕业设计】深度学习车牌识别系统 - opencv 卷积神经网络 机器学习
  10. 学python必读的书单_学 Python 必看书单汇总