为什么这个e / lval的类型在CIL中是int?

时间:2014-04-01 15:02:30

标签: ocaml berkeley-cil

我是CIL的新手,我正在尝试修改CIL的扩展名。

以下是我正在处理的C代码的一部分:

int main()
{
int a = 1;
int b = 2;
int *p = &a;

*p = 2;

b = *p;
}

我正在使用CIL打印出lval的类型(我也尝试打印出正确表达式的类型)

以下是代码:

 method vinst(i) =
match i with
  | Set (lv, e, _) ->
    let tt = typeOf e in
      let ds_type () i = Pretty.sprint max_int (d_type () tt) in
      let i_str = Printf.sprintf "%a" ds_type i in
        (E.log "%s\n" i_str); SkipChildren
  | _ -> DoChildren

令我惊讶的是,它产生的结果是:

int
int
int *
int
int
int

我尝试打印出正确表达的类型,结果也是:

int
int
int *
int
int
int

我不明白为什么找不到指针类型的用法?

有人能给我一些帮助吗?

1 个答案:

答案 0 :(得分:3)

正如Anne评论的那样,*p = 2 不是指针赋值。它是一个整数赋值:您将整数(2)分配到类型为*p的内存位置(int)。通过指针间接指定此位置的事实是无关紧要的。

您的后续问题是如何匹配该类型。你可以这样做:

match typeOf e with
| TInt (kind, attrs) -> ... (* integer *)
| TPtr (TInt (kind, attrs'), attrs) -> ... (* pointer to an integer *)
| TPtr _ -> ... (* other pointer *)
| _ -> ... (* etc.*)

有关CIL中C类型表示的更多详细信息,请参阅http://kerneis.github.io/cil/doc/html/cil/api/Cil.html#TYPEtyp。如果您想在模式匹配(typsig,cf。http://kerneis.github.io/cil/doc/html/cil/api/Cil.html#TYPEtypsig)之前简化类型的结构,也可以使用typeSig (typeOf e)