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

CodeQL学习笔记(5)-CodeQL for Java(AST、元数据、调用图)

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


为了更好的阅读体验,请访问个人博客

CodeQL学习笔记(1)

CodeQL学习笔记(2)

CodeQL学习笔记(3)

CodeQL学习笔记(4)


2. AST节点

AST中节点的成分,主要两类:

  • Stmt:语句(Statement)
  • Expr:表达式(Expression)

这两个类中也提供了一些成员谓词:

  • Expr.getAChildExpr 返回一个当前表达式的子表达式
  • Stmt.getAChild 返回直接嵌套在给定语句中的语句或者表达式
  • Expr.getParent and Stmt.getParent 返回一个AST节点的父节点

返回return stmt中的表达式:

import java
from Expr e
where e.getParent() instanceof ReturnStmt
select e

返回If stmt中的表达式:

import javafrom Stmt s
where s.getParent() instanceof IfStmt
select s

这样会将if语句的then和else都找到。

返回所有方法体中的语句:

import java
from Stmt s
where s.getParent() instanceof Method
select s

Method-Stmt-Expr

CodeQL提供了两个类:ExprParent 和 StmtExpr

来表示Expr和Stmt的父节点

3. 元数据

这里主要介绍针对Java中的Annotion注释

包、引用类型、字段、方法、构造函数和局部变量声明 具有超类 Annotatable,因此他们都具有getAnAnnotation方法

import javafrom Constructor c
select c.getAnAnnotation()

以上例子能够找到所有结构体的注释(抑制警告或将代码标记为已弃用的示例)

例如下面这个例子,能找到所有注释为@Deprecated的构造函数

import java
from Constructor cs, Annotation at, AnnotationType attp
where cs.getAnAnnotation() = at andat.getType() = attp andattp.hasQualifiedName("java.lang", "Deprecated")
select at

4. 指标

在前期学习中不涉及

5. 调用图

用来表示函数或构造函数的调用关系。

Callable表示可以被调用的代码单元,包括方法(函数)和构造函数。

Call表示一次调用的表达式。比如一次方法调用a.foo()、new 表达式new MyClass(),以及通过 this 或 super 的显式构造函数调用。

通过Call.getCallee()谓词找到某个调用表达式所调用的方法或构造函数。如果我们想找出所有对方法 println 的调用,可以编写如下查询:

import javafrom Call c, Method m
where m = c.getCallee() andm.hasName("println")
select c
  • Call c 表示一个调用表达式,Method m 表示一个方法。
  • c.getCallee() 获取调用表达式 c 所调用的方法或构造函数,这里我们用 m = c.getCallee() 来确保该调用表达式的目标是方法
  • m.hasName(“println”) 用于过滤出名字为 println 的方法。

这个查询的输出结果就是程序中所有调用 println 方法的地方。

此外,还可以通过Callable.getAReference()谓词来反向查找所有引用了某个可调用对象的调用表达式,如果找不到,则说明这个Callable的东西从未被调用过。如下ql查询就能找到所有未被调用的方法或构造函数

import javafrom Callable c
where not exists(c.getAReference())
select c
http://www.lryc.cn/news/477833.html

相关文章:

  • 服装品牌零售业态融合中的创新发展:以开源 AI 智能名片 S2B2C 商城小程序为视角
  • 前端将网页转换为pdf并支持下载与上传
  • Android 依赖统一配置管理(Version Catalogs)
  • 如何为数据看板产品接入实时行情接口并展示行情
  • 数据结构 C/C++(实验一:线性表)
  • 使用WebStorm开发Vue3项目
  • Linux高阶——1103——Signal信号机制
  • 如何编写STM32的定时器程序
  • 【C++】C++的单例模式、跟踪内存分配的简单方法
  • 构建一个导航栏web
  • 【Linux】Linux安全与密钥登录指南
  • 数据采集之scrapy框架
  • ReactPress—基于React的免费开源博客CMS内容管理系统
  • Android 解决飞行模式下功耗高,起伏波动大的问题
  • 2024第三次随堂测验参考答案
  • 期权交易策略 v0.1
  • pytorch学习:矩阵分解:奇异值分解(SVD分解)
  • 接口测试用例设计的关键步骤与技巧解析!
  • CSS画icon图标系列(一)
  • 【数据结构-合法括号字符串】【华为笔试题】力扣1190. 反转每对括号间的子串
  • qt QFileInfo详解
  • 金华迪加 现场大屏互动系统 mobile.do.php 任意文件上传漏洞复现
  • 探寻5G工业网关市场,5G工业网关品牌解析
  • RK3568开发板静态IP地址配置
  • element-plus table tableRowClassName 无效
  • 商务英语学习柯桥学外语到泓畅-老外说“go easy on me”是什么意思?
  • 【Python爬虫基础】基于 Python 的反爬虫机制详解与代码实现
  • HTB:PermX[WriteUP]
  • uniapp 整合 OpenLayers - 使用modify修改要素
  • JMeter快速造数之数据导入导出