对不起,如果这是一个基本问题,但即使搜索了很多,我也无法弄清楚这一点。
我正在使用烟灰来检测我的代码。我能够检查我的语句是否使用 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
,则为读取操作;如果它的类型是类 soot.jimple.internal.JInstanceFieldRef
或类 soot.jimple.StaticFieldRef
,则它是一个写入操作。