diff --git a/src/plugins/e-acsl/TODO b/src/plugins/e-acsl/TODO index 02a9b6fff510979d5dd0920d7ae14825345a1419..9f341167868e2dd8410ae0732d5e535715442df5 100644 --- a/src/plugins/e-acsl/TODO +++ b/src/plugins/e-acsl/TODO @@ -19,6 +19,7 @@ - loop invariant - loop variant - grep "not_yet" *.ml +- logical shift (at least in non GMP mode) ######## # CODE # @@ -84,3 +85,4 @@ function call - inclure exemple du E-ACSL Reference Manual - inclure exemple du E-ACSL User Manual - test arith.i: mettre les exemples du ACSL manual about div and modulo +- currently, tests require a non-free version of Frama-C diff --git a/src/plugins/e-acsl/doc/Changelog b/src/plugins/e-acsl/doc/Changelog index 1b49d78daec90f2f3a810c06b42327b24a4b20d2..0851d76b82816f2eb0e3d41599ac92dd63fa68c4 100644 --- a/src/plugins/e-acsl/doc/Changelog +++ b/src/plugins/e-acsl/doc/Changelog @@ -15,6 +15,8 @@ # E-ACSL: the Whole E-ACSL plug-in ############################################################################### +-* E-ACSL [2013/09/04] Fix bug when mixing -e-acsl-prepare and + running E-ACSL in another project (bts #!1473). -* E-ACSL [2013/06/26] Fix crash with typedef on pointer types. - E-ACSL [2013/06/21] Fewer unknown locations. -* E-ACSL [2013/06/18] Fixed bug when generating RTEs on the E-ACSL diff --git a/src/plugins/e-acsl/main.ml b/src/plugins/e-acsl/main.ml index 0250febfdbef6b89b8dad46bee50e635ca1a27ee..31c81c15d5309137e758114393f02f000004ead5 100644 --- a/src/plugins/e-acsl/main.ml +++ b/src/plugins/e-acsl/main.ml @@ -43,7 +43,11 @@ let check = (Datatype.func Datatype.unit Datatype.bool) check -let extended_ast_project: Project.t option ref = ref None +type extended_project = + | To_be_extended + | Already_extended of Project.t option (* None = keep the current project *) + +let extended_ast_project: extended_project ref = ref To_be_extended let unmemoized_extend_ast () = let extend () = @@ -89,27 +93,34 @@ E-ACSL is going to work on a copy."; Kernel.Files.set [ tmpfile ]; extend ()) (); - prj + Some prj end else begin extend (); - Project.current () + None end let extend_ast () = match !extended_ast_project with - | None -> + | To_be_extended -> let prj = unmemoized_extend_ast () in - extended_ast_project := Some prj; - prj - | Some prj -> + extended_ast_project := Already_extended prj; + (match prj with + | None -> Project.current () + | Some prj -> prj) + | Already_extended None -> + Project.current () + | Already_extended(Some prj) -> prj let apply_on_e_acsl_ast f x = let tmp_prj = extend_ast () in let res = Project.on tmp_prj f x in - if not (Project.equal tmp_prj (Project.current ())) then begin - extended_ast_project := None; - Project.remove ~project:tmp_prj () - end; + (match !extended_ast_project with + | To_be_extended -> assert false + | Already_extended None -> () + | Already_extended (Some prj) -> + assert (Project.equal prj tmp_prj); + extended_ast_project := To_be_extended; + Project.remove ~project:tmp_prj ()); res module Resulting_projects =