簡體   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