Я использую инфраструктуру манипулирования байт-кодом 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
}
}
Однако этот код вызывается независимо от объекта, которому принадлежит поле. Я хотел бы найти более конкретный случай, когда операция PUTFIELD выполняется на объекте this
. Например, я хочу различать первый фрагмент кода и такой код:
public MyObject createNewObjectWithDifferentField() {
MyObject newObject = new MyObject();
newObject.value = 43;
return newObject;
}
В приведенном выше случае операция PUTFIELD все еще выполняется, но здесь она выполняется с локальной переменной (newObject
), а не с объектом this
. Это будет зависеть от состояния стека во время назначения, но я столкнулся с несколькими различными сценариями, в которых байт-код полностью отличается, и я ищу способы справиться с этой сложностью.
Как проверить, что PUTFIELD переназначает поле, принадлежащее this
объекту?
Редактировать
Я использую ASM только для анализа, а не для инструментирования существующего байт-кода. Предпочтительно я хотел бы найти способ обнаружить это, не изменяя байт-код, если это возможно.