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 。 …...
智能配置引擎如何攻克AMD黑苹果的三大技术壁垒
智能配置引擎如何攻克AMD黑苹果的三大技术壁垒 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在黑苹果领域,AMD平台曾被视为技术禁区&…...
别再只建桶了!华为云OBS的5个高阶配置,让你的存储成本直降30%
别再只建桶了!华为云OBS的5个高阶配置,让你的存储成本直降30% 当你的业务数据量突破TB级时,存储成本就会像野马一样失控。去年我们团队就经历过这样的教训——每月OBS账单突然暴涨40%,排查后发现是数百GB的过期日志仍按标准存储计…...
GLM-Image创新应用:基于算法的艺术风格探索
GLM-Image创新应用:基于算法的艺术风格探索 当AI算法遇见艺术创作,会碰撞出怎样的火花?GLM-Image正在重新定义数字艺术的可能性边界。 1. 引言:算法与艺术的完美融合 在数字艺术创作领域,传统工具往往需要艺术家具备深…...
终极免费方案:3分钟掌握ViGEmBus虚拟游戏手柄驱动的完整部署与应用
终极免费方案:3分钟掌握ViGEmBus虚拟游戏手柄驱动的完整部署与应用 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾为游戏不支持你的手柄…...
终极Flash浏览器使用指南:让经典Flash内容重获新生的3个秘诀
终极Flash浏览器使用指南:让经典Flash内容重获新生的3个秘诀 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 你是否还记得那些令人怀念的Flash游戏和互动课件?随着…...
[技术解析]BetterJoy:Switch手柄电脑适配的原理与实战指南
[技术解析]BetterJoy:Switch手柄电脑适配的原理与实战指南 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode.…...
乙巳马年·皇城大门春联生成终端W与低代码平台集成:在Dify中快速创建AI应用
乙巳马年皇城大门春联生成终端W与低代码平台集成:在Dify中快速创建AI应用 又到了岁末年初,很多朋友、商家甚至社区都在为准备春联发愁。传统方式要么自己写,要么找人设计,费时费力不说,风格还未必满意。现在ÿ…...
STEP3-VL-10B WebUI教程:自定义快捷提示词模板+一键插入常用指令
STEP3-VL-10B WebUI教程:自定义快捷提示词模板一键插入常用指令 你是不是每次用多模态AI模型时,都要重复输入那些固定的指令?比如“请详细描述这张图片”、“帮我分析这个图表的数据”、“用中文回答”……一遍又一遍地打字,不仅…...
实战指南:基于快马生成tomcat生产级配置,涵盖https、集群与性能调优
今天想和大家分享一个实战经验:如何在生产环境中配置Tomcat服务器。作为一个长期和Tomcat打交道的开发者,我深知生产环境配置和本地开发环境的巨大差异。最近在InsCode(快马)平台上实践了一套完整的配置方案,效果很不错,这里把关键…...
springboot-vue+nodejs的农产品扶贫助农系统的开发与实现
目录技术栈选择系统架构设计核心功能模块开发阶段划分关键代码示例(Spring Boot)前端组件示例(Vue)注意事项项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术栈选择 Spring Bo…...
