2016-03-29 10 views
0

私は現在のステートメントの値を取得するFrama-C-Pluginを開発したいと思います。Frama-C:ステートメントの値を取得する

Frama-C Plugin development: Getting result of value-analysis私はステートメントの値を印刷することができましたが、必要な方法でポインタが表示されませんでした。

コメントの助けを借りて、私は状態全体(文の変数だけでなく)を印刷することができました。

私はこれらの2つを組み合わせることができます:ステートメントの変数を取得するだけでなく、逆参照されたポインタ(値)も取得できますか?

ポインタを印刷中に0が変数のオフセットが、私がしたいされているため、例えば、x -> {{ NULL -> {1} }}に文の後x=1結果を非ポインタを印刷し、* X = 3のようなステートメントの後、x -> {{ y -> {0} }}になり例3のポインタが指している値を取得します。 私がそれを望む方法は、そのようなものを得ることです:x -> 3

タプルを(String varname, int value)にすると、印刷することができます。

+0

「ポインタが正しく表示されませんでした」とはどういう意味ですか?たぶんあなたはあなたが得るものとあなたが見たいものの例を追加するためにあなたの質問を編集する必要があります。 – Anne

+0

あなたが得たいのは、 '(* x)'の値ではなく、 '(x)'の値です。変数がポインタであるかどうかを知るために、その型( 'Cil.isPointerType vi.vtype')をテストして、左辺' * x'を構築しなければなりません( 'Lval(Mem ...、 NoOffset) ')、それを使ってその値を求めます。 – Anne

+0

...の部分とは何ですか?単にvarinfoフィールド? varinfoからオフセットを取得するにはどうすればよいですか?ポインタを参照解除するときに、これが必要になります(または、あなたが言うことを得られませんでした)? –

答えて

3

変数の値は、その型によって異なります。変数の型がintの場合、その値は整数ですが、変数の型がint*の場合、その値はintの変数のアドレスになります。変数には、構造体、配列などの他の多くの型がある可能性があります。

例から、変数 の値をポインタで指しているとします。いくつかのケースで、これは有効な操作ではないことに注意してください...とにかく

、私はあなたがFrama-C Plugin development: Getting result of value-analysisで前の回答から左辺値を印刷するには、この機能を抽出することができているとします

let pretty_lval fmt stmt lval = 
    let kinstr = Kstmt stmt in (* make a kinstr from a stmt *) 
    let loc = (* make a location from a kinstr + an lval *) 
    !Db.Value.lval_to_loc kinstr ~with_alarms:CilE.warn_none_mode lval 
    in 
    Db.Value.fold_state_callstack 
    (fun state() -> 
     (* for each state in the callstack *) 
     let value = Db.Value.find state loc in (* obtain value for location *) 
     Format.fprintf fmt "%a -> %[email protected]" Printer.pp_lval lval 
     Locations.Location_Bytes.pretty value (* print mapping *) 
    )() ~after:false kinstr 

あなたが、その後することができます探している情報を印刷してください:

if Cil.isPointerType vi.vtype then 
    let lval = (Mem (Cil.evar vi), NoOffset) in 
    pretty_lval fmt stmt lval 
+0

ありがとう、それは私の質問に答えました。値を取得し、それをocaml変数に格納する方法がありますか? どういうわけか、(ソリューションからの)値を持つ関数をパラメータとして呼び出すことによって? –

+1

どういう意味ですか? **上記の 'value'は** ocaml変数です。おそらく文字列変数を意味するでしょうか?この場合、 'Format.asprintf'を使うことができますが、これはむしろocamlの質問です。 – Anne

+0

私が言ったのは、変数に格納されている値を取得したいのです。 例:{{NULL - > {0}}}がある場合は、Ocamlのint変数に0を格納したい(またはそれをリストに追加するなど)。 asprintfを使うと、文字列(かっこ、 - >、NULL ...)が得られます。 Frama-C関数で値を取得する方法はありますか?または文字列を分割する必要はありますか? –

関連する問題