Graph 如何将frama-c CLI代码映射到原始c语句?我怎样才能找到frama-c的api文档?
我试图在原始代码的语句级别使用frama-c获得程序依赖图(PDG)。但是,frama-c中的“pdg”插件在解析代码的节点级别打印pdgGraph 如何将frama-c CLI代码映射到原始c语句?我怎样才能找到frama-c的api文档?,graph,static-analysis,frama-c,Graph,Static Analysis,Frama C,我试图在原始代码的语句级别使用frama-c获得程序依赖图(PDG)。但是,frama-c中的“pdg”插件在解析代码的节点级别打印pdg 由于frama-c-gui可以突出显示与解析代码中的节点相对应的原始语句,因此我非常确定解析代码中的节点与原始代码的语句之间存在映射。如何获取此映射?只有原始代码的行号也可以。Frama-C的GUI提供了两种代码视图: CIL代码(C中间语言),通常称为标准化源代码,对应于顶部中间面板中的Frama AST的漂亮打印 和原始源代码,在右上面板上 我假设,通过
由于frama-c-gui可以突出显示与解析代码中的节点相对应的原始语句,因此我非常确定解析代码中的节点与原始代码的语句之间存在映射。如何获取此映射?只有原始代码的行号也可以。Frama-C的GUI提供了两种代码视图:
frama-c-PDG-load module print_PDG.ml运行):
请注意,如果有多个PDG节点关联到同一条语句,那么我的示例脚本将多次打印每条语句
默认情况下,Printer.pp_location
仅打印起始字符的文件名和行,但您可以制作一个自定义的漂亮打印机,以包括列或最后一个字符的坐标
API和插件文档(来自注释中的问题)
一些Frama-C插件(Eva、WP、E-ACSL等)有自己的手册,可在中找到
Pdg插件没有特定的手册,但是可以从中获得一些Ocamldoc生成的HTML页面
然而,大多数Frama-C插件开发人员更喜欢在他们最喜欢的编辑器(emacs、vim等)中使用OCaml插件来导航代码和读取源注释(例如,在.mli文件中)
例如,在Emacs上,模块/变量名上的C-C-l
跳转到其定义,并且C-C-a
在.ml
和.mli
文件(实现-文档)之间交替。与模块/函数发现的自动完成相结合,这提供了一种交互式文档的形式,许多OCaml开发人员都很熟悉。Frama-C的GUI提供了两种代码视图:
CIL代码(C中间语言),通常称为标准化源代码,对应于顶部中间面板中的Frama AST的漂亮打印李>
和原始源代码,在右上面板上
我假设,通过解析的代码,您谈论的是CIL(规范化)代码
Frama-C AST中的每个元素都包含一个位置,这是一对位置:原始代码中与该元素对应的第一个和最后一个坐标(行、行、列)(减去一些异常,如生成的元素、宏扩展等)。大多数AST元素都有检索该位置的方法
对于PDG节点,您可以获取相关语句(如果有),然后打印它们的位置,如下面的代码所示(使用frama-c-PDG-load module print_PDG.ml运行):
请注意,如果有多个PDG节点关联到同一条语句,那么我的示例脚本将多次打印每条语句
默认情况下,Printer.pp_location
仅打印起始字符的文件名和行,但您可以制作一个自定义的漂亮打印机,以包括列或最后一个字符的坐标
API和插件文档(来自注释中的问题)
一些Frama-C插件(Eva、WP、E-ACSL等)有自己的手册,可在中找到
Pdg插件没有特定的手册,但是可以从中获得一些Ocamldoc生成的HTML页面
然而,大多数Frama-C插件开发人员更喜欢在他们最喜欢的编辑器(emacs、vim等)中使用OCaml插件来导航代码和读取源注释(例如,在.mli文件中)
例如,在Emacs上,模块/变量名上的C-C-l
跳转到其定义,并且C-C-a
在.ml
和.mli
文件(实现-文档)之间交替。与模块/函数发现的自动完成相结合,这提供了一种交互式文档形式,许多OCaml开发人员都非常熟悉。非常感谢,@anol!你能再帮我一件事吗?我怎样才能找到frama-c插件的api文档(尤其是pdg插件)来修改它们的示例?我在回答中添加了一个关于文档的部分,以回应您的评论。您可能希望将评论中的问题移至主要问题,以帮助未来的读者。非常感谢,@anol!你能再帮我一件事吗?我怎样才能找到frama-c插件的api文档(尤其是pdg插件)来修改它们的示例?我在回答中添加了一个关于文档的部分,以回应您的评论。您可能希望将评论中的问题移至主要问题,以帮助未来的读者。
(* 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
)
)