造作网站模版,做网站 微信开发前景,企业营销型网站案例,适合在线做笔试的网站最近在学习CodeQL#xff0c;对于CodeQL就不介绍了#xff0c;目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记#xff0c;根据个人知识库笔记修改整理而来的#xff0c;分享出来共同学习。个人觉得QL的语法比较反人类#xff0c;至少与目前主流的这些OOP语言相比对于CodeQL就不介绍了目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记根据个人知识库笔记修改整理而来的分享出来共同学习。个人觉得QL的语法比较反人类至少与目前主流的这些OOP语言相比还是有一定难度的。与现在网上的大多数所谓CodeQL教程不同本系列基于官方文档和情景实例包含大量的个人理解、思考和延伸直入主题只切要害几乎没有废话并且坚持用从每一个实例中学习总结归纳再到实例中验证。希望能给各位一点不一样的见解和思路。当然也正是如此必定会包含一定的错误希望各位大佬能在评论区留言指正。 为了更好的阅读体验请访问个人博客
CodeQL学习笔记(1)
CodeQL学习笔记(2)
CodeQL学习笔记(3)
CodeQL学习笔记(4) 2. AST节点
AST中节点的成分主要两类
Stmt语句StatementExpr表达式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 sMethod-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 at4. 指标
在前期学习中不涉及
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 cCall 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