我刚开始开发一个进行某种别名分析的 frama-c 插件。我正在使用 Dataflow.Backwards 分析,现在我必须通过不同的赋值语句并收集一些关于左值的东西。
frama-c 是否为我提供 3 地址代码?我对左值的形状(或任何内存访问)有一些保证吗?我的意思是,就像在 soot 或 wala 中一样,对于 a->b->c,最多有一个字段访问,st,会有一个临时变量,比如 tmp=a->b; tmp->c;? 我查看了手册,但找不到与此相关的任何内容。
我刚开始开发一个进行某种别名分析的 frama-c 插件。我正在使用 Dataflow.Backwards 分析,现在我必须通过不同的赋值语句并收集一些关于左值的东西。
frama-c 是否为我提供 3 地址代码?我对左值的形状(或任何内存访问)有一些保证吗?我的意思是,就像在 soot 或 wala 中一样,对于 a->b->c,最多有一个字段访问,st,会有一个临时变量,比如 tmp=a->b; tmp->c;? 我查看了手册,但找不到与此相关的任何内容。
不,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 ()
Cil 的以下模块可能满足您的需求: http ://www.cs.berkeley.edu/~necula/cil/ext.html#toc26 。请注意,生成的 AST 的类型是标准 Cil 类型。您不会从 OCaml 编译器获得关于哪些结构可以存在于简化的 AST 中,哪些不能存在的任何帮助。
另请注意,到目前为止,此模块尚未移植到 Frama-C。您需要进行一些小的调整才能使其在 Frama-C 中工作。