我正在尝试在原始代码的语句级别使用frama-c获取程序依赖图(PDG)。但是,frama-c中的'pdg'插件会在已解析代码的节点级别上打印PDG。
由于frama-c-gui可以突出显示原始语句对应于已解析代码中的节点,因此,我很确定在解析代码中的节点与原始代码的语句之间存在映射。如何获得此映射?只需原始代码中的行号也可以。
CIL代码(C中间语言),通常称为
Frama-C AST中的每个元素都包含一个位置,它是一对位置:原始代码中的第一个和最后一个坐标
(行,行,列)”到该元素(减去一些例外,例如生成的元素,宏扩展等)。大多数AST元素都有获取该位置的方法。
对于PDG节点,您可以获取关联的语句(如果有的话),然后打印其位置,如下面的代码(使用frama-c -pdg -load-module print_pdg.ml <file>
运行:](* print_pdg.ml *)
let () = Db.Main.extend (fun () ->
Globals.Functions.iter (fun kf ->
let pdg = !Db.Pdg.get kf in
!Db.Pdg.iter_nodes (fun n ->
match PdgTypes.Node.stmt n with
| None -> ()
| Some st ->
Format.printf "%a: %a@."
Printer.pp_location (Cil_datatype.Stmt.loc st) Printer.pp_stmt st
) pdg
)
)
请注意,如果有多个PDG节点与同一条语句相关联,我的示例脚本将多次打印每个语句。默认情况下,Printer.pp_location
仅打印文件名和起始字符的行,但是您可以制作一个自定义的漂亮打印机,使其也包括列或最后一个字符的坐标。
API和插件文档(来自注释中的问题)某些Frama-C插件(Eva,WP,E-ACSL等)具有自己的手册,可在Frama-C download page中找到。
Pdg插件没有特定的手册,但是可以从Frama-C API archive获得一些Ocamldoc生成的HTML页面。
但是,大多数Frama-C插件开发人员更喜欢在他们喜欢的编辑器(emacs,vim等)中使用OCaml Merlin插件来浏览代码并阅读源注释(在.mli中。文件)。
例如,在Emacs上,模块/变量名称上的
C-c C-l
跳到其定义,C-c C-a
在.ml
和.mli
文件之间交替(实现-文档)。结合用于模块/功能发现的自动完成功能,这提供了许多OCaml开发人员都喜欢的交互式文档形式。