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 OneTwoThreeLib

from 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开始,而不是0

from 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() }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/904695.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT-使用QSS美化UI界面

一、QSS简介&#xff1a; Qt Style Sheet&#xff1a;Qt样式表&#xff0c;用来自定义控件外观的一种机制&#xff0c;可以把他类比成CSS&#xff08;CSS主要功能与最终目的都是能使界面的表现与界面的元素分离&#xff09;。QSS机制使应用程序也能像web界面那样随意地改变外观…

江协科技STM32学习- P23 DMA 直接存储器存取

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

Adb命令大全

本文列举了几乎所有的adb命令&#xff0c;方便Android学习者或者开发工程师在日常学习开发过程中查询使用。建议收藏。 Adb Server adb kill-server adb start-server 重启 adb reboot adb reboot recovery adb reboot-bootloader adb root //restarts adb with root permis…

信息安全保障人员CISAW认证有哪些级别和方向?

在信息安全领域&#xff0c;CISAW认证已经成为了一个重要的资格认证标准。 它不仅代表了专业技术水平的认可&#xff0c;也是进入该领域工作和发展的重要凭证。 对于有志于从事信息安全相关工作的人员来说&#xff0c;了解其报考条件是迈向成功的第一步。 CISAW认证体系涵盖…

微信小程序中点击搜素按钮没有反应,可能是样式问题(按钮被其他元素覆盖或遮挡)

文章目录 1. 确认 bindtap 绑定在正确的元素上2. 检查是否有遮挡或重叠元素3. 检查 this 上下文绑定问题4. 清除微信小程序开发者工具的缓存5. 用微信开发者工具查看事件绑定6. 确保 handleSearch 没有拼写错误进一步调试 1、searchResults.wxml2、searchResults.wxss3、search…

Git获取本地仓库和常用指令

一、获取本地仓库 1&#xff09;在电脑的任意位置创建一个空目录&#xff08;例如test01&#xff09;作为我们的本地Git仓库 2&#xff09;进入这个目录中&#xff0c;点击右键打开Git bash窗口 3&#xff09;执行命令git init&#xff08;初始化当前目录为一个git仓库&…

两个好用的GIF制作软件,轻松制作动图表情包

分享2个好用的GIF制作软件&#xff0c;支持GIF录制、视频转GIF、图片合成GIF&#xff0c;可以满足绝大部分的GIF制作需求&#xff01; 1、ScreenToGif&#xff1a;GIF录制/视频转GIF 一款特别好用的GIF录制和编辑工具&#xff0c;界面简单易用。安装后一打开就能看到它的四大…

RN安卓应用打包指南

React Native&#xff08;简称RN&#xff09;是一个用于开发跨平台移动应用的开源框架&#xff0c;它允许你使用JavaScript和React来构建在iOS和Android上运行的应用。要将React Native项目打包成安卓应用&#xff08;APK&#xff09;&#xff0c;可以按照以下步骤进行&#xf…

【生物学&水族馆】金鱼成体幼苗检测活体识别系统源码&数据集全套:改进yolo11-Parc

改进yolo11-DynamicHGNetV2等200全套创新点大全&#xff1a;金鱼成体幼苗检测活体识别系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.30 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展…

【商汤科技-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

node和npm版本冲突

问题描述&#xff1a; 解决办法&#xff1a; 一、 查看自己当前的node和npm版本 node -v npm -v 二、 登录node官网地址 node官网地址 https://nodejs.org/zh-cn/about/previous-releases 查看与自己node版本兼容的是哪一版本的npm,相对应进行更新即可。 三 升级node 下载最…

python 爬虫 入门 五、抓取图片、视频

目录 一、图片、音频 二、下载视频&#xff1a; 一、图片、音频 抓取图片的手法在上一篇python 爬虫 入门 四、线程&#xff0c;进程&#xff0c;协程-CSDN博客里面其实有&#xff0c;就是文章中的图片部分&#xff0c;在那一篇文章&#xff0c;初始代码的28&#xff0c;29行…

服务器的免密登录和文件传输

在天文学研究中&#xff0c;通常会采用ssh登录服务器&#xff0c;把复杂的计算交给服务器&#xff0c;但是如果你没有进行额外的配置&#xff0c;那么登录服务器&#xff0c;以及和服务器进行文件传输&#xff0c;每次都要输入账号和密码&#xff0c;比较不方便&#xff0c;Win…

前端八股文第二篇

11.事件循环 事件循环&#xff08;Event Loop&#xff09;是 JavaScript 运行时中的一种机制&#xff0c;用于处理异步操作和事件驱动的编程。在浏览器环境中&#xff0c;事件循环是指浏览器通过事件队列&#xff08;Event Queue&#xff09;来管理和调度异步任务的执行顺序。…

VBox增强功能、VBoxLinuxAdditions安装、共享文件夹问题解决

VBox增强功能、VBoxLinuxAdditions安装、共享文件夹问题解决 文章目录 VBox增强功能、VBoxLinuxAdditions安装、共享文件夹问题解决1.VBoxLinuxAdditions.run&#xff1a;找不到命令解决方案 2.可以看到共享文件夹。但是不能看到里面的内容。解决方案 参考 共享文件夹设置&…

【计算机网络 - 基础问题】每日 3 题(五十八)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

AT系列之74HC595级联数码管

记录我学习例程,学习用做企业级的使用的逻辑,欢迎讨论指正。 首先了解AT系列芯片原理,32位单片机,模仿stm32各个系列的,我这边学习使用AT32F421系列的芯片。其实系统学过stm32都可很快上手。下面这个是雅特力官方网址,各种资料都可以免费下载学习。 雅特力科技 : 32位微…

算法:排序

排序算法 1. 简单排序1.1 直接插入排序1.2 冒泡排序1.3 简单选择排序 2. 希尔排序3. 快速排序4. 堆排序5. 归并排序 将文件的内容按照某种规则进行排列。 排序算法的稳定判定&#xff1a;若在待排序的一个序列中&#xff0c; R i R_i Ri​和 R j R_j Rj​的关键码相同&#xf…

docker部署手册(离线)

文章目录 一、下载地址二、部署环境三、安装部署3.1 上传安装包3.2 解压3.3 创建docker.service3.4 创建daemon.json 文件3.5 授权3.6 启动3.7 查看信息3.8 设置开机启动3.9 允许远程连接到docker方法一&#xff1a;修改docker.service方法二&#xff1a;修改daemon.json 3.10 …

OpenWRT旁路由应该怎么设置?每一步都给你指出来!

前言 小白最近家里的网络出了问题&#xff0c;于是折腾了好多次路由器&#xff08;软路由系统重装&#xff09;&#xff0c;这样直接就影响到其他小伙伴的网络了。 为了不影响其他小伙伴赚钱&#xff0c;小白就想着在软路由&#xff08;主路由系统&#xff09;旁边再加个软路…