[英]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.