我在Frama-c中获得3地址代码吗?

时间:2013-03-21 20:30:41

标签: frama-c

我刚开始开发一个正在进行某种别名分析的frama-c插件。我正在使用Dataflow.Backwards分析,现在我必须完成不同的赋值语句并收集有关左值的一些内容。

frama-c是否为我提供了3地址代码?我对左值(或任何内存访问)的形状有一些保证吗?我的意思是,在烟灰或wala中,至多有一个场访问,s.t。对于a-> b-> c,会有一个像tmp = a-> b的临时变量; TMP-&以及c ;?我检查了手册,但找不到与此相关的任何内容。

2 个答案:

答案 0 :(得分:2)

不,Frama-C没有这种正常化。如果您真的需要它,可以先使用访问者来规范化代码,使其符合插件的要求。就是这样:

class normalize prj: Visitor.frama_c_visitor =
object
  inherit Visitor.frama_c_copy prj

  method vinstr i =
    match i with
      | Set (lv,e) -> ...
      ....
end

let analyze () = ...

let run () =
  let my_prj = File.create_project_from_visitor "my_project" (fun prj -> new normalize prj) in
  Project.on my_prj analyze ()

答案 1 :(得分:1)

Cil的以下模块可能是您想要的: http://www.cs.berkeley.edu/~necula/cil/ext.html#toc26。请注意,生成的AST的类型是标准的Cil。你不会从OCaml编译器那里得到任何帮助,知道哪些结构可以在简化的AST中出现,哪些不能出现。

另请注意,到目前为止,此模块尚未移植到Frama-C。您需要进行一些小修改才能使其在Frama-C中运行。