blob: 937180ed3250e0545bfb1d76634bbe6bacc4c2d1 (
plain) (
tree)
|
|
(*
Cours "Sémantique et Application à la Vérification de programmes"
Antoine Miné 2014
Ecole normale supérieure, Paris, France / CNRS / INRIA
*)
(*
Simple driver: parses the file given as argument and prints it back.
You should modify this file to call your functions instead!
*)
open Abstract_syntax_tree
module Env_dom_const = Nonrelational.NonRelational(Constant_domain.Constants)
module Interp_const = Interpret.Make(Env_dom_const)
module Env_dom_interv = Nonrelational.NonRelational(Intervals_domain.Intervals)
module Interp_interv = Interpret.Make(Env_dom_interv)
module Interp_rel = Interpret.Make(Relational_apron.RelationalDomain)
(* option parsing *)
let dump = ref false
let const_interp = ref false
let interv_interp = ref false
let rel_interp = ref false
let get_interp () =
if !interv_interp
then Interp_interv.interpret
else if !rel_interp
then Interp_rel.interpret
else Interp_const.interpret
let ifile = ref ""
let set_var v s = v := s
let usage = "usage: analyzer [options] file.c"
let options = [
"--dump", Arg.Set dump, "Dump program source.";
"--const-interp", Arg.Set const_interp, "Use constant lattice interpreter.";
"--interv-interp", Arg.Set interv_interp, "Use interval lattice interpreter.";
"--rel-interp", Arg.Set rel_interp, "Use relationnal (Apron) lattice.";
]
(* parse and print filename *)
let doit filename =
let prog = File_parser.parse_file filename in
if !dump then Abstract_syntax_printer.print_prog Format.std_formatter prog;
(get_interp ()) prog
(* parses arguments to get filename *)
let main () =
Arg.parse options (set_var ifile) usage;
if !ifile = "" then begin
Format.eprintf "No input file...@.";
exit 1
end;
doit !ifile
let _ = main ()
|