Ocaml 在值分析(Frama-C)中获取数组索引变量及其值

Ocaml 在值分析(Frama-C)中获取数组索引变量及其值,ocaml,static-analysis,analysis,frama-c,Ocaml,Static Analysis,Analysis,Frama C,我想查询Frama-C中的值分析插件,以获取它们的值。对于每个数组,它返回整个数组的值范围。例如,如果指令是array[i]=1,我从值分析插件中获得了数组[I]的结果={1}。现在,对于例如array[i],我想从值分析中获取变量名i及其值 下面是我的代码示例 class print_VA_result out = object inherit Visitor.frama_c_inplace (**..*) method vstmt_aux s = if Db.Value.

我想查询Frama-C中的值分析插件,以获取它们的值。对于每个数组,它返回整个数组的值范围。例如,如果指令是
array[i]=1,我从值分析插件中获得了数组[I]
的结果=
{1}
。现在,对于例如
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
         |_ -> "<>"   
 ...
class print\u VA\u result out=object
继承访客frama_c_in place
(**..*)
方法vstmt_aux s=
如果计算了Db.Value.u(),则
将s.skind与
|仪表一->
开始
匹配
|设置(lval,,->
打印值lval s
|_ -> ""   
...

有人能帮我吗?非常感谢。

我假设您知道如何编写类型为
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\u from\u astinfo
查找相应的varinfo
vi
,并使用此代码查询varinfo的内容

open Cil_types    

let vi_content stmt vi =
  let lv = (Var vi, NoOffset) in
  !Db.Value.access (Kstmt stmt) lv

对不起,如果这让你感到困惑。我编辑了这个问题。您现在能理解吗?非常感谢,@BorisYakobowskiI按照价值分析GUI代码显示结果。它使用
Value.get_stmt\u state stmt
表示“之前的值”和
Value.postTable.find stmt
表示“之后的值”,然后使用lval将其映射到偏移贴图,并通过该偏移贴图打印出来。请您指导我如何按照您的建议打印出类型
Db.Value.t->unit
?Offsetmap copy仅在非常复杂的情况下有用,或用于显示结构或数组之类的结构化内容。对于标量变量,计算并打印
Db.Value.t
类型的内容更简单。函数
let print_val v=Format.printf“%a”Db.Value.pretty v
应该可以完成这项工作。你好@BorisYakobowski,非常感谢你的回复。我设法解决了这个问题。顺便问一下,我们如何处理右侧数组的索引,例如获取数组中j的值1[i]=array2[j]。。。?谢谢处理从数组读取的操作与此类似,只是您必须匹配
集合
构造函数的第二个参数。此参数的类型为
exp
,因此必须查找一个表达式,该表达式是一个l值,它本身就是对数组的访问<代码>集合({enode=Lval({uo,索引(e,{))},{uo)->