【发布时间】:2018-01-05 20:17:08
【问题描述】:
我想开发一个 Frama-C-Plugin,用于获取当前语句的值。
在这篇文章 Frama-C Plugin development: Getting result of value-analysis 的帮助下,我能够打印语句的值,但指针没有按我需要的方式显示。
在 cmets 的帮助下,我能够打印整个状态(不仅仅是语句的变量)。
我可以将这两者结合起来:获取语句的变量,还可以使用取消引用的指针(值)?
例如,在语句x=1 之后打印非指针会导致x -> {{ NULL -> {1} }},而在像 *x=3 这样的语句之后打印指针会导致x -> {{ y -> {0} }},因为 0 是变量的偏移量,但我想获取指针指向的值,在示例 3 中。
我想要的方式是得到类似的东西:x -> 3。
最好是得到一个(String varname, int value) 的元组,这样我就可以自己打印了。
【问题讨论】:
-
“指针未正确显示”是什么意思?也许您应该编辑您的问题以添加一个示例,说明您得到了什么以及您想看到什么。
-
所以你要得到的是
(*x)的值,而不是(x)的值。要知道一个变量是否是一个指针,你可以测试它的类型(Cil.isPointerType vi.vtype),然后,你必须构建左值*x(类似Lval (Mem ...,NoOffset))并用它来询问它的值。 -
... 部分是什么?只是 varinfo 字段?如何从 varinfo 中获取偏移量?取消引用指针时,这将是必需的(或者我没有得到你想说的)?
-
您应该查看
cil_types.mli文件,您可以在其中找到所有这些数据的定义,以及有关如何构建它们的一些说明。您需要取消引用,因为您想获得*x的值。如您所见,如果您询问x的值,您会得到它指向y(在您的示例中),这确实是指针的值。 -
我查看了 cil_types.mli 中的定义:Mem 需要一个表达式。我从哪里得到这个?我通过 Kernel_function.get_locals 获得了 varinfos,但我看不到类似的函数来获取表达式?有没有显示我想要的示例代码?我找不到好的文档或教程。