Graph 如何将frama-c CLI代码映射到原始c语句?我怎样才能找到frama-c的api文档?

Graph 如何将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获得程序依赖图(PDG)。但是,frama-c中的“pdg”插件在解析代码的节点级别打印pdg


由于frama-c-gui可以突出显示与解析代码中的节点相对应的原始语句,因此我非常确定解析代码中的节点与原始代码的语句之间存在映射。如何获取此映射?只有原始代码的行号也可以。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开发人员都很熟悉。

    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
          )
      )