如何在Cil指令(OCaml)中获取所有变量?

时间:2013-11-01 17:17:48

标签: ocaml berkeley-cil

我想在CIL中添加一条带注释的指令。 在这篇评论中,我想展示该指令中的所有变量。 我写了一个OCaml模块来使用CIL驱动程序。代码看起来像

class addCommentVisitor = object
   inherit nopCilVisitor
   method vinst (i: instr) : instr list visitAction = 
   match i with
    | Set(lval, exp, lc) ->
      (* do the job *)
     ...

在匹配中,如何迭代instr i中的所有变量?例如,使用指令x[i] = y[j] * (z[k] + l);,我想获得变量x, i, y, j, z, k, l的名称 谢谢你的帮助。

1 个答案:

答案 0 :(得分:4)

您可以分配一个新的访问者,其方法vvrbl将匹配变量用法,并使用此访问者使用Cil.visitCilExpr迭代表达式的变量,将变量累积在一个可变列表中(对于实例)。

编辑:完整的代码如下所示。

class addCommentVisitor = object
  inherit nopCilVisitor
  method vinst (i: instr) : instr list visitAction = 
  match i with
  | Set(lval, exp, lc) ->
      let varVisitor = object
        inherit nopCilVisitor
        val mutable vars : varinfo list = []
        method get_vars = vars
        method vvrbl v = vars <- v :: vars; DoChildren
      end in
      ignore(visitCilLval (varVisitor :> cilVisitor) lval);
      ignore(visitCilExpr (varVisitor :> cilVisitor) exp);
      let vars = varVisitor#get_vars in ...

根据您的代码,您还可以在其自己的类中分解内部访问者而不是使用直接对象,如果要删除重复项,则使用集合而不是列表。