我是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
我不明白为什么找不到指针类型的用法?
有人能给我一些帮助吗?
答案 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)
。