-2

私は実際に、これらの 4 つのファイルを含む個人的な Frama-C プラグインを作成しています。

analyseTU_core.ml

module Options = AnalyseTU_options

open Cil_types

let rec member x list1 = match list1 with 
    []->false
    |hd :: tl -> if hd = x then true else member x tl

let rec sandr list2 result= match list2 with
    []-> Format.fprintf out "job termine"
    |hd :: tl -> if member hd result = false then begin result::hd ; Format.fprintf out hd; sandr tl result end
        else sandr tl result

class print_analyse out = object 
    inherit Visitor.frama_c_inplace

method vstmt s=
    let listing =[] in
    let impacted = !Db.Impact.compute_pragmas in
    let impacted2= impacted.Stmt.loc in
    sandr impacted2 listing;
    Cil.DoChildren
   end

と :

analyseTU_register.ml

open AnalyseTU_options
open AnalyseTU_core

let run () =
    if Enabled.get () then
    let filename=OutputFile.get () in
    let chan = open_out filename in
    let fmt = Format.formatter_of_out_channel chan in
    Visitor.visitFramacFileSameGlobals (new print_analyse fmt) (Ast.get ());
    close_out chan

let () = Db.Main.extend run

と :

analyseTU_options.ml

module Self = Plugin.register 
(struct
  let name = "analyse TU"
  let shortname = "TU"
  let help = "impacted statements computation from a source code modification and display consequently unit tests to be run in an output file"
end)

module Enabled = Self.False 
(struct
  let optilon_name = "-TU"
  let help = "when on (off by default), give the unit tests to be run"
end)

module OutputFile = Self.String 
(struct
  let option_name = "-TU-output"
  let default = "TUresults.txt"
  let arg_name = "output-file"
  let help = "name of the output file"
end)

そして最後にメイクファイル:

FRAMAC_SHARE := $(shell frama-c -print-path)
FRAMAC_LIBDIR := $(shell frama-c -print-libpath)
PLUGIN_NAME = analyseTU
PLUGIN_CMO = analyseTU_options analyseTU_core analyseTU_register
include $(FRAMAC_SHARE)/Makefile.dynamic

したがって、make コマンドでコンパイルすると、実際には次のようになります。

FILE "analyseTU_core.ml", line 9 :
Error: unbound value out
make : *** [analyseTU_core.cmo] erreur 2

out がコンパイラに認識されないからだと思っていたので、out を chan に置き換えました。ところで、同じエラーが発生していました。

開発者ガイドのチュートリアルのコードで「out」が定義されていないという事実により、最終的に、このエラーは私が考えているものではないと思います...

遭遇したことはありますか?はいの場合、どのように対処しましたか?

4

1 に答える 1

1

camlspotter が言ったように、エラーは実際outには環境で定義されていないことを意味します。outメソッドの引数としてそれを提供するか、どこかでグローバルフォーマッタを定義する必要があります。別の可能性は、printfの代わりにfprintfprintf出力として使用することstdoutです。したがって、引数としてフォーマッタは必要ありません。最後に、Frama-C の特定のコンテキストでは、Analyse_TU_option.Self.feedbackまたはそのコンパニオン ( resultdebug、...) を出力に使用することを検討する必要があります。

于 2014-09-18T12:19:44.803 に答える