Ocaml 在值分析(Frama-C)中获取数组索引变量及其值
我想查询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.
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
查找相应的varinfovi
,并使用此代码查询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)->