我想查询Frama-C中的值分析插件,以获取获取其值的说明。对于每个数组,它返回整个数组的值范围。例如,如果指令为array[i] = 1;
,则我从值分析插件获得{1}
的结果= array[i]
。现在,例如array[i]
,我想从值分析中获取变量名i
及其值。
以下是我的代码示例
class print_VA_result out = object
inherit Visitor.frama_c_inplace
(**..*)
method vstmt_aux s =
if Db.Value.is_computed () then
match s.skind with
| Instr i ->
begin
match i with
| Set(lval,_,_) ->
print_value lval s
|_ -> "<>"
...
有人可以帮我吗?非常感谢。
答案 0 :(得分:7)
我假设您知道如何编写print_val
类型的函数Db.Value.t -> unit
在匹配Set
指令之前放置的以下代码将捕获对索引e
match i with
(* Access to an array *)
| Set ((_, Index (e, _)), _, _) ->
let v = !Db.Value.access_expr (Kstmt s) e in
print_val v
(* End special case *)
| Set(lval,_,_) ->
print_value lval s
或者,如果您知道变量的名称,则可以使用函数Globals.Vars.find_from_astinfo
查找相应的varinfo vi
,并使用此代码查询varinfo的内容。
open Cil_types
let vi_content stmt vi =
let lv = (Var vi, NoOffset) in
!Db.Value.access (Kstmt stmt) lv