我刚开始开发一个正在进行某种别名分析的frama-c插件。我正在使用Dataflow.Backwards分析,现在我必须完成不同的赋值语句并收集有关左值的一些内容。
frama-c是否为我提供了3地址代码?我对左值(或任何内存访问)的形状有一些保证吗?我的意思是,在烟灰或wala中,至多有一个场访问,s.t。对于a-> b-> c,会有一个像tmp = a-> b的临时变量; TMP-&以及c ;?我检查了手册,但找不到与此相关的任何内容。
答案 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中运行。