语句
| Statement syntax | CodeQL class | Superclasses |
|---|---|---|
| ; | EmptyStmt | |
| Expr; | ExprStmt | |
| {Stmt…} | BlockStmt | |
| if(Expr)StmtelseStmt | IfStmt | ConditionalStmt |
| if(Expr)Stmt | ||
| while(Expr)Stmt | WhileStmt | ConditionalStmt, LoopStmt |
| do Stmt while(Expr) | DoStmt | ConditionalStmt, LoopStmt |
| for(Expr;Expr;Expr)Stmt | ForStmt | ConditionalStmt, LoopStmt |
| for(VarAccess:Expr)Stmt | EnhancedForStmt | LoopStmt |
| switch(Expr){SwitchCase…} | SwitchStmt | |
| try{Stmt…}finally{Stmt…} | TryStmt | |
| return Expr; | ReturnStmt | |
| return; | ||
| throw Expr; | ThrowStmt | |
| break; | BreakStmt | JumpStmt |
| breaklabel; | ||
| continue; | ContinueStmt | JumpStmt |
| continuelabel; | ||
| label:Stmt | LabeledStmt | |
| synchronized(Expr)Stmt | SynchronizedStmt | |
| assert Expr:Expr; | AssertStmt | |
| assert Expr ; |
||
| TypeAccess name; | LocalVariableDeclStmt | |
| classname{Member…}; | LocalClassDeclStmt | |
| this(Expr,…); | ThisConstructorInvocationStmt | |
| super(Expr,…); | SuperConstructorInvocationStmt | |
| catch(TypeAccess name){Stmt…} | CatchClause | |
| caseLiteral :Stmt… | ConstCase | |
| default:Stmt… | DefaultCase |
return语句
获取return x; 中的x
from ReturnStmt returnStmt, Expr xwherex = returnStmt.getResult()select x
表达式
一元表达式
所有的一元表达式均可以使用getExpr() 谓词来获取操作的表达式,如下为所有的一元表达式,全部继承了UnaryExpr类的getExpr谓词。
| Expression syntax | CodeQL class | Superclasses | Remarks |
|---|---|---|---|
| Expr++ | PostIncExpr | UnaryAssignExpr | |
| Expr— | PostDecExpr | UnaryAssignExpr | |
| ++Expr | PreIncExpr | UnaryAssignExpr | |
| —Expr | PreDecExpr | UnaryAssignExpr | |
| ~Expr | BitNotExpr | BitwiseExpr | see below for other subclasses of BitwiseExpr |
| -Expr | MinusExpr | ||
| +Expr | PlusExpr | ||
| LogNotExpr | LogicExpr | see below for other subclasses of LogicExpr |
获取x++中的x
from PostIncExpr postIncExpr,Expr xwherex = postIncExpr.getExpr()select x
获取++x中的x
from PreIncExpr preIncExpr,Expr xwherex = preIncExpr.getExpr()select x
二元表达式
二元表达式全部继承自BinaryExpr类,可以使用getLeftOperand()来获取操作符左侧的表达式,使用getRightOperand()来获取操作符右侧的表达式,
| Expression syntax | CodeQL class | Superclasses |
|---|---|---|
| Expr*Expr | MulExpr | |
| Expr/Expr | DivExpr | |
| Expr%Expr | RemExpr | |
| Expr+Expr | AddExpr | |
| Expr-Expr | SubExpr | |
| Expr<<Expr | LShiftExpr | |
| Expr>>Expr | RShiftExpr | |
| Expr>>>Expr | URShiftExpr | |
| Expr&&Expr | AndLogicalExpr | LogicExpr |
| Expr||Expr | OrLogicalExpr | LogicExpr |
| Expr<Expr | LTExpr | ComparisonExpr |
| Expr>Expr | GTExpr | ComparisonExpr |
| Expr<=Expr | LEExpr | ComparisonExpr |
| Expr>=Expr | GEExpr | ComparisonExpr |
| Expr==Expr | EQExpr | EqualityTest |
| Expr!=Expr | NEExpr | EqualityTest |
| Expr&Expr | AndBitwiseExpr | BitwiseExpr |
| Expr|Expr | OrBitwiseExpr | BitwiseExpr |
| Expr^Expr | XorBitwiseExpr | BitwiseExpr |
获取x+y中的x和y
from AddExpr addExpr,Expr x, Expr ywherex = addExpr.getLeftOperand() andy = addExpr.getRightOperand()select x,y
赋值表达式
赋值表达式全部继承自Assignment类,可以使用getDest()来获取操作符左边的表达式,使用getRhs()来获取右边的表达式。
| Expression syntax | CodeQL class | Superclasses |
|---|---|---|
| Expr=Expr | AssignExpr | |
| Expr+=Expr | AssignAddExpr | AssignOp |
| Expr-=Expr | AssignSubExpr | AssignOp |
| Expr*=Expr | AssignMulExpr | AssignOp |
| Expr/=Expr | AssignDivExpr | AssignOp |
| Expr%=Expr | AssignRemExpr | AssignOp |
| Expr&=Expr | AssignAndExpr | AssignOp |
| Expr|=Expr | AssignOrExpr | AssignOp |
| Expr^=Expr | AssignXorExpr | AssignOp |
| Expr<<=Expr | AssignLShiftExpr | AssignOp |
| Expr>>=Expr | AssignRShiftExpr | AssignOp |
| Expr>>>=Expr | AssignURShiftExpr | AssignOp |
获取 x = y 中的x和y
from AssignExpr assignExpr, Expr x, Expr ywherex = assignExpr.getDest() andy = assignExpr.getRhs()select x,y
变量访问
| Expression syntax examples | CodeQL class |
|---|---|
| x | VarAccess |
| e.f | |
访问 x.y 中的x和y
from VarAccess varAccess, Expr x, Expr ywherex = varAccess.getQualifier() andy = varAccess.Variable()select x,y
方法调用
| Expression syntax examples | CodeQL class |
|---|---|
| f(…) | MethodAccess |
| e.m(…) | |
获取e.m(p0..pn)中的e、m和p
from MethodAccess methodAccess, Expr e, Method m, Argument pwheree = methodAccess.getQualifier() andm = methodAccess.getMethod() andp = methodAccess.getAnArgument()select e,m,p
综合
Map类型
Map类型的数据
点击查看【processon】
示例
方法的返回值的Map类型,获取返回值所有的键
import javaimport semmle.code.java.Mapsfrom Variable mapVar, ReturnStmt returnStmt, MapPutCall mapPutCall, Expr mapVarKeywheremapVar.getAnAccess() = returnStmt.getResult() andmapVar.getType() instanceof MapType andmapVar.getAnAccess() = mapPutCall.getQualifier() andmapVarKey = mapPutCall.getKey()select returnStmt, mapVarKey
