Source file crowbar_utils.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
let () = Kernel.AutoLoadPlugins.off ()
let () = Dynamic.load_module "frama-c-eva"

let dirname = Filename.dirname Sys.executable_name
let cases_dir = "failed_cases"
let fcases_dir = Filepath.of_string cases_dir

let () =
  Filesystem.make_dir ~perm:0o755 fcases_dir

let () =
  match
    Filesystem.with_open_out (Filepath.concat fcases_dir ".empty") ignore
  with
  | Ok () -> ()
  | Error (msg,_) ->
    Format.printf "Error creating file in failed_cases directory: %s@." msg

let filepath =
  let count = ref 0 in
  fun name ->
    incr count;
    let id = string_of_int !count in
    let name =
      dirname ^ "/"
      ^ cases_dir ^ "/"
      ^ name ^ id ^ ".i"
    in
    Filepath.of_string name

let generate_cil_file name =
  let path = filepath name in
  Cil_types.{
    fileName = path;
    globals = [];
    globinit = None;
    globinitcalled = false
  }

let generate_file file =
  let open Filesystem.Operators in
  let filepath = file.Cil_types.fileName in
  Kernel.add_debug_keys Kernel.dkey_print_attrs;
  let result =
    let+ channel = Filesystem.with_open_out filepath in
    match file.globals with
    | [] -> ()
    | _ ->
      let fmt = Format.formatter_of_out_channel channel in
      Format.fprintf fmt "%a@." Printer.pp_file file
  in
  match result with
  | Ok () -> ()
  | Error (msg, file) ->
    Format.printf "error writing to file %a: %s"
      Filepath.pretty file
      msg

let run s f =
  Format.printf "Running Crowbar tests on %s@." s;
  f ()