0

私は CIL の初心者で、CIL の拡張機能を変更しようとしています。

これが私が扱っているCコードの一部です:

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

*p = 2;

b = *p;
}

lvalの型を出力するためにCILを使用しています(また、正しい式の型を出力しようとしました)

コードは次のとおりです。

 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#TYPEtypを参照してください。typsigパターン マッチングの前に型の構造を単純化したい場合は、代わりに使用することもできます ( http://kerneis.github.io/cil/doc/html/cil/api/Cil.html#TYPEtypsigtypeSig (typeOf e)を参照)。

于 2014-04-01T15:51:08.080 に答える