繁体   English   中英

Frama-C:获取语句的值

[英]Frama-C: Getting the values of statement

我想开发一个Frama-C-Plugin,在其中获取当前语句的值。

在这篇Frama-C Plugin开发的帮助下:获得价值分析的结果,我能够打印语句的值,但是并没有按照我的需要显示指针。

借助注释,我能够打印整个状态(不仅是语句的变量)。

我可以结合以下两种方法:获取语句的变量,还可以使用取消引用的指针(值)吗?

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

甚至更好的是获取(String varname, int value)的元组,以便我自己打印它。

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

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

无论如何,我想您可以从Frama-C插件开发中的上一个答案中提取此函数以打印左值:获取值分析的结果

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM