当前位置: 首页 > news >正文

CodeQL学习笔记(3)-QL语法(模块、变量、表达式、公式和注解)

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

CodeQL学习笔记(1)

CodeQL学习笔记(2)


模块

模块类似于“包”的概念,可以把一定的内容进行封装,提供了一种组织QL代码的方法,避免代码重复。

image-20241029105704719

模块一般可以包含如下六大结构:

  • 导入语句
  • 谓词
  • 类型(包括用户定义的类)
  • 别名
  • 显式模块
  • 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&#xff0c;对于CodeQL就不介绍了&#xff0c;目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记&#xff0c;根据个人知识库笔记修改整理而来的&#xff0c;分享出来共同学习。个人觉得QL的语法比较反人类&#xff0c;至少与目前主流的这些OOP语言相比&…...

代码随想录训练营Day11 | 226.翻转二叉树 - 101. 对称二叉树 - 104.二叉树的最大深度 - 111.二叉树的最小深度

226.翻转二叉树 题目链接&#xff1a;226.翻转二叉树思路&#xff1a;遍历二叉树&#xff0c;遍历的时候交换左右节点即可代码&#xff1a; TreeNode* invertTree(TreeNode* root) {reverse(root);return root;}// 迭代法&#xff0c;层序遍历void f2(TreeNode* root) {queue…...

“死鱼眼”,不存在的,一个提词小技巧,拯救的眼神——将内容说给用户,而非读给用户!

视频录制时&#xff0c;死鱼眼问题常见 即便内容再好&#xff0c;眼神死板也会减分 痛点真痛&#xff1a;拍视频时容易紧张 面对镜头&#xff0c;许多人难免紧张 神情僵硬&#xff0c;眼神无光&#xff0c;甚至忘词 这不仅影响表现&#xff0c;还让人难以专注 忘我场景&#x…...

深度学习在复杂系统中的应用

引言 复杂系统由多个相互作用的组成部分构成&#xff0c;这些部分之间的关系往往是非线性的&#xff0c;整体行为难以通过简单的线性组合来预测。这类系统广泛存在于生态学、气象学、经济学和社会科学等多个领域&#xff0c;具有动态演变、自组织、涌现现象以及多尺度与异质性…...

vue3图片懒加载

背景 界面很长&#xff0c;屏幕不能一下装下所有内容&#xff0c;如果以进入首页就把所有内容都加载完的话所需时间较长&#xff0c;会影响用户体验&#xff0c;所以可以当用户浏览到时再去加载。 代码 新建index.ts文件 src下新建directives文件夹&#xff0c;并新建Index…...

总结一些高级的SQL技巧

1. 窗口函数 窗函数允许在查询结果的每一行上进行计算&#xff0c;而不需要将数据分组。这使得我们可以计算累积总和、排名等。 SELECT employee_id,salary,RANK() OVER (ORDER BY salary DESC) AS salary_rank FROM employees;2. 公用表表达式 (CTE) CTE 提供了一种更清晰的…...

无人机飞手考证热,装调检修技术详解

随着无人机技术的飞速发展和广泛应用&#xff0c;无人机飞手考证热正在持续升温。无人机飞手不仅需要掌握飞行技能&#xff0c;还需要具备装调检修技术&#xff0c;以确保无人机的安全、稳定和高效运行。以下是对无人机飞手考证及装调检修技术的详细解析&#xff1a; 一、无人机…...

AI资讯快报(2024.10.27-11.01)

1.<国家超级计算济南中心发布系列大模型> 10月28日&#xff0c;以“人才引领创新 开放赋能发展”为主题的第三届山东人才创新发展大会暨第十三届“海洽会”集中展示大会在山东济南举行。本次大会发布了国家超级计算济南中心大模型&#xff0c;包括“智匠工业大模型、知风…...

范式的简单理解

第二范式 消除非键属性对键的部分依赖 第三范式 消除一个非键属性对另一个非键属性的依赖 表中的每个非键属性都应该依赖于键&#xff0c;整个键&#xff0c;而且只有键&#xff08;键可能为两个属性&#xff09; 第四范式 多值依赖于主键...

活着就好20241103

&#x1f31e; 早晨问候&#xff1a;亲爱的朋友们&#xff0c;大家早上好&#xff01;今天是2024年11月3日&#xff0c;第44周的第七天&#xff0c;也是本周的最后一天&#xff0c;农历甲辰[龙]年十月初三。在这金秋十一月的第三天&#xff0c;愿清晨的第一缕阳光如同活力的源泉…...

《华为工作法》读书摘记

无论做什么事情&#xff0c;首先要明确的就是做事的目标。目标是引导行动的关键&#xff0c;也是证明行动所具备的价值的前提&#xff0c;所以目标管理成了企业与个人管理的重要组成部分。 很多时候&#xff0c;勤奋、努力并不意味着就一定能把工作做好&#xff0c;也并不意味…...

【Unity基础】初识UI Toolkit - 运行时UI

