2

抱歉,如果这是一个基本问题,但即使经过大量搜索,我也无法弄清楚。

我正在使用 SOOT 来检测我的代码。我能够检查我的语句是否使用访问字段,stmt.containsFieldRef()但我想区分将值写入字段的语句和仅读取其值的语句。

是否有预定义的方法可以做到这一点,或者解析语句是唯一的选择?

4

1 回答 1

1

我也遇到了这个问题,我终于自己弄清楚了。

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,则它是一个写入操作。

于 2020-12-05T07:11:03.517 回答