0

我是 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

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

谁能给我一些帮助?

4

1 回答 1

3

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

您的后续问题是如何匹配类型。你可以简单地做:

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#TYPEtyptypsig如果您想在模式匹配之前简化类型的结构,您也可以使用(typeSig (typeOf e)参见http://kerneis.github.io/cil/doc/html/cil/api/Cil.html#TYPEtypsig)。

于 2014-04-01T15:51:08.080 回答