Ocaml Frama-C:获取语句的值

Ocaml Frama-C:获取语句的值,ocaml,frama-c,Ocaml,Frama C,我想开发一个Frama-C-Plugin,从中可以得到当前语句的值 在这篇文章的帮助下,我能够打印语句的值,但是指针没有按我需要的方式显示 在注释的帮助下,我能够打印整个状态(不仅仅是语句的变量) 我是否可以将这两种方法结合起来:获取语句的变量,但也要使用未引用的指针(值) 例如,在语句x=1之后打印非指针会导致x->{{NULL->{1}}},而在*x=3这样的语句之后打印指针会导致x->{y->{0}},因为0是变量的偏移量,但在示例3中,我想得到指针指向的值。 我想要的方式是得到这样的东西

我想开发一个Frama-C-Plugin,从中可以得到当前语句的值

在这篇文章的帮助下,我能够打印语句的值,但是指针没有按我需要的方式显示

在注释的帮助下,我能够打印整个状态(不仅仅是语句的变量)

我是否可以将这两种方法结合起来:获取语句的变量,但也要使用未引用的指针(值)

例如,在语句
x=1
之后打印非指针会导致
x->{{NULL->{1}}}
,而在*x=3这样的语句之后打印指针会导致
x->{y->{0}}
,因为0是变量的偏移量,但在示例3中,我想得到指针指向的值。 我想要的方式是得到这样的东西:
x->3


更好的方法是得到一个
(String varname,int value)
,这样我就可以自己打印它了。

变量的值取决于它的类型。因此,如果变量的类型为
int
,则其值为整数,但如果变量的类型为
int*
,则其值为
int
变量的地址。变量可能有许多其他类型,如结构、数组等

从您的示例中,似乎您希望获得变量的值 被指针指向。请注意,在某些情况下,这不是有效的操作

无论如何,我想您可以提取此函数,从中的上一个答案打印左值:

然后,您可以打印您要查找的信息:

if Cil.isPointerType vi.vtype then
  let lval = (Mem (Cil.evar vi), NoOffset) in
  pretty_lval fmt stmt lval

变量的值取决于其类型。因此,如果变量的类型为
int
,则其值为整数,但如果变量的类型为
int*
,则其值为
int
变量的地址。变量可能有许多其他类型,如结构、数组等

从您的示例中,似乎您希望获得变量的值 被指针指向。请注意,在某些情况下,这不是有效的操作

无论如何,我想您可以提取此函数,从中的上一个答案打印左值:

然后,您可以打印您要查找的信息:

if Cil.isPointerType vi.vtype then
  let lval = (Mem (Cil.evar vi), NoOffset) in
  pretty_lval fmt stmt lval

“指针未正确显示”是什么意思?也许你应该编辑你的问题来添加一个例子,说明你得到了什么以及你想看到什么。所以你想得到的是
(*x)
,而不是
(x)
。要知道变量是否是指针,可以测试它的类型(
Cil.isPointerType vi.vtype
),然后,必须构建左值
*x
(使用类似于
Lval(Mem…,NoOffset)
)并使用它来请求它的值。什么是。。。部分只是VariInfo字段?如何从VariInfo获取偏移量?当取消引用指针时,需要这样做(或者我没有得到您想要说的内容)?您应该查看
cil_types.mli
文件,在该文件中可以找到所有这些数据的定义,以及有关如何构建它们的一些说明。您需要取消引用,因为您希望获得
*x
的值。如您所见,如果您询问
x
的值,您会发现它指向
y
(在您的示例中),这确实是指针的值。我查看了cil_types.mli中的定义:Mem需要一个表达式。我从哪里得到这个?我通过Kernel_函数获取varinfo。获取_局部变量,但我看不到类似的函数来获取表达式?有没有关于我想要什么的示例代码?我找不到好的文档或教程。你说的“指针显示不正确”是什么意思?也许你应该编辑你的问题来添加一个例子,说明你得到了什么以及你想看到什么。所以你想得到的是
(*x)
,而不是
(x)
。要知道变量是否是指针,可以测试它的类型(
Cil.isPointerType vi.vtype
),然后,必须构建左值
*x
(使用类似于
Lval(Mem…,NoOffset)
)并使用它来请求它的值。什么是。。。部分只是VariInfo字段?如何从VariInfo获取偏移量?当取消引用指针时,需要这样做(或者我没有得到您想要说的内容)?您应该查看
cil_types.mli
文件,在该文件中可以找到所有这些数据的定义,以及有关如何构建它们的一些说明。您需要取消引用,因为您希望获得
*x
的值。如您所见,如果您询问
x
的值,您会发现它指向
y
(在您的示例中),这确实是指针的值。我查看了cil_types.mli中的定义:Mem需要一个表达式。我从哪里得到这个?我通过Kernel_函数获取varinfo。获取_局部变量,但我看不到类似的函数来获取表达式?有没有关于我想要什么的示例代码?我找不到好的文档或教程。谢谢,这回答了我关于指针的问题。现在是否有办法获取值并将其存储在ocaml变量中,而不是打印它?不知何故,通过调用一个以值(来自解决方案)作为参数的函数?你是什么意思<上面的代码>值是一个ocaml变量。也许你指的是一个字符串变量?如果是这种情况,您可以使用
Format.asprintf
,但这是一个ocaml问题。我的意思是:我想获取存储在变量中的值。例如:如果我有{{NULL->{0}},我想将0存储在Ocaml int变量中(或者将其添加到列表或类似的东西中)。使用asprintf,我得到字符串(带括号,->,NULL…)。有没有办法通过Frama-C函数获取值,或者我必须拆分字符串?请尝试
Db.value.pretty
而不是
Locations.Location\u Bytes.pretty
。我想你的情况会更简单谢谢,