Unity中的UI工具包&#xff08;UI Toolkit&#xff09;不但可以用于创建编辑器UI&#xff0c;同样可以来创建运行时UI。 关于Unity中的UI系统以及使用UI工具包创建编辑器UI可以参见&#xff1a; 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————三角函数练习题

先上代码&#xff1a; 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的方言&#xff0c;只在MySQL适用。 数据库查询又分单表查询和多表查询&#xff0c;这里讲一下单表查询。 基础查询 # 查询指定列 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通过多种方法来防止反编译&#xff0c;这些方法会将 .NET 程序集转换为任何现有工具都无法反编译的进程。…...

计算布尔二叉树的值

给你一棵 完整二叉树 的根节点&#xff0c;这棵树有以下特征&#xff1a; 叶子节点 要么值为 0 要么值为 1 &#xff0c;其中 0 表示 False &#xff0c;1 表示 True 。非叶子节点 要么值为 2 要么值为 3 &#xff0c;其中 2 表示逻辑或 OR &#xff0c;3 表示逻辑与 AND 。 …...

软件评测机构如何保障质量?检测资质、技术实力缺一不可

软件评测机构在保障软件质量上起着关键作用&#xff0c;对软件行业的健康发展极为关键。它们采用专业的技术手段和严格的评估流程&#xff0c;对软件的运行效果、功能等多方面进行细致的审查&#xff0c;为开发者和使用者提供了客观、公正的参考依据。 检测资质正规软件评测机…...

GoldenDB管理节点zk部署

目录 1、准备阶段 1.1、部署规划 1.2、硬件准备 1.3、软件准备 1.4、网络端口开通 1.5、环境清理 2、实施阶段 2.1、操作系统配置 2.1.1、主机名修改 2.1.2、修改hosts文件 2.1.3、禁用防火墙 2.1.4、禁用selinux 2.1.5、禁用透明大页 2.1.6、资源限制调整 2.1.…...

Kafka 客户端连接机制的一个典型陷阱

这是 Kafka 客户端连接机制的一个典型陷阱&#xff0c;你遇到的现象可以通过 Kafka bootstrap server 的连接策略和 broker 的 advertised.listeners 配置来精确解释。 &#x1f3af; 问题描述简化 ✅ 使用顺序为&#xff1a; 192.168.22.22:9092,192.168.22.23:9092,172.21.16…...

源的企业级网络安全检测工具Prism X(棱镜X)

Prism X&#xff08;棱镜X&#xff09;是由yqcs团队自主研发的开源网络安全检测解决方案&#xff0c;专注于企业级风险自动化识别与漏洞智能探测。该工具采用轻量化架构与跨平台设计&#xff0c;全面兼容Windows、Linux及macOS操作系统&#xff0c;集成资产发现、指纹鉴别、弱口…...

Webhook入门

主要参考资料&#xff1a; 深入解析 Webhook&#xff1a;从原理到实践的全面指南: https://blog.csdn.net/weixin_43114209/article/details/144250750 目录 简介Webhook 与传统 API 调用的区别与轮询 (Polling) 的对比典型工作流程 简介 简单来说&#xff0c;Webhook 是一种“…...

MyBatis 动态 SQL 详解:灵活构建强大查询

MyBatis 的动态 SQL 功能是其最强大的特性之一&#xff0c;它允许开发者根据不同条件动态生成 SQL 语句&#xff0c;极大地提高了 SQL 的灵活性和复用性。本文将深入探讨 MyBatis 的动态 SQL 功能&#xff0c;包括 OGNL 表达式的使用以及各种动态 SQL 元素&#xff08;如 if、c…...

联想小新笔记本电脑静电问题导致无法开机/充电的解决方案

一、问题背景 近期部分用户反馈联想小新系列笔记本电脑在特定环境下&#xff08;如秋冬干燥季节&#xff09;出现无法开机或充电的问题。经分析&#xff0c;此类现象多由静电积累触发主板保护机制导致&#xff0c;少数情况可能与电源适配器、电池老化或环境因素相关。本文将从技…...

基于NetWork的类FNAF游戏DEMO框架

脑洞大开 想做个fnaf1并加入自己的设计.. 开干!!!! #include <stdio.h> #include <iostream> #include <random> #include <ctime>bool leftdoor true, rightdoor true, camddoor true; float power 900,fanusepower 0;typedef struct movement…...

LiveWallpaperMacOS:让你的 Mac 桌面动起来

随着桌面美化需求的不断提升,用户对于桌面壁纸的要求已经不再局限于静态图片。越来越多的 Mac 用户希望桌面能像 Windows 一样,拥有动态壁纸,展现个性、提升体验。LiveWallpaperMacOS 正是这样一款让你的 Mac 桌面焕发活力的开源项目。 本文将详细介绍 LiveWallpaperMacOS …...

07-后端Web实战(部门管理)

5. 修改部门 对于任何业务的修改功能来说&#xff0c;一般都会分为两步进行&#xff1a;查询回显、修改数据。 5.1 查询回显 5.1.1 需求 当我们点击 "编辑" 的时候&#xff0c;需要根据ID查询部门数据&#xff0c;然后用于页面回显展示。 5.1.2 接口描述 参照参照…...