【发布时间】:2016-03-23 03:22:00
【问题描述】:
我正在使用价值分析为 Frama-C 开发插件。 我只是想在每个语句之后打印变量(值)的状态(我认为解决方案很简单,但我想不通)。
我在访问者的vstmt_aux 方法中使用Db.Value.get_stmt_state 获得了当前状态。
我现在如何获取变量的值?
PS:我找到了这篇文章,但没有帮助,没有真正的解决方案,并且在描述的帮助下我无法做到: How to use functions in Value.Eval_expr, Value.Eval_op etc modules of Frama-c Value plugin
【问题讨论】:
-
Db.Value.get_stmt_state返回的状态不是从 变量 到抽象值的映射,但它比这更强大,因此获取变量的值。也就是说,链接问题的解决方案中的 cmets 似乎确实得出结论认为它有效。您能否具体说明您使用的是哪个版本的 Frama-C? -
@anol 是对的。如果您只对标量变量的值感兴趣,只需提供
(Var x, NoOffset)作为lval_to_loc的lval参数,假设x是您感兴趣的Frama-C 变量(varinfo)。 -
在你提到的评论中,这部分文字是什么:
(Kstmt stmt) lv什么是lv? Kstmt 是演员还是类似的东西? -
lv是lval的缩写(一个C lvalue),而(Kstmt stmt)只是构建一个值,它们彼此之间没有关联(除了事实上两者都是access函数的参数)。我在下面的代码中做了同样的事情,但在几行中,也许会更清楚。尽管如此,如果你不习惯 OCaml 表示法,复习其中的一些可能会很有用,因为 Frama-C 使用了几个 OCaml 概念(命名和可选参数、访问者等事物的类、Format等)
标签: ocaml frama-c value-analysis