抱歉,如果这是一个基本问题,但即使经过大量搜索,我也无法弄清楚。
我正在使用 SOOT 来检测我的代码。我能够检查我的语句是否使用访问字段,stmt.containsFieldRef()
但我想区分将值写入字段的语句和仅读取其值的语句。
是否有预定义的方法可以做到这一点,或者解析语句是唯一的选择?
抱歉,如果这是一个基本问题,但即使经过大量搜索,我也无法弄清楚。
我正在使用 SOOT 来检测我的代码。我能够检查我的语句是否使用访问字段,stmt.containsFieldRef()
但我想区分将值写入字段的语句和仅读取其值的语句。
是否有预定义的方法可以做到这一点,或者解析语句是唯一的选择?
我也遇到了这个问题,我终于自己弄清楚了。
try{
if (stmt.getDefBoxes().get(0).getValue().getClass() == Class.forName("soot.jimple.StaticFieldRef") ||
stmt.getDefBoxes().get(0).getValue().getClass() == Class.forName("soot.jimple.internal.JInstanceFieldRef")){
isWrite = true;
}else{
isWrite = false;
}
}catch (Exception e){}
这可以工作,因为我发现stmt.getDefBoxes()
返回与左侧变量相关的列表。如果左侧变量的类型为soot.jimple.internal.JimpleLocal
,则为读取操作;如果它是 classsoot.jimple.internal.JInstanceFieldRef
或 class类型soot.jimple.StaticFieldRef
,则它是一个写入操作。