我想在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
的名称
谢谢你的帮助。
答案 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 ...
根据您的代码,您还可以在其自己的类中分解内部访问者而不是使用直接对象,如果要删除重复项,则使用集合而不是列表。