我如何使用为 Frama-C 的插件编写的模块?

How can i use the modules written for Frama-C' s plugin?

Build 是为了构建 PDG 而开发的模块。 我编写了一个使用此模块 Build 的脚本,但是当我尝试使用以下命令启动此脚本时:

frama-c -load-script test.ml

我收到错误:Unbound module Build。 有没有办法访问这个模块。我的项目中需要它。 Build 是一个示例,但还有其他模块,如 Sets,它提供了读取 PDG 的功能。然而,其他模块如 PdgTypes 不会出错。如果有人能帮助我...

在我的文件中 test.ml, 让计算 = Build.compute_pdg ....

let()=Db.Main.extendmain

你不能那样做。 -load-script 仅适用于在 Frama-C 之外没有任何依赖项(或 Frama-C 自己的依赖项,例如 OCamlgraph)的脚本。正如 Anne 所建议的,如果您的代码包含在多个文件中,您应该将其编写为插件。

对于一个简单的插件,你基本上只需要在你的OCaml代码之外写一个简短的MakefileMakefile 将主要包含插件的源文件列表和一些附加信息(例如插件的名称),如 the developer's manual 中所述,其中包含一个小教程。

或者,如果您只有两个文件,应该可以将它们手动 assemble 到一个模块中,然后由 Frama-C 加载。假设你有 build.mltest.ml,你可以这样做(使用 Sodium 版本)

ocamlopt -I $(frama-c-config -print-libpath) -c build.ml
ocamlopt -I $(frama-c-config -print-libpath) -c test.ml
ocamlopt -shared -o script.cmxs build.cmx test.cmx
frama-c -load-module script.cmxs [other options] [files]

您引用的模块 BuildSets 不被视为 Frama-C 的 public 用户界面的一部分。相反,它们是插件内部的 PDG。您可以从用户脚本访问的 PDG 的模块是目录 src/pdgTypes 中的模块:PdgIndexPdgMarksPdgTypes。然后,API 的第二部分在 Db.Pdg 中可用(Dbsrc/kernel/db.ml 中)。特别是模块 Sets 的大部分功能都在那里重新导出。

对于 Build 中可用的函数,它们被认为级别太低而无法导出。如果您确实需要访问它,则必须复制目录 src/pdg 并将其转换为插件(使用新名称,以避免冲突)。