0

我想在 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
谢谢你的帮助。

4

1 回答 1

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 ...

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

于 2013-11-01T22:03:37.480 回答