Basics
Program Elements
Types
下面是Type
的几个子类
PrimitiveType
: 表示Java中的原始类boolean
、byte
、char
、double
、float
、int
、long
、short
QL中把
void
和null
也作为原始类
RefType
: 表示引用类型(reference | non-primitive), 有如下子类Class
Interface
EnumType
Array
TopLevelType
: 表示声明在一个编译单元最上层的引用类型(不太懂。。。)NestedType
: 声明在另一个类型中的类型LocalClass
: 声明在一个方法或构造函数中的类AnonymousClass
: 匿名类
此外还有一些常用的类,顾名思义
TypeObject
、TypeCloneable
、TypeRuntime
、TypeSerializable
、TypeString
、TypeSystem
、TypeClass
examples:
查找所有double变量
查找所有直接继承自Object的内部类
Generics
GenericType
表示泛型,分为 GenericInterface
或 GenericClass
比如java.util.Map
这个接口
参数K
、V
用TypeVariable
表示
泛型的参数化实例(如Map<String, File>
)提供了一个具体类型(这里的String
、File
)来实例化类型参数,比
这里的参数化实例用ParameterizedType
表示
通过getSourceDeclaration
获取ParameterizedType
对应的GenericType
通常,泛型可能会限制类型参数可以绑定到哪些类型,比如下面限制了一个从String到Number的map
StringToNumberMap
的参数化实例只能是Number
或其子类
使用getATypeBound
和getType
来得到TypeVariable
类型绑定
RawType
用于处理泛型的原生类型,如下m1
examples:
查找
java.util.Map
的所有参数化实例
查找
java.util.Map
的原生类型
查找绑定到
java.lang.Object
的所有泛型的类型变量
Variables
Variable
表示Java中的变量
Field
LocalVariableDecl
Parameter
AST
抽象语法树中的节点
statement(
Stmt
)expression(
Expr
)Expr.getAChildExpr
返回子表达式Stmt.getAChild
返回语句的下一条语句Expr.getParent
、Stmt.getParent
返回父节点
返回跟在return语句后面的表达式
比如 return x+y
返回 x+y
返回所有if
语句的then
分支和else
分支
返回所有方法体
可见Expr
和Stmt
的父节点不一定是Expr
或Stmt
,可以使用ExprParent
或 StmtParent
表示Expr
和Stmt
可能的父节点
Metadata
元数据包括注解(annotation
)和文档(javadoc
)
对于packages, reference types, fields, methods, constructors, local variable declarations
这些都可以被注解,Annotatable
是其父类,getAnAnnotation
获取注解
寻找所有Callable
(包括Method
和Constructor
)的注解
寻找所有构造器中注解的@Deprecated
寻找私有字段的文档
Call graph
CodeQL根据Java代码生成的数据库包含了预计算的程序调用图
Callable
包括方法和构造器,Call
表示调用表达式(包括方法调用、new对象、用this
或super
的构造器调用)
下面找出println
的调用点
Callable.getAReference
返回Call
调用表达式的引用点
下面找出没被调用过的方法
Last updated