2014-09-18 4 views
-2

я на самом деле на написание Personnal Frama-C плагин, содержащие эти четыре файла:величину несвязанных с отказом от Format.fprintf

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) 

и, наконец, Makefile:

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 

так, когда я скомпилировать его с помощью команды макияжем, на самом деле я получаю:

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

i так думал, что это произошло из-за того, что «out» неизвестен компилятору, и я переместил «out» на chan. Похоже, я получал ту же ошибку.

Тот факт, что «из» не определен в коде учебника руководства разработчика делает, наконец, я думаю, что эта ошибка не то, что я думаю, что это ...

Вы когда-нибудь сталкивались с этим? если да, то как вы с этим справились?

+1

Просто вне не определено. Прежде чем перейти к таким сложным приложениям, вы должны играть более простые примеры OCaml. – camlspotter

ответ

1

Как сказано camlspotter, ошибка действительно означает, что out не определен в среде. Вы либо должны предоставить его как аргумент своего метода, либо определить глобальный формат out. Другая возможность заключается в использовании printf вместо fprintf, так как printf выходов на stdout, поэтому в качестве аргумента не требуется форматтер. Наконец, в конкретном контексте Frama-C вам следует использовать Analyse_TU_option.Self.feedback или один из его спутников (result, debug, ...) для ваших выходов.