Jimple
Jimple IR
like Java, but simple -> Jimple
Jimple是Soot采用的中间表示形式IR,Soot是在IR的基础上进行程序分析的。
JVM字节码是基于栈的语言,不能直观地知道其操作码的意图,而模拟栈的执行相对困难;而Java源代码有着嵌套的结构,也不适合做程序分析。
Jimple IR 作为一种带类型的三地址码(typed 3 Address Code)结合了两者的优点:
局部变量,无栈操作,可读性比字节码强
this和形参有特殊的变量表示
只有简单语句,平坦结构非嵌套
三地址码:左边最多一个引用,右边最多两个引用
更多参考:sable-thesis.pdf (washington.edu)
Jimple中签名(Signature)用于全局唯一表示一个类/方法/字段,在Soot中分别由SootClass、SootMethod、SootField表示,对应的签名分别为ClassType、MethodSignature、FieldSignature
Jimple Stmt
Branching Stmts
模拟语句间的条件/无条件跳转,CFG中有多个后继节点

JGotoStmt
无条件跳转到目标语句
第8行和第12行的goto语句都是JGotoStmt的实例
JIfStmt
第一个后继节点为紧跟着的语句(条件为真),第二个后继节点为分支语句(条件为假)
打印得到:
getCondition获取条件表达式
getTargetStmts即为goto后面跟着的标签指向的语句。
JSwitchStmt
getValues:case语句匹配的值(List<IntConstant>)
getKey:switch语句要匹配的目标(Immediate)
FallsThrough Stmts
这些语句只有一个后继节点

JInvokeStmt
转换控制流到另一个方法直到方法调用返回。
virtualinvoke、specialinvoke等
JAssignStmt
rhs(right hand-side)赋值给lhs(left hand-side)
lhs可以是变量、字段、数组的引用(LValue)
rhs可以是表达式(Expr)、变量(Local)、引用(Ref)、常量(Constant)(Value)


getLeftOp和getRightOp用于获取lhs和rhs
JIdentityStmt
类似JAssignStmt,但是是处理一些隐式赋值
JParameterRef将形参赋值给变量,@parameter0: int表示第一个形参,类型为intJCaughtExceptionRef将异常赋值给变量,如@caughtexception: java.lang.NullpointerExceptionJThisRef将this赋值给变量
JEnterMonitorStmt & JExitMonitorStmt
标记synchronized代码块的入口和出口
Other Stmts
JReturnStmt & JReturnVoidStmt
结束当前方法的控制流并返回一个值给调用者
JReturnStmt:return xxx;
JReturnVoidStmt:return;
JThrowStmt
如果抛出的异常没有被Trap捕捉,结束当前方法的执行,并跳转到异常处理器。
throw xxx;
Good Tip
很多SootUp的API都会返回Stmt接口,可以利用instanceof来判断它的子类
但这会造成大量的if-else语句,总归不太优雅。
因此SootUp提供了另一种处理方式,实现一个AbstractStmtVisitor子类
Jimple Values
Immediate
立即数,包括Local(变量)和Constant(常量)
Local
Local是作用域在当前方法中的变量,可以通过JIdentityStmt或JAssignStmt将Value赋值给Local
Constant
表示实际的值,如一个具体的数字或字符串
常量通常赋值给Local或Ref(即lhs可能的情况)
Expr
表达式是一种能够被计算并返回值的语言结构
AbstracBinopExpr二元表达式AbstracUnopExpr一元表达式AbstractInvokeExpr调用表达式

Ref
JArrayRef
数组索引来引用
JFieldRef
对SootField的引用
JStaticFieldRef:静态字段JInstanceFieldRef:实例字段
IdentityRef
用于隐式赋值(JIdentityStmt)的引用
JThisRefJCaughtExceptionRefJParameterRef
Good Tip
和Stmts类似,很多SootUp的API返回Value接口,可以利用instanceof判断它的子类
也可以实现一个AbstractValueVisitor的子类
如果只需要处理Value的子集,也可以考虑实现ImmediateVisitor、ConstantVisitor、ExprVisitor、RefVisitor
Jimple Type
PrimaryType
BooleanTypeByteTypeCharTypeShortTypeIntTypeLongTypeDoubleTypeFloatType
ReferenceType
(Java)ClassTypeArrayTypeNullType
VoidType
VoidType
Jimple Trap
Trap是用于模拟异常流的机制(try-catch-finally结构)
其定义了捕捉的异常类型、捕捉的范围(from-to)、以及处理异常的代码(handler)
调用Body#getTraps可获取
Last updated
Was this helpful?