diff --git a/src/plugins/e-acsl/exit_points.ml b/src/plugins/e-acsl/exit_points.ml index 3ca629adc5a218adbd41037ba0b1b93843598fb5..0833c5c514e1bce517450d414bc6c21bc6de247c 100644 --- a/src/plugins/e-acsl/exit_points.ml +++ b/src/plugins/e-acsl/exit_points.ml @@ -46,10 +46,15 @@ let labelled_jumps: stmt Stmt.Hashtbl.t = Stmt.Hashtbl.create 17 (* Map labelled statements back to gotos which lead to them *) -let clear () = - Stmt.Hashtbl.clear statement_locals; - Stmt.Hashtbl.clear exit_context; - Stmt.Hashtbl.clear labelled_jumps +let reset () = + Stmt.Hashtbl.reset statement_locals; + Stmt.Hashtbl.reset exit_context; + Stmt.Hashtbl.reset labelled_jumps + +let empty () = + Stmt.Hashtbl.length statement_locals = 0 && + Stmt.Hashtbl.length exit_context = 0 && + Stmt.Hashtbl.length labelled_jumps = 0 let filter_vars varlst1 varlst2 = let s1 = Varinfo.Set.of_list varlst1 in @@ -127,5 +132,5 @@ class jump_context = object (self) end let generate fct = - clear (); + assert (empty ()); let _ = Cil.visitCilFunction (new jump_context :> Cil.cilVisitor) fct in () diff --git a/src/plugins/e-acsl/exit_points.mli b/src/plugins/e-acsl/exit_points.mli index ea22508bf9c88bb44054e136bb7a7f8e9d39f550..147b4efccbc6c7a9905e55103b95ebbd615f2e6f 100644 --- a/src/plugins/e-acsl/exit_points.mli +++ b/src/plugins/e-acsl/exit_points.mli @@ -31,6 +31,9 @@ val generate: Cil_types.fundec -> unit (** Visit a function and populate data structures used to compute exit points *) +val reset: unit -> unit +(** Clear all gathered data *) + val delete_vars: Cil_types.stmt -> Cil_types.varinfo list (** Given a statement which potentially leads to an early scope exit (such as goto, break or continue) return the list of local variables which diff --git a/src/plugins/e-acsl/visit.ml b/src/plugins/e-acsl/visit.ml index 36f07a9f81959815edcf3238c9bba0987d9ab5c7..539d6ca2d4d22e79b6a5375ab6361d4d642ec5c1 100644 --- a/src/plugins/e-acsl/visit.ml +++ b/src/plugins/e-acsl/visit.ml @@ -370,19 +370,20 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]" f.sbody.blocals <- blocks method !vfunc f = - Exit_points.generate f; - if generate then + if generate then begin + Exit_points.generate f; let kf = Extlib.the self#current_kf in Options.feedback ~dkey ~level:2 "entering in function %a." Kernel_function.pretty kf; List.iter (fun vi -> vi.vghost <- false) f.slocals; Cil.DoChildrenPost (fun f -> + Exit_points.reset (); self#add_generated_variables_in_function f; Options.feedback ~dkey ~level:2 "function %a done." Kernel_function.pretty kf; f) - else + end else Cil.DoChildren method private is_return old_kf stmt =