【发布时间】:2010-08-28 15:58:40
【问题描述】:
我正在使用ASM 字节码操作框架对Java 代码执行静态分析。我希望检测何时重新分配对象的字段,即何时发生这种代码:
class MyObject {
private int value;
void setValue(int newValue) { this.value = newValue; }
}
使用以下代码(在实现ClassVisitor的类中)可以检测到上述情况:
@Override
public void visitFieldInsn(int opcode, String owner, String name, String desc) {
if(opcode == Opcodes.PUTFIELD) {
// do whatever here
}
}
但是,无论拥有该字段的对象如何,都会调用此代码。我想找到更具体的情况,在 this 对象上执行 PUTFIELD 操作。比如我想区分第一个代码sn -p,和这样的代码:
public MyObject createNewObjectWithDifferentField() {
MyObject newObject = new MyObject();
newObject.value = 43;
return newObject;
}
在上述情况下,仍然执行 PUTFIELD 操作,但这里它是在一个局部变量 (newObject) 上而不是 this 对象上。这将取决于分配时堆栈的状态,但我遇到了一些字节码完全不同的不同场景,我正在寻找处理这种复杂性的方法。
如何检查 PUTFIELD 是否正在重新分配属于 this 对象的字段?
编辑
我使用 ASM 仅执行分析,而不是检测现有字节码。如果可能的话,最好我想找到一种在不改变字节码的情况下发现这一点的方法。
【问题讨论】:
-
在没有内部类的非混淆标准 Java 代码中,
this.x将始终编译为aload_0 ... putfield。您甚至不需要跟踪变量。如果您担心任意代码,那么这是一个无法确定的问题。
标签: java static-analysis bytecode bytecode-manipulation java-bytecode-asm