2016-03-29 14 views
0

私はFrama-C-pluginを書いています。このプラグインでは、関数に注釈を追加したいと考えています(たとえば、関数名= "test"の場合、パラメータ== 1と言うrequire句を追加します)。Frama-C:プラグインで注釈を追加

Annotations.add_requiresという関数が見つかりましたが、パラメータの一部(Emitter.t、Identified_predicates)がわかりません。 string-parameterは、述語の関数名または独自の名前ですか?

この機能を使用するにはどうすればよいですか? 例を見せてもらえますか?

+1

何か試しましたか?その "パラメータ"の "テスト"関数( 'kernel_function')と変数(' varinfo')を見つけることができましたか?今、 'add_requires'を使う前に、' parameter == 1'という述語を構築する必要があります。あなたはそれを行う方法を見つけましたか? – Anne

+0

私はkernel_functionとvarinfoを得ました。私は3番目のパラメータ(私はそれが名前だと思います)を "テスト"に設定しました。 私はそれらを構築する方法がわからない2つのパラメータ(最初と最後)があります。エミッタは作成機能を持っていますが、何が何であるかわからないところでいくつかのリストを取得します(Emitter.create "[Code_annot] [] []'を試しました)。他のいくつかの奇妙なものが含まれているので、述語リスト(名前とエミッタで他の2つの試みをテストすることはできません) –

+0

これを試しました: 'let pred = Cil_types.Ptrue in let id_pred = {ip_name = []; ip_loc = location; ip_id = 1; ip_content = pred} 'ですが、どの場所を使用するのかわかりませんか? –

答えて

1

エミッタはあなたのプラグインを識別し、修正するものと宣言しなければなりません。あなたのケースでは、あなたが仕様にプロパティを追加すると、あなたがそれを構築することができます。今すぐ

let emitter = Emitter.create "My plugin" [ Emitter.Funspec ] 
    ~correctness:[] ~tuning:[] 

kernel_functionのためにこれは最初のパラメータはに等しいという前提を構築する方法の例です。 1つ:

let add_pre kf = match Kernel_function.get_formals kf with 
    | [] ->() 
    | c_var::_ -> 
    let l_var = Cil.cvar_to_lvar c_var in 
    let var_term = Logic_const.tvar l_var in 
    let cnst_term = Logic_const.tinteger 1 in 
    let eq_pred = Logic_const.prel (Cil_types.Req, var_term, cnst_term) in 
    let pred = Logic_const.new_predicate eq_pred in 
    let bname = Cil.default_behavior_name in 
    Annotations.add_requires emitter kf ~behavior:bname [pred] 
+0

コードスニペットを使用しています。 Cコードでadd_preの呼び出しをコメントにすると、値分析は 'config_0 - > \t {{NULL - > {1}}}'と表示しますが、あなたの関数を必要とし、あなたの関数を呼び出すためには、 'config_0 - > \t {{NULL - > [--..--]}}'のようになります。どちらの場合も、関数の呼び出しの後に '!Db.Value.compute()'を呼び出します(これは成功したケースでコメントされています) 同じように反応しませんか? –

+0

プロパティが正しく追加されているかどうかを確認するには、 '-print'オプションを使用してみてください。 – Anne

+0

また、 'frama-c file.c -your-plugin-option -then -val'(これはここで動作するようです)を試してみてください。 – Anne

関連する問題