CodeQL学习笔记(3)-QL语法(模块、变量、表达式、公式和注解)
最近在学习CodeQL,对于CodeQL就不介绍了,目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记,根据个人知识库笔记修改整理而来的,分享出来共同学习。个人觉得QL的语法比较反人类,至少与目前主流的这些OOP语言相比,还是有一定难度的。与现在网上的大多数所谓CodeQL教程不同,本系列基于官方文档和情景实例,包含大量的个人理解、思考和延伸,直入主题,只切要害,几乎没有废话,并且坚持用从每一个实例中学习总结归纳,再到实例中验证。希望能给各位一点不一样的见解和思路。当然,也正是如此必定会包含一定的错误,希望各位大佬能在评论区留言指正。
CodeQL学习笔记(1)
CodeQL学习笔记(2)
模块
模块类似于“包”的概念,可以把一定的内容进行封装,提供了一种组织QL代码的方法,避免代码重复。

模块一般可以包含如下六大结构:
- 导入语句
- 谓词
- 类型(包括用户定义的类)
- 别名
- 显式模块
- select子句(仅在查询模块中可用)
文件模块
事实上,每一个查询文件(后缀为.ql)和库文件(后缀.qll)都定义了一个隐式的模块,这个模块名和文件名相同,但是文件名中的空格会被替换成_。例如我们在之前的示例中import tutorial事实上导入的就是tutorial.qll库模块
库模块
后缀qll,库模块可以被导入,但是不能包含查询语句。
// OneTwoThreeLib.qll
class OneTwoThree extends int {OneTwoThree() {this = 1 or this = 2 or this = 3}
}
文件本身定义了一个名为OneTwoThreeLib的库模块,模块的内容里定义了一个OneTwoThree的类别。在其他文件中可以使用import OneTwoThreeLib来导入,然后直接使用OneTwoThree这个类。
查询模块
后缀ql,查询模块不能被导入,必须要有查询语句(select或query谓词)
# OneTwoQuery.ql
import OneTwoThreeLibfrom OneTwoThree ott
where ott = 1 or ott = 2
select ott as res
这个文件定义了一个名为OneTwoQuery的查询模块,模块内容包含了一个导入语句和select子句
显式模块
直接在另一个模块中定义一个新的模块称为显式模块。定义的内容类似于库模块,不能有查询语句。
...
module M {class OneTwo extends OneTwoThree{OneTwo() {this = 1 or this = 2}}
}
这定义了一个名为M的显式模块,模块内容定义了名为OneTwo的类
参数化模块
在后面的进阶学习过程中可能会涉及,可提前查询官方文档
变量
QL中的变量表示一组值,事实上是一个等式公式,等式条件成立即可,不代表任何数据的内存位置,更不是赋值,这与传统编程语言不同,需要区别开来。从理解上来看,变量可以理解为暂存满足这个类型条件的所有的值的集合,但需要用来受到更进一步的操作和筛选约束,因此变量必须为有限个值。
// correct
from int i
where i in [0..9] // 0 <= i <= 9
select i// error,无限个值
from int i
select i
变量又分为绑定变量和自由变量, 通俗理解,自由变量像是一个待定的代号,而绑定变量则是已经赋值的符号
"hello".indexOf("l") = 1 // 2 and 3, 绑定
min(float f | f in [-3 .. 3]) // -3, 绑定
(i + 7) * 3 // 自由
x.sqrt() // 自由
再来看一组例子
"hello".indexOf("l") = 1 // 永远不成立
min(float f | f in [-3 .. 3]) = -3 // 永远成立
(i + 7) * 3 instanceof int // 包含一个自由变量i,成不成立要看i的取值
exists(float y | x.sqrt() = y) // 包含x和y自由变量,但是不管y怎么取值都不影响整个式子是否成立,只与x有关
instanceof表示类型检查,
<expression> instanceof <classname>,判断是否属于某一类
表达式
这里的理解和其他ool很类似,下面看一些例子即可
select count(int i | i = 1 or i = 2 | i)
select concat(int i | i = [0..3] | i.toString() order by i desc) // 把0~3逆序排列并组合
select rank[4](int i | i = [5..15] | i*2) // 取出5~15的第四个数字*2的结果。需要注意,rank起始序号从1开始,而不是0from int x
where x in [-5 .. 5] and x != 0
select unique(int y | y = x or y = x.abs() | y) // y=x和y=x.abs()相等,才满足unique唯一确定的要求
公式
相等
A != B 和 not A = B意思完全不同,
- A != B 表示A和B不完全相同,即只要存在一对不同的值就成立
- A = B 表示A与B只要有交集即可,即只要存在任何一对值相同就成立
- not A = B 表示完全不相同,即A和B没有任何一对值是相同的就成立,可以看成上一条的相反
1 != [1 .. 2]成立,因为1 != 2
1 = [1 .. 2]成立,因为1 = 1
not 1 = [1 .. 2]不成立,因为有一个共同的值(1)。可以直接看做上面一条的反义
类型检查
x instanceof Person // 检查x是否为Person类型
范围检查
\<expression> in \<range>
from int i
where i = 2 and i in [1..3.1] // 在 >=1 且 <=3.1的范围内
select i
也可以写成<expression> = <range>
from int i
where i = 2 and i = [1..3.1]
select i
量化
exists
exists(<variable declarations> | <formula 1> and <formula 2>)
exists(int i | i instanceof OneTwoThree and i in [1..2])
也可以写成exists(<variable declarations> | <formula 1> | <formula 2>)
forall
forall(<variable declarations> | <formula 1> | <formula 2>)
表示对于formula1的前提下,是否所有的formula2都满足,如果是,则返回true;
例如:forall(int i | i instanceof OneTwoThree | i < 5),含义是在所有OneTwoThree中,是否全都小于5。
逻辑上等于not exists(<variable declarations> | <formula 1> | not <formula 2>)
因此上面那个例子也可以写作:not exists(int i | i instanceof OneTwoThree | not i < 5)
if…then…else
string visibility(Class c){if c.isPublic()then result = "public"else result = "private"
}
注解
以下内容查阅即可
| Annotation | 作用 | 用法示例 |
|---|---|---|
| abstract | 用于定义抽象实体。可以是抽象类或抽象谓词,通常在子类中被重写。 | abstract class Configuration { abstract predicate isSource(Node source); } |
| cached | 将实体的计算结果缓存,以提高多次引用的效率。 | cached predicate slowCalculation(int x) { x = complexComputation() } |
| deprecated | 标记不推荐使用的名称,通常在文档中提供替代名称。 | deprecated class OldClass { /* DEPRECATED: Use NewClass instead */ } |
| external | 用于定义外部模板谓词,通常用于数据库谓词。 | external predicate externalPredicate(int id); |
| transient | 用于 external 谓词,表示在评估过程中不缓存到磁盘。 | external transient predicate tempCalculation(int x); |
| final | 标记不可重写的名称或不可被子类继承的类。 | final predicate hasName(string name) { name = this.getName() } |
| library | 用于标记仅限于 .qll 文件中引用的名称(该注解已弃用)。 | library class InternalClass { } // 使用私有模块代替 |
| override | 表示重写基类型中的成员谓词或字段。 | override predicate isSource(Node source) { … } |
| private | 阻止名称被导出,仅在当前模块的命名空间中引用。 | private int secretFunction() { result = 42 } |
| query | 将谓词转换为查询,使其成为 QL 程序的输出。 | query predicate findResults() { … } |
| pragma | 用于编译器优化,控制谓词内联等行为。 | pragma[inline] predicate fastCalculation(int x) { x = simpleComputation() } |
相关文章:
CodeQL学习笔记(3)-QL语法(模块、变量、表达式、公式和注解)
最近在学习CodeQL,对于CodeQL就不介绍了,目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记,根据个人知识库笔记修改整理而来的,分享出来共同学习。个人觉得QL的语法比较反人类,至少与目前主流的这些OOP语言相比&…...
代码随想录训练营Day11 | 226.翻转二叉树 - 101. 对称二叉树 - 104.二叉树的最大深度 - 111.二叉树的最小深度
226.翻转二叉树 题目链接:226.翻转二叉树思路:遍历二叉树,遍历的时候交换左右节点即可代码: TreeNode* invertTree(TreeNode* root) {reverse(root);return root;}// 迭代法,层序遍历void f2(TreeNode* root) {queue…...
“死鱼眼”,不存在的,一个提词小技巧,拯救的眼神——将内容说给用户,而非读给用户!
视频录制时,死鱼眼问题常见 即便内容再好,眼神死板也会减分 痛点真痛:拍视频时容易紧张 面对镜头,许多人难免紧张 神情僵硬,眼神无光,甚至忘词 这不仅影响表现,还让人难以专注 忘我场景&#x…...
深度学习在复杂系统中的应用
引言 复杂系统由多个相互作用的组成部分构成,这些部分之间的关系往往是非线性的,整体行为难以通过简单的线性组合来预测。这类系统广泛存在于生态学、气象学、经济学和社会科学等多个领域,具有动态演变、自组织、涌现现象以及多尺度与异质性…...
vue3图片懒加载
背景 界面很长,屏幕不能一下装下所有内容,如果以进入首页就把所有内容都加载完的话所需时间较长,会影响用户体验,所以可以当用户浏览到时再去加载。 代码 新建index.ts文件 src下新建directives文件夹,并新建Index…...
总结一些高级的SQL技巧
1. 窗口函数 窗函数允许在查询结果的每一行上进行计算,而不需要将数据分组。这使得我们可以计算累积总和、排名等。 SELECT employee_id,salary,RANK() OVER (ORDER BY salary DESC) AS salary_rank FROM employees;2. 公用表表达式 (CTE) CTE 提供了一种更清晰的…...
无人机飞手考证热,装调检修技术详解
随着无人机技术的飞速发展和广泛应用,无人机飞手考证热正在持续升温。无人机飞手不仅需要掌握飞行技能,还需要具备装调检修技术,以确保无人机的安全、稳定和高效运行。以下是对无人机飞手考证及装调检修技术的详细解析: 一、无人机…...
AI资讯快报(2024.10.27-11.01)
1.<国家超级计算济南中心发布系列大模型> 10月28日,以“人才引领创新 开放赋能发展”为主题的第三届山东人才创新发展大会暨第十三届“海洽会”集中展示大会在山东济南举行。本次大会发布了国家超级计算济南中心大模型,包括“智匠工业大模型、知风…...
范式的简单理解
第二范式 消除非键属性对键的部分依赖 第三范式 消除一个非键属性对另一个非键属性的依赖 表中的每个非键属性都应该依赖于键,整个键,而且只有键(键可能为两个属性) 第四范式 多值依赖于主键...
活着就好20241103
🌞 早晨问候:亲爱的朋友们,大家早上好!今天是2024年11月3日,第44周的第七天,也是本周的最后一天,农历甲辰[龙]年十月初三。在这金秋十一月的第三天,愿清晨的第一缕阳光如同活力的源泉…...
《华为工作法》读书摘记
无论做什么事情,首先要明确的就是做事的目标。目标是引导行动的关键,也是证明行动所具备的价值的前提,所以目标管理成了企业与个人管理的重要组成部分。 很多时候,勤奋、努力并不意味着就一定能把工作做好,也并不意味…...
【Unity基础】初识UI Toolkit - 运行时UI
Unity中的UI工具包(UI Toolkit)不但可以用于创建编辑器UI,同样可以来创建运行时UI。 关于Unity中的UI系统以及使用UI工具包创建编辑器UI可以参见: 1. Unity中的UI系统 2. 初识UI Toolkit - 编辑器UI 本文将通过一个简单示例来…...
20.体育馆使用预约系统(基于springboot和vue的Java项目)
目录 1.系统的受众说明 2.开发环境与技术 2.1 Java语言 2.2 MYSQL数据库 2.3 IDEA开发工具 2.4 Spring Boot框架 3.需求分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 系统流程分析 3.3 系统性能需求 3.4 系统功能需求 4.系…...
unity3d————三角函数练习题
先上代码: public class SinCos : MonoBehaviour {public float moveSpeed 10f; //前进的速度public float changValue 5f; //左右的速度public float changeSize 5f; //左右的幅度float time 0;void Update(){this.transform.Translate(Vector3.forwa…...
如何在Linux系统中使用Git进行版本控制
如何在Linux系统中使用Git进行版本控制 Git简介 安装Git 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 初始化Git仓库 配置全局用户信息 基本的Git命令 添加文件到暂存区 查看状态 提交更改 查看提交历史 工作流 分支管理 切换分支 合并分支 远程仓库 添加远程仓库 推…...
Ubuntu编译linux内核指南(适用阿里云、腾讯云等远程服务器;包括添加Android支持)
在 Ubuntu 上编译内核的步骤如下: 1、安装必要的依赖包: 这里和你chatgpt的略有不同 sudo apt-get update sudo apt-get install build-essential libncurses-dev bison flex libssl-dev libelf-dev dwarves 后续如果遇到“FAILED: load BTF from vmlinux: Invalid argum…...
[MySQL]DQL语句(一)
查询语句是数据库操作中最为重要的一系列语法。查询关键字有 select、where、group、having、order by、imit。其中imit是MySQL的方言,只在MySQL适用。 数据库查询又分单表查询和多表查询,这里讲一下单表查询。 基础查询 # 查询指定列 SELECT * FROM …...
GPT原理;ChatGPT 等类似的问答系统工作流程如下;当用户向 ChatGPT 输入一个问题后:举例说明;ChatGPT不是通过索引搜索的传统知识库
目录 GPT原理 GPT架构 GPT 主要基于 Transformer 的解码器部分 ChatGPT 等类似的问答系统工作流程如下: 用户输入 文本预处理 模型处理 答案生成 输出回答 当用户向 ChatGPT 输入一个问题后:举例说明 文本预处理: ChatGPT不是通过索引搜索的传统知识库 GPT GPT…...
目前最新最好用 NET 混淆工具 .NET Reactor V6.9.8
目前最新最好用 NET 混淆工具 .NET Reactor V6.9.8 1、.NET Reactor V6.9.8 功能简介2、官方下载 1、.NET Reactor V6.9.8 功能简介 业界领先的源代码保护 .NET Reactor通过多种方法来防止反编译,这些方法会将 .NET 程序集转换为任何现有工具都无法反编译的进程。…...
计算布尔二叉树的值
给你一棵 完整二叉树 的根节点,这棵树有以下特征: 叶子节点 要么值为 0 要么值为 1 ,其中 0 表示 False ,1 表示 True 。非叶子节点 要么值为 2 要么值为 3 ,其中 2 表示逻辑或 OR ,3 表示逻辑与 AND 。 …...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
鸿蒙Navigation路由导航-基本使用介绍
1. Navigation介绍 Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(Nav…...
【Redis】Redis从入门到实战:全面指南
Redis从入门到实战:全面指南 一、Redis简介 Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,它可以用作数据库、缓存和消息代理。由Salvatore Sanfilippo于2009年开发,因其高性能、丰富的数据结构和广泛的语言支持而广受欢迎。 Redis核心特点:…...
