在 Java 代码中使用 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 ,则为读取操作;如果它的类型是类 soot.jimple.internal.JInstanceFieldRef 或类 soot.jimple.StaticFieldRef ,则它是一个写入操作。

相关内容

  • 没有找到相关文章

最新更新