如何在Frama-c Value插件的Value.Eval_expr,Value.Eval_op等模块中使用函数

时间:2015-12-29 22:32:29

标签: ocaml frama-c

我正在尝试创建一个frama-c插件。这个插件取决于Frama-c Value插件。我想获取并打印C源代码中所有左值的值集。为了做到这一点,我想使用Value.Eval_exprs,Value.Eval_op等可用的函数,如Eval_exprs.lval_to_precise_loc

不幸的是我无法找到在我的插件中使用这些功能的方法。我尝试按照Frama-c插件开发指南的4.10.1节(通过.mli文件注册)中提到的步骤,在我的Makefile中添加了PLUGIN_DEPENDENCIES:=Value,但我注意到Value.mli文件为空,没有函数通过此文件公开。之后我查看db.ml目录中的kernel文件,找不到任何可用于访问Eval_exprs,Eval_op等中可用函数的模块。

有没有办法从其他插件访问Value插件的这些功能?

1 个答案:

答案 0 :(得分:3)

可以使用多种机制以编程方式使用Frama-C插件的结果:

  1. 通过Db模块,其中包含访问许多"核心"的结果的功能。插件
  2. 通过调用" dynamic" API(模块Dynamic
  3. 通过插件的界面(例如您的情况下为Value.mli
  4. 前两种方法已弃用,最终将消失。此外,方法1.不适用于用户编写的插件。这就是开发人员手册强调方法3的原因。

    话虽如此,目前,Value的结果可以使用方法1(仅)。在插件中,您只需编写!Db.Value.eval_expr!Db.Value.eval_lval即可分别扩展表达式和左值。这将自动运行。您仍然应该将Value声明为插件的依赖项(PLUGIN_DEPENDENCIES:=Value,如您所知),因为这将在下一版本的Frama-C中使用。值的所有内部模块(例如Eval_exprs)都是有意导出的。可以使用Db.Value中的可用函数编写Value的结果的大部分用法。

    最后,lval_to_precise_loc是一个非常高级的函数,因为返回的位置有一个难以使用的类型。 Db.Value.lval_to_loc几乎总是更好的选择。