Frama-C:获得陈述的价值

时间:2016-03-29 06:10:29

标签: ocaml frama-c

我想开发一个Frama-C-Plugin,在那里我得到当前语句的值。

在这篇文章Frama-C Plugin development: Getting result of value-analysis的帮助下,我能够打印语句的值,但指针没有按照我需要的方式显示。

在评论的帮助下,我能够打印整个状态(不仅是声明的变量)。

我可以将这两个结合起来:获取语句的变量,还使用指针取消引用(值)?

例如,在语句x=1之后打印非指针导致x -> {{ NULL -> {1} }},而在* x = 3之类的语句之后打印指针会导致x -> {{ y -> {0} }},因为0是变量的偏移量,但我希望得到指针指向的值,在示例3中。 我想要它的方式是获得类似的东西:x -> 3

更好的是获得(String varname, int value)的元组,所以我可以自己打印。

1 个答案:

答案 0 :(得分:3)

变量的值取决于其类型。因此,如果变量的类型为int,则其值为整数,但如果变量的类型为int*,则其值为int变量的地址。变量可能有许多其他类型,如结构,数组等。

从您的示例中,您似乎想要获取变量的值 指针指向。请注意,在某些情况下,这不是有效的操作...

无论如何,我想你可以提取这个函数来打印Frama-C Plugin development: Getting result of value-analysis中前一个答案的左值:

let pretty_lval fmt stmt lval =
  let kinstr = Kstmt stmt in (* make a kinstr from a stmt *)
  let loc = (* make a location from a kinstr + an lval *)
    !Db.Value.lval_to_loc kinstr ~with_alarms:CilE.warn_none_mode lval
  in
  Db.Value.fold_state_callstack
    (fun state () ->
       (* for each state in the callstack *)
       let value = Db.Value.find state loc in (* obtain value for location *)
       Format.fprintf fmt "%a -> %a@." Printer.pp_lval lval
         Locations.Location_Bytes.pretty value (* print mapping *)
    ) () ~after:false kinstr

然后,您可以使用以下方式打印您要查找的信息:

if Cil.isPointerType vi.vtype then
  let lval = (Mem (Cil.evar vi), NoOffset) in
  pretty_lval fmt stmt lval