diff --git a/src/plugins/e-acsl/env.ml b/src/plugins/e-acsl/env.ml index 7224d5519e39957161ade8c2d5719d564b076592..9d13aea4bcfe717f7187970ba50c9fab8e864c49 100644 --- a/src/plugins/e-acsl/env.ml +++ b/src/plugins/e-acsl/env.ml @@ -367,29 +367,30 @@ let transfer ~from env = match from.env_stack, env.env_stack with { env with env_stack = { local with block_info = new_blk } :: tl } | _, _ -> assert false - + type where = Before | Middle | After -let pop_and_get env stmt ~global_clear where = -(* Options.feedback "pop_and_get (%d)" (List.length env.env_stack);*) +let pop_and_get ?(split=false) env stmt ~global_clear where = + let split = split && stmt.labels = [] in +(* Options.feedback "pop_and_get from %a (%b)" Printer.pp_stmt stmt split;*) let local_env, tl = top false env in - let clear = + let clear = if global_clear then begin Varname.clear (); env.global_mpz_tbl.clear_stmts @ local_env.mpz_tbl.clear_stmts end else local_env.mpz_tbl.clear_stmts in -(* Options.feedback "clearing %d mpz (global_clear: %b)" +(* Options.feedback "clearing %d mpz (global_clear: %b)" (List.length clear) global_clear;*) let block = local_env.block_info in - let b = - let pre_stmts, stmt = + let b = + let pre_stmts, stmt = let rec extract stmt acc = function - | [] -> acc, stmt - | _ :: tl -> - match stmt.skind with - | Block { bstmts = [ fst; snd ] } -> extract snd (fst :: acc) tl - | _ -> + | [] -> acc, stmt + | _ :: tl -> + match stmt.skind with + | Block { bstmts = [ fst; snd ] } -> extract snd (fst :: acc) tl + | _ -> Kernel.fatal "experting a block containing 2 statements instead of %a" Printer.pp_stmt stmt @@ -401,15 +402,43 @@ let pop_and_get env stmt ~global_clear where = | Instr(Skip _) -> l | _ -> stmt :: l in - let stmts = match where with + let stmts = + match where with | Before -> cat stmt (acc_list_rev (List.rev clear) new_s) | Middle -> acc_list_rev (cat stmt (List.rev clear)) new_s - | After -> acc_list_rev (acc_list_rev (cat stmt []) clear) new_s + | After -> + (* if [split], do not put the given [stmt] in the generated block *) + let stmts = if split then [] else cat stmt [] in + acc_list_rev (acc_list_rev stmts clear) new_s in Cil.mkBlock (acc_list_rev stmts pre_stmts) in b.blocals <- acc_list_rev b.blocals block.new_block_vars; - b, { env with env_stack = tl } + let b = + (* blocks with local cannot be transient (see doc in cil.ml), + while transient blocks prevent the E-ACSL labeling strategy from working + properly: no transient block in that cases. *) + if b.blocals = [] && stmt.labels = [] then Cil.transient_block b + else b + in + let final_blk = + (* if [split], put the generated code in a distinct sub-block and + add the given [stmt] afterwards. This way, we have the guarantee that + the final block does not contain any local, so may be transient. *) + if split then + match stmt.skind with + | Instr (Skip _) -> b + | _ -> + let sblock = Cil.mkStmt ~valid_sid:true (Block b) in + Cil.transient_block (Cil.mkBlock [ sblock; stmt ]) + else + b + in + (* remove superflous brackets inside the generated block *) + let final_blk = Cil.flatten_transient_sub_blocks final_blk in + (* remove the non-scoping mark of the outermost block *) + let final_blk = Cil.block_of_transient final_blk in + final_blk, { env with env_stack = tl } let get_generated_variables env = List.rev env.new_global_vars diff --git a/src/plugins/e-acsl/env.mli b/src/plugins/e-acsl/env.mli index 51d40665385a737a24d99e6e8d560ecd6bbf46c4..a55f8cc239e070013c58f7189907e0513df07eb9 100644 --- a/src/plugins/e-acsl/env.mli +++ b/src/plugins/e-acsl/env.mli @@ -84,12 +84,15 @@ val push: t -> t (** Push a new local context in the environment *) type where = Before | Middle | After -val pop_and_get: t -> stmt -> global_clear:bool -> where -> block * t +val pop_and_get: + ?split:bool -> t -> stmt -> global_clear:bool -> where -> block * t (** Pop the last local context and get back the corresponding new block containing the given [stmt] at the given place ([Before] is before the code corresponding to annotations, [After] is after this code and [Middle] is between the stmt corresponding to annotations and the ones for freeing the - memory. *) + memory. When [where] is [After], set [split] to true in order to generate + one block which contains exactly 2 stmt: one for [stmt] and one sub-block + for the generated stmts. *) val pop: t -> t (** Pop the last local context (ignore the corresponding new block if any *) diff --git a/src/plugins/e-acsl/man/e-acsl-gcc.sh.1 b/src/plugins/e-acsl/man/e-acsl-gcc.sh.1 index 979eb21e4ca0934a1ef2d85cc704a5ea8b1f0c82..c7328e163a18a2e55ac9ee2be62c12ecef0fe30f 100644 --- a/src/plugins/e-acsl/man/e-acsl-gcc.sh.1 +++ b/src/plugins/e-acsl/man/e-acsl-gcc.sh.1 @@ -157,7 +157,17 @@ first \fIframa-c\fP executable found in the system path is used. .B -G, --gcc=\fI<FILE> the name of the \fBGCC\fP executable. By default the first \fIgcc\fP executable found in the system path is used. - +.TP +.B --then +Separate with a \fB-then\fP the first \fBFrama-C\fP options from the actual +launch of the \fBE-ACSL\fP plugin. Prepends \fB-e-acsl-prepare\fP to the list +of options passed to \fBFrama-C\fP. +.TP +.B --e-acsl-extra=\fI<OPTS> +Adds \fI<OPTS>\fP to the list of options that will be given to the \fBE-ACSL\fP +analysis. Only useful when \fB--then\fP is in use, in which case \fI<OPTS>\fP +will be placed after the \fB-then\fP on \fBFrama-C\fP's command-line. Otherwise, +equivalent to \fB--frama-c-extra\fP .SH EXIT STATUS .TP .B 0 diff --git a/src/plugins/e-acsl/quantif.ml b/src/plugins/e-acsl/quantif.ml index b2f47a295b54b1d2d1d62a8871a4d47a2fa7afae..c9415e14d91f9ec10c0580b98167edd965b8729f 100644 --- a/src/plugins/e-acsl/quantif.ml +++ b/src/plugins/e-acsl/quantif.ml @@ -159,8 +159,7 @@ let convert kf env loc is_forall p bounded_vars hyps goal = ~global_clear:false Env.After in - (* TODO: could be optimised if [pop_and_get] would return a list of - stmts *) + let blk = Cil.flatten_transient_sub_blocks blk in [ mkStmt ~valid_sid:true (Block blk) ], env | (t1, rel1, logic_x, rel2, t2) :: tl -> let ctx = diff --git a/src/plugins/e-acsl/scripts/e-acsl-gcc.sh b/src/plugins/e-acsl/scripts/e-acsl-gcc.sh index 455049c6c481295b3aff003ad8a2b3e512da7286..72934fa95e21b91987c0c4ab07f054c51d9a9c0f 100755 --- a/src/plugins/e-acsl/scripts/e-acsl-gcc.sh +++ b/src/plugins/e-acsl/scripts/e-acsl-gcc.sh @@ -194,7 +194,7 @@ LONGOPTIONS="help,compile,compile-only,debug:,ocode:,oexec:,verbose:, frama-c-only,extra-cpp-args:,frama-c-stdlib,full-mmodel,gmp,quiet,logfile:, ld-flags:,cpp-flags:,frama-c-extra:,memory-model:, frama-c:,gcc:,e-acsl-share:,instrumented-only,rte:,oexec-e-acsl:,check - print-mmodels,rt-debug,rte-select:" + print-mmodels,rt-debug,rte-select:,then,e-acsl-extra:" SHORTOPTIONS="h,c,C,d:,D,o:,O:,v:,f,E:,L,M,l:,e:,g,q,s:,F:,m:,I:,G:,X,a:,V" # Prefix for an error message due to wrong arguments ERROR="ERROR parsing arguments:" @@ -225,6 +225,7 @@ OPTION_INSTRUMENTED_ONLY= # Do not compile original code OPTION_RTE= # Enable assertion generation OPTION_CHECK= # Check AST integrity OPTION_RTE_SELECT= # Generate assertions for these functions only +OPTION_THEN= # Adds -then in front of -e-acsl in FC command. # Supported memory model names SUPPORTED_MMODELS="bittree,segment" @@ -453,6 +454,17 @@ do echo $SUPPORTED_MMODELS exit 0 ;; + #Separate extra Frama-C flags from e-acsl launch with -then. + --then) + shift; + OPTION_THEN=-then + FRAMAC_FLAGS="-e-acsl-prepare $FRAMAC_FLAGS" + ;; + --e-acsl-extra) + shift; + OPTION_EACSL="$1 $OPTION_EACSL" + shift; + ;; esac done shift; @@ -520,6 +532,10 @@ if [ -n "$OPTION_EACSL_SHARE" ]; then EACSL_SHARE="$OPTION_EACSL_SHARE" fi +if [ -n "$OPTION_THEN" ]; then + FRAMAC_FLAGS="-e-acsl-share=$EACSL_SHARE $FRAMAC_FLAGS"; +fi + # Select optimization flags for both instrumented and noon-instrumented code # compilation if [ -n "$OPTION_RT_DEBUG" ]; then @@ -581,6 +597,7 @@ fi # Build E-ACSL plugin argument string if [ -n "$OPTION_EACSL" ]; then EACSL_FLAGS=" + $OPTION_THEN $OPTION_EACSL $OPTION_GMP $OPTION_FULL_MMODEL diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1307.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1307.c index 5717cea664861ca0917acd17d42a8851651ba87e..caa221c7af4e0b90fcc074663440e0a315d67ca1 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1307.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1307.c @@ -135,14 +135,14 @@ void __gen_e_acsl_bar(float *Mtmin_in, float *Mwmin, float *Mtmin_out) (void *)(& Mtmin_out)); __e_acsl_assert(__gen_e_acsl_valid_3,(char *)"Precondition", (char *)"bar",(char *)"\\valid(Mtmin_out)",19); - __gen_e_acsl_at_6 = Mwmin; - __gen_e_acsl_at_5 = Mtmin_in; - __gen_e_acsl_at_4 = Mwmin; - __gen_e_acsl_at_3 = Mtmin_in; - __gen_e_acsl_at_2 = Mtmin_in; - __gen_e_acsl_at = Mtmin_out; - bar(Mtmin_in,Mwmin,Mtmin_out); } + __gen_e_acsl_at_6 = Mwmin; + __gen_e_acsl_at_5 = Mtmin_in; + __gen_e_acsl_at_4 = Mwmin; + __gen_e_acsl_at_3 = Mtmin_in; + __gen_e_acsl_at_2 = Mtmin_in; + __gen_e_acsl_at = Mtmin_out; + bar(Mtmin_in,Mwmin,Mtmin_out); { int __gen_e_acsl_valid_read; int __gen_e_acsl_valid_read_2; @@ -248,11 +248,11 @@ void __gen_e_acsl_foo(float *Mtmax_in, float *Mwmax, float *Mtmax_out) (void *)(& Mtmax_out)); __e_acsl_assert(__gen_e_acsl_valid_3,(char *)"Precondition", (char *)"foo",(char *)"\\valid(Mtmax_out)",7); - __gen_e_acsl_at_3 = Mwmax; - __gen_e_acsl_at_2 = Mtmax_in; - __gen_e_acsl_at = Mtmax_out; - foo(Mtmax_in,Mwmax,Mtmax_out); } + __gen_e_acsl_at_3 = Mwmax; + __gen_e_acsl_at_2 = Mtmax_in; + __gen_e_acsl_at = Mtmax_out; + foo(Mtmax_in,Mwmax,Mtmax_out); { int __gen_e_acsl_valid_read; int __gen_e_acsl_valid_read_2; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1395.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1395.c index 4a502b1e822ebad506c270209e3dc14b42d87397..ce014ccd5a215298c2a3c9c4ae1dd555b8370ba5 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1395.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1395.c @@ -12,10 +12,8 @@ int fact(int n) __retres = 1; goto return_label; } - { /* sequence */ - tmp = __gen_e_acsl_fact(n - 1); - ; - } + tmp = __gen_e_acsl_fact(n - 1); + ; __retres = n * tmp; return_label: return __retres; } diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1478.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1478.c index 6e3a6dfa88ee40d0fd1d3c907dee3889c686d5da..d7ada2c7115bd789170d9402edb44f320bf154f5 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1478.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1478.c @@ -36,8 +36,8 @@ void __gen_e_acsl_loop(void) (char *)"\\valid(global_i_ptr)",10); __e_acsl_assert(global_i_ptr == & global_i,(char *)"Precondition", (char *)"loop",(char *)"global_i_ptr == &global_i",11); - loop(); } + loop(); return; } diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1717.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1717.c index 8849e28f584d838d51d8ca051fbd5b9802932821..c403fd5ceeb4ef6966cf42bd8689e7278b27f9d7 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1717.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1717.c @@ -11,32 +11,32 @@ int main(void) __e_acsl_full_init((void *)(& a)); goto lbl_1; lbl_2: - /*@ assert \valid(p); */ - { - int __gen_e_acsl_initialized; - int __gen_e_acsl_and; - __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& p), - sizeof(int *)); - if (__gen_e_acsl_initialized) { - int __gen_e_acsl_valid; - __gen_e_acsl_valid = __e_acsl_valid((void *)p,sizeof(int),(void *)p, - (void *)(& p)); - __gen_e_acsl_and = __gen_e_acsl_valid; - } - else __gen_e_acsl_and = 0; - __e_acsl_assert(__gen_e_acsl_and,(char *)"Assertion",(char *)"main", - (char *)"\\valid(p)",10); + /*@ assert \valid(p); */ + { + int __gen_e_acsl_initialized; + int __gen_e_acsl_and; + __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& p), + sizeof(int *)); + if (__gen_e_acsl_initialized) { + int __gen_e_acsl_valid; + __gen_e_acsl_valid = __e_acsl_valid((void *)p,sizeof(int),(void *)p, + (void *)(& p)); + __gen_e_acsl_and = __gen_e_acsl_valid; } - __retres = 0; - goto return_label; + else __gen_e_acsl_and = 0; + __e_acsl_assert(__gen_e_acsl_and,(char *)"Assertion",(char *)"main", + (char *)"\\valid(p)",10); + } + __retres = 0; + goto return_label; lbl_1: __e_acsl_full_init((void *)(& p)); p = & a; goto lbl_2; return_label: - __e_acsl_delete_block((void *)(& p)); - __e_acsl_delete_block((void *)(& a)); - __e_acsl_memory_clean(); - return __retres; + __e_acsl_delete_block((void *)(& p)); + __e_acsl_delete_block((void *)(& a)); + __e_acsl_memory_clean(); + return __retres; } diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1718.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1718.c index 6a1f48467405e520ce022c13c0ce394a8edcf3f6..bdf3b4a98f0e0b17165e86ea70c856883623a54f 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1718.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1718.c @@ -11,32 +11,32 @@ int main(void) __e_acsl_full_init((void *)(& a)); goto lbl_1; lbl_2: - /*@ assert \valid(p); */ - { - int __gen_e_acsl_initialized; - int __gen_e_acsl_and; - __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& p), - sizeof(int *)); - if (__gen_e_acsl_initialized) { - int __gen_e_acsl_valid; - __gen_e_acsl_valid = __e_acsl_valid((void *)p,sizeof(int),(void *)p, - (void *)(& p)); - __gen_e_acsl_and = __gen_e_acsl_valid; - } - else __gen_e_acsl_and = 0; - __e_acsl_assert(__gen_e_acsl_and,(char *)"Assertion",(char *)"main", - (char *)"\\valid(p)",13); + /*@ assert \valid(p); */ + { + int __gen_e_acsl_initialized; + int __gen_e_acsl_and; + __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& p), + sizeof(int *)); + if (__gen_e_acsl_initialized) { + int __gen_e_acsl_valid; + __gen_e_acsl_valid = __e_acsl_valid((void *)p,sizeof(int),(void *)p, + (void *)(& p)); + __gen_e_acsl_and = __gen_e_acsl_valid; } - __retres = 0; - goto return_label; + else __gen_e_acsl_and = 0; + __e_acsl_assert(__gen_e_acsl_and,(char *)"Assertion",(char *)"main", + (char *)"\\valid(p)",13); + } + __retres = 0; + goto return_label; lbl_1: __e_acsl_full_init((void *)(& p)); p = & a; goto lbl_2; return_label: - __e_acsl_delete_block((void *)(& p)); - __e_acsl_delete_block((void *)(& a)); - __e_acsl_memory_clean(); - return __retres; + __e_acsl_delete_block((void *)(& p)); + __e_acsl_delete_block((void *)(& a)); + __e_acsl_memory_clean(); + return __retres; } diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1740.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1740.c index 1be5aa98ba9199f85d66a4d0da156a02c667e2b9..7421ceccaa3d08fdffe92c36a3c6dd22ceb647ab 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1740.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1740.c @@ -33,27 +33,27 @@ int main(void) __e_acsl_delete_block((void *)(& a)); } L: - /*@ assert ¬\valid(p); */ - { - int __gen_e_acsl_initialized_2; - int __gen_e_acsl_and_2; - __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)(& p), - sizeof(int *)); - if (__gen_e_acsl_initialized_2) { - int __gen_e_acsl_valid_2; - /*@ assert Value: dangling_pointer: ¬\dangling(&p); */ - __gen_e_acsl_valid_2 = __e_acsl_valid((void *)p,sizeof(int), - (void *)p,(void *)(& p)); - __gen_e_acsl_and_2 = __gen_e_acsl_valid_2; - } - else __gen_e_acsl_and_2 = 0; - __e_acsl_assert(! __gen_e_acsl_and_2,(char *)"Assertion", - (char *)"main",(char *)"!\\valid(p)",16); + /*@ assert ¬\valid(p); */ + { + int __gen_e_acsl_initialized_2; + int __gen_e_acsl_and_2; + __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)(& p), + sizeof(int *)); + if (__gen_e_acsl_initialized_2) { + int __gen_e_acsl_valid_2; + /*@ assert Value: dangling_pointer: ¬\dangling(&p); */ + __gen_e_acsl_valid_2 = __e_acsl_valid((void *)p,sizeof(int),(void *)p, + (void *)(& p)); + __gen_e_acsl_and_2 = __gen_e_acsl_valid_2; } - __retres = 0; - __e_acsl_delete_block((void *)(& p)); - __e_acsl_memory_clean(); - return __retres; + else __gen_e_acsl_and_2 = 0; + __e_acsl_assert(! __gen_e_acsl_and_2,(char *)"Assertion",(char *)"main", + (char *)"!\\valid(p)",16); + } + __retres = 0; + __e_acsl_delete_block((void *)(& p)); + __e_acsl_memory_clean(); + return __retres; } diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1837.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1837.c index 26fe680be04f9f5a32ed9b49e43e941e3a6751a8..680fca00da0f006892963bba43099c5448d5de8b 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1837.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1837.c @@ -90,12 +90,10 @@ int main(void) int i = 4; while (1) { int tmp; - { /* sequence */ - tmp = i; - /*@ assert Value: signed_overflow: -2147483648 ≤ i - 1; */ - i --; - ; - } + tmp = i; + /*@ assert Value: signed_overflow: -2147483648 ≤ i - 1; */ + i --; + ; if (! tmp) break; { char *s = (char *)__gen_e_acsl_literal_string_3; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2192.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2192.c index c56a8ba6a99fc28deda2c79dc3146c59fe5c74f0..db197044b2847d2a17979216d517bef48bd619bb 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2192.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2192.c @@ -19,10 +19,8 @@ int main(int argc, char **argv) int __retres; __e_acsl_memory_init(& argc,& argv,(size_t)8); __e_acsl_globals_init(); - { /* sequence */ - argc = __gen_e_acsl_atoi((char const *)n); - a = argc; - } + argc = __gen_e_acsl_atoi((char const *)n); + a = argc; __retres = 0; __e_acsl_delete_block((void *)(& n)); __e_acsl_memory_clean(); diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_at.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_at.c index 0be34f3867c94a594016eb9589084e0d1dd513c4..50e175fcb044acba4e3d318107f89dc288c160a6 100644 --- a/src/plugins/e-acsl/tests/gmp/oracle/gen_at.c +++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_at.c @@ -47,61 +47,60 @@ void g(int *p, int *q) __e_acsl_initialize((void *)q,sizeof(int)); *q = 0; L1: - { - int __gen_e_acsl_valid_read_3; - __gen_e_acsl_valid_read_3 = __e_acsl_valid_read((void *)q,sizeof(int), - (void *)q, - (void *)(& q)); - __e_acsl_assert(__gen_e_acsl_valid_read_3,(char *)"RTE",(char *)"g", - (char *)"mem_access: \\valid_read(q)",28); - __gen_e_acsl_at_3 = *q; - } - { - int __gen_e_acsl_valid_read; - __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)q,sizeof(int), + { + int __gen_e_acsl_valid_read_3; + __gen_e_acsl_valid_read_3 = __e_acsl_valid_read((void *)q,sizeof(int), (void *)q,(void *)(& q)); - __e_acsl_assert(__gen_e_acsl_valid_read,(char *)"RTE",(char *)"g", - (char *)"mem_access: \\valid_read(q)",26); - __gen_e_acsl_at = *q; - } - __e_acsl_initialize((void *)p,sizeof(int)); + __e_acsl_assert(__gen_e_acsl_valid_read_3,(char *)"RTE",(char *)"g", + (char *)"mem_access: \\valid_read(q)",28); + __gen_e_acsl_at_3 = *q; + } + { + int __gen_e_acsl_valid_read; + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)q,sizeof(int), + (void *)q,(void *)(& q)); + __e_acsl_assert(__gen_e_acsl_valid_read,(char *)"RTE",(char *)"g", + (char *)"mem_access: \\valid_read(q)",26); + __gen_e_acsl_at = *q; + } + __e_acsl_initialize((void *)p,sizeof(int)); *p = 2; __e_acsl_initialize((void *)(p + 1),sizeof(int)); *(p + 1) = 3; __e_acsl_initialize((void *)q,sizeof(int)); *q = 1; L2: - { - int __gen_e_acsl_valid_read_2; - __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)(p + __gen_e_acsl_at), - sizeof(int),(void *)p, - (void *)(& p)); - __e_acsl_assert(__gen_e_acsl_valid_read_2,(char *)"RTE",(char *)"g", - (char *)"mem_access: \\valid_read(p + __gen_e_acsl_at)", - 26); - __gen_e_acsl_at_2 = *(p + __gen_e_acsl_at); - } - A = 4; + { + int __gen_e_acsl_valid_read_2; + __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)(p + __gen_e_acsl_at), + sizeof(int),(void *)p, + (void *)(& p)); + __e_acsl_assert(__gen_e_acsl_valid_read_2,(char *)"RTE",(char *)"g", + (char *)"mem_access: \\valid_read(p + __gen_e_acsl_at)", + 26); + __gen_e_acsl_at_2 = *(p + __gen_e_acsl_at); + } + A = 4; /*@ assert \at(*(p + \at(*q,L1)),L2) ≡ 2; */ __e_acsl_assert(__gen_e_acsl_at_2 == 2,(char *)"Assertion",(char *)"g", (char *)"\\at(*(p + \\at(*q,L1)),L2) == 2",26); L3: - /*@ assert \at(*(p + \at(*q,L1)),Here) ≡ 2; */ - { - int __gen_e_acsl_valid_read_4; - __gen_e_acsl_valid_read_4 = __e_acsl_valid_read((void *)(p + __gen_e_acsl_at_3), - sizeof(int),(void *)p, - (void *)(& p)); - __e_acsl_assert(__gen_e_acsl_valid_read_4,(char *)"RTE",(char *)"g", - (char *)"mem_access: \\valid_read(p + __gen_e_acsl_at_3)", - 28); - __e_acsl_assert(*(p + __gen_e_acsl_at_3) == 2,(char *)"Assertion", - (char *)"g", - (char *)"\\at(*(p + \\at(*q,L1)),Here) == 2",28); - } - __e_acsl_delete_block((void *)(& q)); - __e_acsl_delete_block((void *)(& p)); - return; + /*@ assert \at(*(p + \at(*q,L1)),Here) ≡ 2; */ + { + int __gen_e_acsl_valid_read_4; + __gen_e_acsl_valid_read_4 = __e_acsl_valid_read((void *)(p + __gen_e_acsl_at_3), + sizeof(int),(void *)p, + (void *)(& p)); + __e_acsl_assert(__gen_e_acsl_valid_read_4,(char *)"RTE",(char *)"g", + (char *)"mem_access: \\valid_read(p + __gen_e_acsl_at_3)", + 28); + __e_acsl_assert(*(p + __gen_e_acsl_at_3) == 2,(char *)"Assertion", + (char *)"g",(char *)"\\at(*(p + \\at(*q,L1)),Here) == 2", + 28); + } + __e_acsl_delete_block((void *)(& q)); + __e_acsl_delete_block((void *)(& p)); + return; } /*@ ensures \result ≡ \old(x); */ @@ -129,14 +128,14 @@ int main(void) __e_acsl_full_init((void *)(& x)); x = __gen_e_acsl_h(0); L: - __gen_e_acsl_at_3 = (long)x; - __gen_e_acsl_at_2 = x + 1L; - __gen_e_acsl_at = x; - /*@ assert x ≡ 0; */ - __e_acsl_assert(x == 0,(char *)"Assertion",(char *)"main", - (char *)"x == 0",43); - __e_acsl_full_init((void *)(& x)); - x = 1; + __gen_e_acsl_at_3 = (long)x; + __gen_e_acsl_at_2 = x + 1L; + __gen_e_acsl_at = x; + /*@ assert x ≡ 0; */ + __e_acsl_assert(x == 0,(char *)"Assertion",(char *)"main",(char *)"x == 0", + 43); + __e_acsl_full_init((void *)(& x)); + x = 1; __e_acsl_full_init((void *)(& x)); x = 2; __gen_e_acsl_f(); diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_at2.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_at2.c index 832354a78aa7c3b9a7165766abfc17b58e1206e8..5b54cad0dde4309b9fc5cd75328f89681d8810fd 100644 --- a/src/plugins/e-acsl/tests/gmp/oracle/gen_at2.c +++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_at2.c @@ -26,16 +26,16 @@ void f(void) } A = 1; F: - __gmpz_init_set(__gen_e_acsl_at_3, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_at)); - { - __e_acsl_mpz_t __gen_e_acsl_A_2; - __gmpz_init_set_si(__gen_e_acsl_A_2,(long)A); - __gmpz_init_set(__gen_e_acsl_at_2, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_A_2)); - __gmpz_clear(__gen_e_acsl_A_2); - } - A = 2; + __gmpz_init_set(__gen_e_acsl_at_3, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_at)); + { + __e_acsl_mpz_t __gen_e_acsl_A_2; + __gmpz_init_set_si(__gen_e_acsl_A_2,(long)A); + __gmpz_init_set(__gen_e_acsl_at_2, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_A_2)); + __gmpz_clear(__gen_e_acsl_A_2); + } + A = 2; /*@ assert \at(A,Pre) ≡ 0; */ { __e_acsl_mpz_t __gen_e_acsl_; @@ -104,45 +104,44 @@ void g(int *p, int *q) __e_acsl_initialize((void *)q,sizeof(int)); *q = 0; L1: - { - int __gen_e_acsl_valid_read_3; - __gen_e_acsl_valid_read_3 = __e_acsl_valid_read((void *)q,sizeof(int), - (void *)q, - (void *)(& q)); - __e_acsl_assert(__gen_e_acsl_valid_read_3,(char *)"RTE",(char *)"g", - (char *)"mem_access: \\valid_read(q)",28); - __gen_e_acsl_at_3 = *q; - } - { - int __gen_e_acsl_valid_read; - __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)q,sizeof(int), + { + int __gen_e_acsl_valid_read_3; + __gen_e_acsl_valid_read_3 = __e_acsl_valid_read((void *)q,sizeof(int), (void *)q,(void *)(& q)); - __e_acsl_assert(__gen_e_acsl_valid_read,(char *)"RTE",(char *)"g", - (char *)"mem_access: \\valid_read(q)",26); - __gen_e_acsl_at = *q; - } - __e_acsl_initialize((void *)p,sizeof(int)); + __e_acsl_assert(__gen_e_acsl_valid_read_3,(char *)"RTE",(char *)"g", + (char *)"mem_access: \\valid_read(q)",28); + __gen_e_acsl_at_3 = *q; + } + { + int __gen_e_acsl_valid_read; + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)q,sizeof(int), + (void *)q,(void *)(& q)); + __e_acsl_assert(__gen_e_acsl_valid_read,(char *)"RTE",(char *)"g", + (char *)"mem_access: \\valid_read(q)",26); + __gen_e_acsl_at = *q; + } + __e_acsl_initialize((void *)p,sizeof(int)); *p = 2; __e_acsl_initialize((void *)(p + 1),sizeof(int)); *(p + 1) = 3; __e_acsl_initialize((void *)q,sizeof(int)); *q = 1; L2: - { - int __gen_e_acsl_valid_read_2; - __e_acsl_mpz_t __gen_e_acsl_; - __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)(p + __gen_e_acsl_at), - sizeof(int),(void *)p, - (void *)(& p)); - __e_acsl_assert(__gen_e_acsl_valid_read_2,(char *)"RTE",(char *)"g", - (char *)"mem_access: \\valid_read(p + __gen_e_acsl_at)", - 26); - __gmpz_init_set_si(__gen_e_acsl_,(long)*(p + __gen_e_acsl_at)); - __gmpz_init_set(__gen_e_acsl_at_2, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_)); - __gmpz_clear(__gen_e_acsl_); - } - A = 4; + { + int __gen_e_acsl_valid_read_2; + __e_acsl_mpz_t __gen_e_acsl_; + __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)(p + __gen_e_acsl_at), + sizeof(int),(void *)p, + (void *)(& p)); + __e_acsl_assert(__gen_e_acsl_valid_read_2,(char *)"RTE",(char *)"g", + (char *)"mem_access: \\valid_read(p + __gen_e_acsl_at)", + 26); + __gmpz_init_set_si(__gen_e_acsl_,(long)*(p + __gen_e_acsl_at)); + __gmpz_init_set(__gen_e_acsl_at_2, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_)); + __gmpz_clear(__gen_e_acsl_); + } + A = 4; /*@ assert \at(*(p + \at(*q,L1)),L2) ≡ 2; */ { __e_acsl_mpz_t __gen_e_acsl__2; @@ -155,24 +154,24 @@ void g(int *p, int *q) __gmpz_clear(__gen_e_acsl__2); } L3: - /*@ assert \at(*(p + \at(*q,L1)),Here) ≡ 2; */ - { - __e_acsl_mpz_t __gen_e_acsl__3; - __e_acsl_mpz_t __gen_e_acsl__4; - int __gen_e_acsl_eq_2; - __gmpz_init_set_si(__gen_e_acsl__3,(long)*(p + __gen_e_acsl_at_3)); - __gmpz_init_set_si(__gen_e_acsl__4,2L); - __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl__3), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__4)); - __e_acsl_assert(__gen_e_acsl_eq_2 == 0,(char *)"Assertion",(char *)"g", - (char *)"\\at(*(p + \\at(*q,L1)),Here) == 2",28); - __gmpz_clear(__gen_e_acsl__3); - __gmpz_clear(__gen_e_acsl__4); - } - __e_acsl_delete_block((void *)(& q)); - __e_acsl_delete_block((void *)(& p)); - __gmpz_clear(__gen_e_acsl_at_2); - return; + /*@ assert \at(*(p + \at(*q,L1)),Here) ≡ 2; */ + { + __e_acsl_mpz_t __gen_e_acsl__3; + __e_acsl_mpz_t __gen_e_acsl__4; + int __gen_e_acsl_eq_2; + __gmpz_init_set_si(__gen_e_acsl__3,(long)*(p + __gen_e_acsl_at_3)); + __gmpz_init_set_si(__gen_e_acsl__4,2L); + __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl__3), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__4)); + __e_acsl_assert(__gen_e_acsl_eq_2 == 0,(char *)"Assertion",(char *)"g", + (char *)"\\at(*(p + \\at(*q,L1)),Here) == 2",28); + __gmpz_clear(__gen_e_acsl__3); + __gmpz_clear(__gen_e_acsl__4); + } + __e_acsl_delete_block((void *)(& q)); + __e_acsl_delete_block((void *)(& p)); + __gmpz_clear(__gen_e_acsl_at_2); + return; } /*@ ensures \result ≡ \old(x); */ @@ -199,52 +198,52 @@ int main(void) __e_acsl_full_init((void *)(& x)); x = __gen_e_acsl_h(0); L: - { - __e_acsl_mpz_t __gen_e_acsl_x_4; - __gmpz_init_set_si(__gen_e_acsl_x_4,(long)x); - __gmpz_init_set(__gen_e_acsl_at, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_4)); - __gmpz_clear(__gen_e_acsl_x_4); - } - { - __e_acsl_mpz_t __gen_e_acsl_x_3; - __e_acsl_mpz_t __gen_e_acsl__3; - __e_acsl_mpz_t __gen_e_acsl_add; - __gmpz_init_set_si(__gen_e_acsl_x_3,(long)x); - __gmpz_init_set_si(__gen_e_acsl__3,1L); - __gmpz_init(__gen_e_acsl_add); - __gmpz_add(__gen_e_acsl_add, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_3), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__3)); - __gmpz_init_set(__gen_e_acsl_at_2, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_add)); - __gmpz_clear(__gen_e_acsl_x_3); - __gmpz_clear(__gen_e_acsl__3); - __gmpz_clear(__gen_e_acsl_add); - } - { - __e_acsl_mpz_t __gen_e_acsl_x_2; - __gmpz_init_set_si(__gen_e_acsl_x_2,(long)x); - __gmpz_init_set(__gen_e_acsl_at, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_2)); - __gmpz_clear(__gen_e_acsl_x_2); - } - /*@ assert x ≡ 0; */ - { - __e_acsl_mpz_t __gen_e_acsl_x; - __e_acsl_mpz_t __gen_e_acsl_; - int __gen_e_acsl_eq; - __gmpz_init_set_si(__gen_e_acsl_x,(long)x); - __gmpz_init_set_si(__gen_e_acsl_,0L); - __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_x), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_)); - __e_acsl_assert(__gen_e_acsl_eq == 0,(char *)"Assertion", - (char *)"main",(char *)"x == 0",43); - __gmpz_clear(__gen_e_acsl_x); - __gmpz_clear(__gen_e_acsl_); - } - __e_acsl_full_init((void *)(& x)); - x = 1; + { + __e_acsl_mpz_t __gen_e_acsl_x_4; + __gmpz_init_set_si(__gen_e_acsl_x_4,(long)x); + __gmpz_init_set(__gen_e_acsl_at, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_4)); + __gmpz_clear(__gen_e_acsl_x_4); + } + { + __e_acsl_mpz_t __gen_e_acsl_x_3; + __e_acsl_mpz_t __gen_e_acsl__3; + __e_acsl_mpz_t __gen_e_acsl_add; + __gmpz_init_set_si(__gen_e_acsl_x_3,(long)x); + __gmpz_init_set_si(__gen_e_acsl__3,1L); + __gmpz_init(__gen_e_acsl_add); + __gmpz_add(__gen_e_acsl_add, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_3), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__3)); + __gmpz_init_set(__gen_e_acsl_at_2, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_add)); + __gmpz_clear(__gen_e_acsl_x_3); + __gmpz_clear(__gen_e_acsl__3); + __gmpz_clear(__gen_e_acsl_add); + } + { + __e_acsl_mpz_t __gen_e_acsl_x_2; + __gmpz_init_set_si(__gen_e_acsl_x_2,(long)x); + __gmpz_init_set(__gen_e_acsl_at, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_2)); + __gmpz_clear(__gen_e_acsl_x_2); + } + /*@ assert x ≡ 0; */ + { + __e_acsl_mpz_t __gen_e_acsl_x; + __e_acsl_mpz_t __gen_e_acsl_; + int __gen_e_acsl_eq; + __gmpz_init_set_si(__gen_e_acsl_x,(long)x); + __gmpz_init_set_si(__gen_e_acsl_,0L); + __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_x), + (__e_acsl_mpz_struct const *)(__gen_e_acsl_)); + __e_acsl_assert(__gen_e_acsl_eq == 0,(char *)"Assertion",(char *)"main", + (char *)"x == 0",43); + __gmpz_clear(__gen_e_acsl_x); + __gmpz_clear(__gen_e_acsl_); + } + __e_acsl_full_init((void *)(& x)); + x = 1; __e_acsl_full_init((void *)(& x)); x = 2; __gen_e_acsl_f(); diff --git a/src/plugins/e-acsl/tests/runtime/local_init.c b/src/plugins/e-acsl/tests/runtime/local_init.c new file mode 100644 index 0000000000000000000000000000000000000000..77f64afba262be597862db14820e8533c1092801 --- /dev/null +++ b/src/plugins/e-acsl/tests/runtime/local_init.c @@ -0,0 +1,19 @@ +/* run.config + COMMENT: test of a local initializer which contains an annotation + LOG: gen_@PTEST_NAME@.c + OPT: -e-acsl-prepare -val -lib-entry -then -e-acsl -then-last -load-script tests/print.cmxs -print -ocode @PTEST_DIR@/result/gen_@PTEST_NAME@.c + EXEC: ./scripts/testrun.sh @PTEST_NAME@ runtime "" "--frama-c=@frama-c@ -F -val -F -lib-entry --then --e-acsl-extra=-no-lib-entry --e-acsl-extra=-no-val" +*/ + +int X = 0; +int *p = &X; + +int f(void) { + int x = *p; // Eva add an alarms on this statement + return x; +} + +int main(void) { + f(); + return 0; +} diff --git a/src/plugins/e-acsl/tests/runtime/oracle/gen_early_exit.c b/src/plugins/e-acsl/tests/runtime/oracle/gen_early_exit.c index f612e32bb617a9e94948ba8fbd26efa3e35d23e5..8481525907067cad87c0fe93152002544a903d48 100644 --- a/src/plugins/e-acsl/tests/runtime/oracle/gen_early_exit.c +++ b/src/plugins/e-acsl/tests/runtime/oracle/gen_early_exit.c @@ -32,26 +32,26 @@ int goto_bts(void) __e_acsl_delete_block((void *)(& a)); } L: - /*@ assert ¬\valid(p); */ - { - int __gen_e_acsl_initialized_2; - int __gen_e_acsl_and_2; - __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)(& p), - sizeof(int *)); - if (__gen_e_acsl_initialized_2) { - int __gen_e_acsl_valid_2; - /*@ assert Value: dangling_pointer: ¬\dangling(&p); */ - __gen_e_acsl_valid_2 = __e_acsl_valid((void *)p,sizeof(int), - (void *)p,(void *)(& p)); - __gen_e_acsl_and_2 = __gen_e_acsl_valid_2; - } - else __gen_e_acsl_and_2 = 0; - __e_acsl_assert(! __gen_e_acsl_and_2,(char *)"Assertion", - (char *)"goto_bts",(char *)"!\\valid(p)",18); + /*@ assert ¬\valid(p); */ + { + int __gen_e_acsl_initialized_2; + int __gen_e_acsl_and_2; + __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)(& p), + sizeof(int *)); + if (__gen_e_acsl_initialized_2) { + int __gen_e_acsl_valid_2; + /*@ assert Value: dangling_pointer: ¬\dangling(&p); */ + __gen_e_acsl_valid_2 = __e_acsl_valid((void *)p,sizeof(int),(void *)p, + (void *)(& p)); + __gen_e_acsl_and_2 = __gen_e_acsl_valid_2; } - __retres = 0; - __e_acsl_delete_block((void *)(& p)); - return __retres; + else __gen_e_acsl_and_2 = 0; + __e_acsl_assert(! __gen_e_acsl_and_2,(char *)"Assertion", + (char *)"goto_bts",(char *)"!\\valid(p)",18); + } + __retres = 0; + __e_acsl_delete_block((void *)(& p)); + return __retres; } int goto_valid(void) @@ -87,136 +87,132 @@ int goto_valid(void) goto FIRST; __e_acsl_full_init((void *)(& p)); p = (int *)0; - { /* sequence */ - __e_acsl_full_init((void *)(& q)); - q = & a; - __e_acsl_full_init((void *)(& r)); - r = q; - } + __e_acsl_full_init((void *)(& q)); + q = & a; + __e_acsl_full_init((void *)(& r)); + r = q; __e_acsl_delete_block((void *)(& a3)); __e_acsl_delete_block((void *)(& a2)); } } FIRST: - /*@ assert \valid(p); */ - { - int __gen_e_acsl_initialized; - int __gen_e_acsl_and; - __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& p), - sizeof(int *)); - if (__gen_e_acsl_initialized) { - int __gen_e_acsl_valid; - __gen_e_acsl_valid = __e_acsl_valid((void *)p,sizeof(int), - (void *)p,(void *)(& p)); - __gen_e_acsl_and = __gen_e_acsl_valid; - } - else __gen_e_acsl_and = 0; - __e_acsl_assert(__gen_e_acsl_and,(char *)"Assertion", - (char *)"goto_valid",(char *)"\\valid(p)",46); - } - /*@ assert ¬\valid(q); */ - { - int __gen_e_acsl_initialized_2; - int __gen_e_acsl_and_2; - __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)(& q), - sizeof(int *)); - if (__gen_e_acsl_initialized_2) { - int __gen_e_acsl_valid_2; - /*@ assert Value: dangling_pointer: ¬\dangling(&q); */ - __gen_e_acsl_valid_2 = __e_acsl_valid((void *)q,sizeof(int), - (void *)q,(void *)(& q)); - __gen_e_acsl_and_2 = __gen_e_acsl_valid_2; - } - else __gen_e_acsl_and_2 = 0; - __e_acsl_assert(! __gen_e_acsl_and_2,(char *)"Assertion", - (char *)"goto_valid",(char *)"!\\valid(q)",47); - } - /*@ assert ¬\valid(r); */ - { - int __gen_e_acsl_initialized_3; - int __gen_e_acsl_and_3; - __gen_e_acsl_initialized_3 = __e_acsl_initialized((void *)(& r), - sizeof(int *)); - if (__gen_e_acsl_initialized_3) { - int __gen_e_acsl_valid_3; - /*@ assert Value: dangling_pointer: ¬\dangling(&r); */ - __gen_e_acsl_valid_3 = __e_acsl_valid((void *)r,sizeof(int), - (void *)r,(void *)(& r)); - __gen_e_acsl_and_3 = __gen_e_acsl_valid_3; - } - else __gen_e_acsl_and_3 = 0; - __e_acsl_assert(! __gen_e_acsl_and_3,(char *)"Assertion", - (char *)"goto_valid",(char *)"!\\valid(r)",48); - } - __e_acsl_delete_block((void *)(& a1)); - goto SECOND; - { /* sequence */ - __e_acsl_full_init((void *)(& q)); - q = & a; - __e_acsl_full_init((void *)(& r)); - r = q; - __e_acsl_full_init((void *)(& p)); - p = r; - } - __e_acsl_delete_block((void *)(& a1)); - } - SECOND: - /*@ assert ¬\valid(p); */ + /*@ assert \valid(p); */ { - int __gen_e_acsl_initialized_4; - int __gen_e_acsl_and_4; - __gen_e_acsl_initialized_4 = __e_acsl_initialized((void *)(& p), - sizeof(int *)); - if (__gen_e_acsl_initialized_4) { - int __gen_e_acsl_valid_4; - /*@ assert Value: dangling_pointer: ¬\dangling(&p); */ - __gen_e_acsl_valid_4 = __e_acsl_valid((void *)p,sizeof(int), - (void *)p,(void *)(& p)); - __gen_e_acsl_and_4 = __gen_e_acsl_valid_4; + int __gen_e_acsl_initialized; + int __gen_e_acsl_and; + __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& p), + sizeof(int *)); + if (__gen_e_acsl_initialized) { + int __gen_e_acsl_valid; + __gen_e_acsl_valid = __e_acsl_valid((void *)p,sizeof(int),(void *)p, + (void *)(& p)); + __gen_e_acsl_and = __gen_e_acsl_valid; } - else __gen_e_acsl_and_4 = 0; - __e_acsl_assert(! __gen_e_acsl_and_4,(char *)"Assertion", - (char *)"goto_valid",(char *)"!\\valid(p)",56); + else __gen_e_acsl_and = 0; + __e_acsl_assert(__gen_e_acsl_and,(char *)"Assertion", + (char *)"goto_valid",(char *)"\\valid(p)",46); } /*@ assert ¬\valid(q); */ { - int __gen_e_acsl_initialized_5; - int __gen_e_acsl_and_5; - __gen_e_acsl_initialized_5 = __e_acsl_initialized((void *)(& q), + int __gen_e_acsl_initialized_2; + int __gen_e_acsl_and_2; + __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)(& q), sizeof(int *)); - if (__gen_e_acsl_initialized_5) { - int __gen_e_acsl_valid_5; + if (__gen_e_acsl_initialized_2) { + int __gen_e_acsl_valid_2; /*@ assert Value: dangling_pointer: ¬\dangling(&q); */ - __gen_e_acsl_valid_5 = __e_acsl_valid((void *)q,sizeof(int), + __gen_e_acsl_valid_2 = __e_acsl_valid((void *)q,sizeof(int), (void *)q,(void *)(& q)); - __gen_e_acsl_and_5 = __gen_e_acsl_valid_5; + __gen_e_acsl_and_2 = __gen_e_acsl_valid_2; } - else __gen_e_acsl_and_5 = 0; - __e_acsl_assert(! __gen_e_acsl_and_5,(char *)"Assertion", - (char *)"goto_valid",(char *)"!\\valid(q)",57); + else __gen_e_acsl_and_2 = 0; + __e_acsl_assert(! __gen_e_acsl_and_2,(char *)"Assertion", + (char *)"goto_valid",(char *)"!\\valid(q)",47); } /*@ assert ¬\valid(r); */ { - int __gen_e_acsl_initialized_6; - int __gen_e_acsl_and_6; - __gen_e_acsl_initialized_6 = __e_acsl_initialized((void *)(& r), + int __gen_e_acsl_initialized_3; + int __gen_e_acsl_and_3; + __gen_e_acsl_initialized_3 = __e_acsl_initialized((void *)(& r), sizeof(int *)); - if (__gen_e_acsl_initialized_6) { - int __gen_e_acsl_valid_6; + if (__gen_e_acsl_initialized_3) { + int __gen_e_acsl_valid_3; /*@ assert Value: dangling_pointer: ¬\dangling(&r); */ - __gen_e_acsl_valid_6 = __e_acsl_valid((void *)r,sizeof(int), + __gen_e_acsl_valid_3 = __e_acsl_valid((void *)r,sizeof(int), (void *)r,(void *)(& r)); - __gen_e_acsl_and_6 = __gen_e_acsl_valid_6; + __gen_e_acsl_and_3 = __gen_e_acsl_valid_3; } - else __gen_e_acsl_and_6 = 0; - __e_acsl_assert(! __gen_e_acsl_and_6,(char *)"Assertion", - (char *)"goto_valid",(char *)"!\\valid(r)",58); + else __gen_e_acsl_and_3 = 0; + __e_acsl_assert(! __gen_e_acsl_and_3,(char *)"Assertion", + (char *)"goto_valid",(char *)"!\\valid(r)",48); } - __retres = 0; - __e_acsl_delete_block((void *)(& r)); - __e_acsl_delete_block((void *)(& q)); - __e_acsl_delete_block((void *)(& p)); - return __retres; + __e_acsl_delete_block((void *)(& a1)); + goto SECOND; + __e_acsl_full_init((void *)(& q)); + q = & a; + __e_acsl_full_init((void *)(& r)); + r = q; + __e_acsl_full_init((void *)(& p)); + p = r; + __e_acsl_delete_block((void *)(& a1)); + } + SECOND: + /*@ assert ¬\valid(p); */ + { + int __gen_e_acsl_initialized_4; + int __gen_e_acsl_and_4; + __gen_e_acsl_initialized_4 = __e_acsl_initialized((void *)(& p), + sizeof(int *)); + if (__gen_e_acsl_initialized_4) { + int __gen_e_acsl_valid_4; + /*@ assert Value: dangling_pointer: ¬\dangling(&p); */ + __gen_e_acsl_valid_4 = __e_acsl_valid((void *)p,sizeof(int),(void *)p, + (void *)(& p)); + __gen_e_acsl_and_4 = __gen_e_acsl_valid_4; + } + else __gen_e_acsl_and_4 = 0; + __e_acsl_assert(! __gen_e_acsl_and_4,(char *)"Assertion", + (char *)"goto_valid",(char *)"!\\valid(p)",56); + } + /*@ assert ¬\valid(q); */ + { + int __gen_e_acsl_initialized_5; + int __gen_e_acsl_and_5; + __gen_e_acsl_initialized_5 = __e_acsl_initialized((void *)(& q), + sizeof(int *)); + if (__gen_e_acsl_initialized_5) { + int __gen_e_acsl_valid_5; + /*@ assert Value: dangling_pointer: ¬\dangling(&q); */ + __gen_e_acsl_valid_5 = __e_acsl_valid((void *)q,sizeof(int),(void *)q, + (void *)(& q)); + __gen_e_acsl_and_5 = __gen_e_acsl_valid_5; + } + else __gen_e_acsl_and_5 = 0; + __e_acsl_assert(! __gen_e_acsl_and_5,(char *)"Assertion", + (char *)"goto_valid",(char *)"!\\valid(q)",57); + } + /*@ assert ¬\valid(r); */ + { + int __gen_e_acsl_initialized_6; + int __gen_e_acsl_and_6; + __gen_e_acsl_initialized_6 = __e_acsl_initialized((void *)(& r), + sizeof(int *)); + if (__gen_e_acsl_initialized_6) { + int __gen_e_acsl_valid_6; + /*@ assert Value: dangling_pointer: ¬\dangling(&r); */ + __gen_e_acsl_valid_6 = __e_acsl_valid((void *)r,sizeof(int),(void *)r, + (void *)(& r)); + __gen_e_acsl_and_6 = __gen_e_acsl_valid_6; + } + else __gen_e_acsl_and_6 = 0; + __e_acsl_assert(! __gen_e_acsl_and_6,(char *)"Assertion", + (char *)"goto_valid",(char *)"!\\valid(r)",58); + } + __retres = 0; + __e_acsl_delete_block((void *)(& r)); + __e_acsl_delete_block((void *)(& q)); + __e_acsl_delete_block((void *)(& p)); + return __retres; } int switch_valid(void) @@ -235,81 +231,79 @@ int switch_valid(void) s = & i; switch (i) { default: + { + int a1 = 0; + __e_acsl_store_block((void *)(& a1),(size_t)4); + __e_acsl_full_init((void *)(& a1)); + __e_acsl_full_init((void *)(& p)); + p = & a1; { - int a1 = 0; - __e_acsl_store_block((void *)(& a1),(size_t)4); - __e_acsl_full_init((void *)(& a1)); - __e_acsl_full_init((void *)(& p)); - p = & a1; + int a2 = 0; + __e_acsl_store_block((void *)(& a2),(size_t)4); + __e_acsl_full_init((void *)(& a2)); + __e_acsl_full_init((void *)(& q)); + q = & a2; + /*@ assert \valid(p); */ { - int a2 = 0; - __e_acsl_store_block((void *)(& a2),(size_t)4); - __e_acsl_full_init((void *)(& a2)); - __e_acsl_full_init((void *)(& q)); - q = & a2; - /*@ assert \valid(p); */ - { - int __gen_e_acsl_initialized; - int __gen_e_acsl_and; - __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& p), - sizeof(int *)); - if (__gen_e_acsl_initialized) { - int __gen_e_acsl_valid; - __gen_e_acsl_valid = __e_acsl_valid((void *)p,sizeof(int), - (void *)p,(void *)(& p)); - __gen_e_acsl_and = __gen_e_acsl_valid; - } - else __gen_e_acsl_and = 0; - __e_acsl_assert(__gen_e_acsl_and,(char *)"Assertion", - (char *)"switch_valid",(char *)"\\valid(p)",76); - } - /*@ assert \valid(q); */ - { - int __gen_e_acsl_initialized_2; - int __gen_e_acsl_and_2; - __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)(& q), - sizeof(int *)); - if (__gen_e_acsl_initialized_2) { - int __gen_e_acsl_valid_2; - __gen_e_acsl_valid_2 = __e_acsl_valid((void *)q,sizeof(int), - (void *)q,(void *)(& q)); - __gen_e_acsl_and_2 = __gen_e_acsl_valid_2; - } - else __gen_e_acsl_and_2 = 0; - __e_acsl_assert(__gen_e_acsl_and_2,(char *)"Assertion", - (char *)"switch_valid",(char *)"\\valid(q)",77); + int __gen_e_acsl_initialized; + int __gen_e_acsl_and; + __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& p), + sizeof(int *)); + if (__gen_e_acsl_initialized) { + int __gen_e_acsl_valid; + __gen_e_acsl_valid = __e_acsl_valid((void *)p,sizeof(int), + (void *)p,(void *)(& p)); + __gen_e_acsl_and = __gen_e_acsl_valid; } - /*@ assert \valid(s); */ - { - int __gen_e_acsl_initialized_3; - int __gen_e_acsl_and_3; - __gen_e_acsl_initialized_3 = __e_acsl_initialized((void *)(& s), - sizeof(int *)); - if (__gen_e_acsl_initialized_3) { - int __gen_e_acsl_valid_3; - __gen_e_acsl_valid_3 = __e_acsl_valid((void *)s,sizeof(int), - (void *)s,(void *)(& s)); - __gen_e_acsl_and_3 = __gen_e_acsl_valid_3; - } - else __gen_e_acsl_and_3 = 0; - __e_acsl_assert(__gen_e_acsl_and_3,(char *)"Assertion", - (char *)"switch_valid",(char *)"\\valid(s)",78); + else __gen_e_acsl_and = 0; + __e_acsl_assert(__gen_e_acsl_and,(char *)"Assertion", + (char *)"switch_valid",(char *)"\\valid(p)",76); + } + /*@ assert \valid(q); */ + { + int __gen_e_acsl_initialized_2; + int __gen_e_acsl_and_2; + __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)(& q), + sizeof(int *)); + if (__gen_e_acsl_initialized_2) { + int __gen_e_acsl_valid_2; + __gen_e_acsl_valid_2 = __e_acsl_valid((void *)q,sizeof(int), + (void *)q,(void *)(& q)); + __gen_e_acsl_and_2 = __gen_e_acsl_valid_2; } - __e_acsl_delete_block((void *)(& a1)); - __e_acsl_delete_block((void *)(& a2)); - break; - __e_acsl_delete_block((void *)(& a2)); + else __gen_e_acsl_and_2 = 0; + __e_acsl_assert(__gen_e_acsl_and_2,(char *)"Assertion", + (char *)"switch_valid",(char *)"\\valid(q)",77); } - { /* sequence */ - __e_acsl_full_init((void *)(& q)); - q = & i; - __e_acsl_full_init((void *)(& p)); - p = q; + /*@ assert \valid(s); */ + { + int __gen_e_acsl_initialized_3; + int __gen_e_acsl_and_3; + __gen_e_acsl_initialized_3 = __e_acsl_initialized((void *)(& s), + sizeof(int *)); + if (__gen_e_acsl_initialized_3) { + int __gen_e_acsl_valid_3; + __gen_e_acsl_valid_3 = __e_acsl_valid((void *)s,sizeof(int), + (void *)s,(void *)(& s)); + __gen_e_acsl_and_3 = __gen_e_acsl_valid_3; + } + else __gen_e_acsl_and_3 = 0; + __e_acsl_assert(__gen_e_acsl_and_3,(char *)"Assertion", + (char *)"switch_valid",(char *)"\\valid(s)",78); } - __e_acsl_full_init((void *)(& s)); - s = (int *)0; __e_acsl_delete_block((void *)(& a1)); + __e_acsl_delete_block((void *)(& a2)); + break; + __e_acsl_delete_block((void *)(& a2)); } + __e_acsl_full_init((void *)(& q)); + q = & i; + __e_acsl_full_init((void *)(& p)); + p = q; + __e_acsl_full_init((void *)(& s)); + s = (int *)0; + __e_acsl_delete_block((void *)(& a1)); + } } /*@ assert ¬\valid(q); */ { @@ -528,11 +522,9 @@ void continue_valid(void) int i = 0; while (1) { int tmp; - { /* sequence */ - tmp = i; - i ++; - ; - } + tmp = i; + i ++; + ; if (! tmp) break; { /*@ assert ¬\valid(p); */ diff --git a/src/plugins/e-acsl/tests/runtime/oracle/gen_function_contract.c b/src/plugins/e-acsl/tests/runtime/oracle/gen_function_contract.c index 7b7b067ff37416636bcd53121428533ced6e242e..d2f07efc1d2ea9c95f5fc44008831978b1e86a2d 100644 --- a/src/plugins/e-acsl/tests/runtime/oracle/gen_function_contract.c +++ b/src/plugins/e-acsl/tests/runtime/oracle/gen_function_contract.c @@ -316,8 +316,8 @@ void __gen_e_acsl_k(void) else __gen_e_acsl_implies_3 = X + (long)Y == 5L; __e_acsl_assert(__gen_e_acsl_implies_3,(char *)"Precondition", (char *)"k",(char *)"X == 3 && Y == 2 ==> X + Y == 5",43); - k(); } + k(); return; } diff --git a/src/plugins/e-acsl/tests/runtime/oracle/gen_labeled_stmt.c b/src/plugins/e-acsl/tests/runtime/oracle/gen_labeled_stmt.c index 93c05dc46f74f6be4e4da41a339acf6a2638c0c7..f1c3f7afb6dfb98de5654eed151989e3ef9098e8 100644 --- a/src/plugins/e-acsl/tests/runtime/oracle/gen_labeled_stmt.c +++ b/src/plugins/e-acsl/tests/runtime/oracle/gen_labeled_stmt.c @@ -10,21 +10,21 @@ int __gen_e_acsl_main(void) int __retres; goto L1; L1: - /*@ assert X ≡ 0; */ - __e_acsl_assert(X == 0,(char *)"Assertion",(char *)"main", - (char *)"X == 0",10); - X = 1; + /*@ assert X ≡ 0; */ + __e_acsl_assert(X == 0,(char *)"Assertion",(char *)"main",(char *)"X == 0", + 10); + X = 1; goto L2; L2: - /*@ requires X ≡ 1; - ensures X ≡ 2; */ - { - __e_acsl_assert(X == 1,(char *)"Precondition",(char *)"main", - (char *)"X == 1",12); - X = 2; - __e_acsl_assert(X == 2,(char *)"Postcondition",(char *)"main", - (char *)"X == 2",12); - } + /*@ requires X ≡ 1; + ensures X ≡ 2; */ + { + __e_acsl_assert(X == 1,(char *)"Precondition",(char *)"main", + (char *)"X == 1",12); + X = 2; + __e_acsl_assert(X == 2,(char *)"Postcondition",(char *)"main", + (char *)"X == 2",12); + } if (X) { X = 3; __retres = 0; diff --git a/src/plugins/e-acsl/tests/runtime/oracle/gen_linear_search.c b/src/plugins/e-acsl/tests/runtime/oracle/gen_linear_search.c index aad0f8d74aec802eedb5c98cdc99b72a16e0405f..6fd208997af1ee105c57e1c393f0ce0edab7f2b1 100644 --- a/src/plugins/e-acsl/tests/runtime/oracle/gen_linear_search.c +++ b/src/plugins/e-acsl/tests/runtime/oracle/gen_linear_search.c @@ -29,31 +29,34 @@ int search(int elt) int k; k = 0; { - int __gen_e_acsl_forall; - int __gen_e_acsl_i; - int __gen_e_acsl_and; - __gen_e_acsl_forall = 1; - __gen_e_acsl_i = 0; - while (1) { - if (__gen_e_acsl_i < k) ; else break; - __e_acsl_assert(__gen_e_acsl_i < 10,(char *)"RTE",(char *)"search", - (char *)"index_bound: __gen_e_acsl_i < 10",18); - __e_acsl_assert(0 <= __gen_e_acsl_i,(char *)"RTE",(char *)"search", - (char *)"index_bound: 0 <= __gen_e_acsl_i",18); - if (A[__gen_e_acsl_i] < elt) ; - else { - __gen_e_acsl_forall = 0; - goto e_acsl_end_loop1; + { + int __gen_e_acsl_forall; + int __gen_e_acsl_i; + int __gen_e_acsl_and; + __gen_e_acsl_forall = 1; + __gen_e_acsl_i = 0; + while (1) { + if (__gen_e_acsl_i < k) ; else break; + __e_acsl_assert(__gen_e_acsl_i < 10,(char *)"RTE",(char *)"search", + (char *)"index_bound: __gen_e_acsl_i < 10",18); + __e_acsl_assert(0 <= __gen_e_acsl_i,(char *)"RTE",(char *)"search", + (char *)"index_bound: 0 <= __gen_e_acsl_i",18); + if (A[__gen_e_acsl_i] < elt) ; + else { + __gen_e_acsl_forall = 0; + goto e_acsl_end_loop1; + } + __gen_e_acsl_i ++; } - __gen_e_acsl_i ++; + e_acsl_end_loop1: ; + __e_acsl_assert(__gen_e_acsl_forall,(char *)"Invariant", + (char *)"search", + (char *)"\\forall integer i; 0 <= i < k ==> A[i] < elt", + 18); + if (0 <= k) __gen_e_acsl_and = k <= 10; else __gen_e_acsl_and = 0; + __e_acsl_assert(__gen_e_acsl_and,(char *)"Invariant",(char *)"search", + (char *)"0 <= k <= 10",17); } - e_acsl_end_loop1: ; - __e_acsl_assert(__gen_e_acsl_forall,(char *)"Invariant",(char *)"search", - (char *)"\\forall integer i; 0 <= i < k ==> A[i] < elt", - 18); - if (0 <= k) __gen_e_acsl_and = k <= 10; else __gen_e_acsl_and = 0; - __e_acsl_assert(__gen_e_acsl_and,(char *)"Invariant",(char *)"search", - (char *)"0 <= k <= 10",17); /*@ loop invariant 0 ≤ k ≤ 10; loop invariant ∀ ℤ i; 0 ≤ i < k ⇒ A[i] < elt; */ @@ -174,50 +177,50 @@ int __gen_e_acsl_search(int elt) (char *)"search", (char *)"\\forall integer i; 0 <= i < 9 ==> A[i] <= A[i + 1]", 7); - { - int __gen_e_acsl_forall_2; - int __gen_e_acsl_j_2; - __gen_e_acsl_forall_2 = 1; - __gen_e_acsl_j_2 = 0; - while (1) { - if (__gen_e_acsl_j_2 < 10) ; else break; - __e_acsl_assert(__gen_e_acsl_j_2 < 10,(char *)"RTE",(char *)"search", - (char *)"index_bound: __gen_e_acsl_j_2 < 10",12); - __e_acsl_assert(0 <= __gen_e_acsl_j_2,(char *)"RTE",(char *)"search", - (char *)"index_bound: 0 <= __gen_e_acsl_j_2",12); - if (A[__gen_e_acsl_j_2] != elt) ; - else { - __gen_e_acsl_forall_2 = 0; - goto e_acsl_end_loop5; - } - __gen_e_acsl_j_2 ++; + } + { + int __gen_e_acsl_forall_2; + int __gen_e_acsl_j_2; + __gen_e_acsl_forall_2 = 1; + __gen_e_acsl_j_2 = 0; + while (1) { + if (__gen_e_acsl_j_2 < 10) ; else break; + __e_acsl_assert(__gen_e_acsl_j_2 < 10,(char *)"RTE",(char *)"search", + (char *)"index_bound: __gen_e_acsl_j_2 < 10",12); + __e_acsl_assert(0 <= __gen_e_acsl_j_2,(char *)"RTE",(char *)"search", + (char *)"index_bound: 0 <= __gen_e_acsl_j_2",12); + if (A[__gen_e_acsl_j_2] != elt) ; + else { + __gen_e_acsl_forall_2 = 0; + goto e_acsl_end_loop5; } - e_acsl_end_loop5: ; - __gen_e_acsl_at_2 = __gen_e_acsl_forall_2; + __gen_e_acsl_j_2 ++; } - { - int __gen_e_acsl_exists; - int __gen_e_acsl_j; - __gen_e_acsl_exists = 0; - __gen_e_acsl_j = 0; - while (1) { - if (__gen_e_acsl_j < 10) ; else break; - __e_acsl_assert(__gen_e_acsl_j < 10,(char *)"RTE",(char *)"search", - (char *)"index_bound: __gen_e_acsl_j < 10",9); - __e_acsl_assert(0 <= __gen_e_acsl_j,(char *)"RTE",(char *)"search", - (char *)"index_bound: 0 <= __gen_e_acsl_j",9); - if (! (A[__gen_e_acsl_j] == elt)) ; - else { - __gen_e_acsl_exists = 1; - goto e_acsl_end_loop4; - } - __gen_e_acsl_j ++; + e_acsl_end_loop5: ; + __gen_e_acsl_at_2 = __gen_e_acsl_forall_2; + } + { + int __gen_e_acsl_exists; + int __gen_e_acsl_j; + __gen_e_acsl_exists = 0; + __gen_e_acsl_j = 0; + while (1) { + if (__gen_e_acsl_j < 10) ; else break; + __e_acsl_assert(__gen_e_acsl_j < 10,(char *)"RTE",(char *)"search", + (char *)"index_bound: __gen_e_acsl_j < 10",9); + __e_acsl_assert(0 <= __gen_e_acsl_j,(char *)"RTE",(char *)"search", + (char *)"index_bound: 0 <= __gen_e_acsl_j",9); + if (! (A[__gen_e_acsl_j] == elt)) ; + else { + __gen_e_acsl_exists = 1; + goto e_acsl_end_loop4; } - e_acsl_end_loop4: ; - __gen_e_acsl_at = __gen_e_acsl_exists; + __gen_e_acsl_j ++; } - __retres = search(elt); + e_acsl_end_loop4: ; + __gen_e_acsl_at = __gen_e_acsl_exists; } + __retres = search(elt); { int __gen_e_acsl_implies; int __gen_e_acsl_implies_2; diff --git a/src/plugins/e-acsl/tests/runtime/oracle/gen_local_goto.c b/src/plugins/e-acsl/tests/runtime/oracle/gen_local_goto.c index 9e517c9ce5af02cd174e8b4a87c129e9c4b01516..30d11105244eb9351f2f097bfdd4c5bdb92f9651 100644 --- a/src/plugins/e-acsl/tests/runtime/oracle/gen_local_goto.c +++ b/src/plugins/e-acsl/tests/runtime/oracle/gen_local_goto.c @@ -40,45 +40,45 @@ int main(int argc, char const **argv) goto RET; } AGAIN: + { + int a; + __e_acsl_store_block((void *)(& a),(size_t)4); + __e_acsl_full_init((void *)(& a)); + a = 1; + /*@ assert \valid(&a); */ { - int a; - __e_acsl_store_block((void *)(& a),(size_t)4); - __e_acsl_full_init((void *)(& a)); - a = 1; - /*@ assert \valid(&a); */ - { - int __gen_e_acsl_valid; - __gen_e_acsl_valid = __e_acsl_valid((void *)(& a),sizeof(int), - (void *)(& a),(void *)(& a)); - __e_acsl_assert(__gen_e_acsl_valid,(char *)"Assertion", - (char *)"main",(char *)"\\valid(&a)",25); - } - if (t == 2) { - __gen_e_acsl_printf_va_2(__gen_e_acsl_literal_string,t, - (char *)__gen_e_acsl_literal_string_3); - __e_acsl_delete_block((void *)(& a)); - goto UP; - } - else t ++; - int b = 15; - __e_acsl_store_block((void *)(& b),(size_t)4); - __e_acsl_full_init((void *)(& b)); - /*@ assert \valid(&b); */ - { - int __gen_e_acsl_valid_2; - __gen_e_acsl_valid_2 = __e_acsl_valid((void *)(& b),sizeof(int), - (void *)(& b),(void *)(& b)); - __e_acsl_assert(__gen_e_acsl_valid_2,(char *)"Assertion", - (char *)"main",(char *)"\\valid(&b)",36); - } - __gen_e_acsl_printf_va_3(__gen_e_acsl_literal_string,t, - (char *)__gen_e_acsl_literal_string_4); - __e_acsl_delete_block((void *)(& a)); - __e_acsl_delete_block((void *)(& b)); - goto AGAIN; - __e_acsl_delete_block((void *)(& b)); + int __gen_e_acsl_valid; + __gen_e_acsl_valid = __e_acsl_valid((void *)(& a),sizeof(int), + (void *)(& a),(void *)(& a)); + __e_acsl_assert(__gen_e_acsl_valid,(char *)"Assertion",(char *)"main", + (char *)"\\valid(&a)",25); + } + if (t == 2) { + __gen_e_acsl_printf_va_2(__gen_e_acsl_literal_string,t, + (char *)__gen_e_acsl_literal_string_3); __e_acsl_delete_block((void *)(& a)); + goto UP; } + else t ++; + int b = 15; + __e_acsl_store_block((void *)(& b),(size_t)4); + __e_acsl_full_init((void *)(& b)); + /*@ assert \valid(&b); */ + { + int __gen_e_acsl_valid_2; + __gen_e_acsl_valid_2 = __e_acsl_valid((void *)(& b),sizeof(int), + (void *)(& b),(void *)(& b)); + __e_acsl_assert(__gen_e_acsl_valid_2,(char *)"Assertion", + (char *)"main",(char *)"\\valid(&b)",36); + } + __gen_e_acsl_printf_va_3(__gen_e_acsl_literal_string,t, + (char *)__gen_e_acsl_literal_string_4); + __e_acsl_delete_block((void *)(& a)); + __e_acsl_delete_block((void *)(& b)); + goto AGAIN; + __e_acsl_delete_block((void *)(& b)); + __e_acsl_delete_block((void *)(& a)); + } RET: __retres = 0; __e_acsl_memory_clean(); return __retres; diff --git a/src/plugins/e-acsl/tests/runtime/oracle/gen_local_init.c b/src/plugins/e-acsl/tests/runtime/oracle/gen_local_init.c new file mode 100644 index 0000000000000000000000000000000000000000..3975152cb4081982cd4b55ada9d3b32463a6fff7 --- /dev/null +++ b/src/plugins/e-acsl/tests/runtime/oracle/gen_local_init.c @@ -0,0 +1,38 @@ +/* Generated by Frama-C */ +#include "stdlib.h" +int X = 0; +int *p = & X; +int f(void) +{ + /*@ assert Value: mem_access: \valid_read(p); */ + { + int __gen_e_acsl_valid_read; + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)p,sizeof(int), + (void *)p,(void *)(& p)); + __e_acsl_assert(__gen_e_acsl_valid_read,(char *)"Assertion",(char *)"f", + (char *)"Value: mem_access: \\valid_read(p)",12); + } + int x = *p; + return x; +} + +void __e_acsl_globals_init(void) +{ + __e_acsl_store_block((void *)(& p),(size_t)4); + __e_acsl_full_init((void *)(& p)); + return; +} + +int main(void) +{ + int __retres; + __e_acsl_memory_init((int *)0,(char ***)0,(size_t)4); + __e_acsl_globals_init(); + f(); + __retres = 0; + __e_acsl_delete_block((void *)(& p)); + __e_acsl_memory_clean(); + return __retres; +} + + diff --git a/src/plugins/e-acsl/tests/runtime/oracle/gen_stmt_contract.c b/src/plugins/e-acsl/tests/runtime/oracle/gen_stmt_contract.c index 876d034eec1c449b5258eb5f0fea233c0c230098..106da5a584157f745b8e9098899dc533a84e5e66 100644 --- a/src/plugins/e-acsl/tests/runtime/oracle/gen_stmt_contract.c +++ b/src/plugins/e-acsl/tests/runtime/oracle/gen_stmt_contract.c @@ -68,26 +68,29 @@ int main(void) requires x + y ≡ 5; */ { - int __gen_e_acsl_implies; - int __gen_e_acsl_and; - int __gen_e_acsl_implies_2; - int __gen_e_acsl_and_2; - int __gen_e_acsl_implies_3; - if (! (x == 1)) __gen_e_acsl_implies = 1; - else __gen_e_acsl_implies = x == 0; - __e_acsl_assert(__gen_e_acsl_implies,(char *)"Precondition", - (char *)"main",(char *)"x == 1 ==> x == 0",33); - if (x == 3) __gen_e_acsl_and = y == 2; else __gen_e_acsl_and = 0; - if (! __gen_e_acsl_and) __gen_e_acsl_implies_2 = 1; - else __gen_e_acsl_implies_2 = x == 3; - __e_acsl_assert(__gen_e_acsl_implies_2,(char *)"Precondition", - (char *)"main",(char *)"x == 3 && y == 2 ==> x == 3",37); - if (x == 3) __gen_e_acsl_and_2 = y == 2; else __gen_e_acsl_and_2 = 0; - if (! __gen_e_acsl_and_2) __gen_e_acsl_implies_3 = 1; - else __gen_e_acsl_implies_3 = x + (long)y == 5L; - __e_acsl_assert(__gen_e_acsl_implies_3,(char *)"Precondition", - (char *)"main",(char *)"x == 3 && y == 2 ==> x + y == 5", - 38); + { + int __gen_e_acsl_implies; + int __gen_e_acsl_and; + int __gen_e_acsl_implies_2; + int __gen_e_acsl_and_2; + int __gen_e_acsl_implies_3; + if (! (x == 1)) __gen_e_acsl_implies = 1; + else __gen_e_acsl_implies = x == 0; + __e_acsl_assert(__gen_e_acsl_implies,(char *)"Precondition", + (char *)"main",(char *)"x == 1 ==> x == 0",33); + if (x == 3) __gen_e_acsl_and = y == 2; else __gen_e_acsl_and = 0; + if (! __gen_e_acsl_and) __gen_e_acsl_implies_2 = 1; + else __gen_e_acsl_implies_2 = x == 3; + __e_acsl_assert(__gen_e_acsl_implies_2,(char *)"Precondition", + (char *)"main",(char *)"x == 3 && y == 2 ==> x == 3", + 37); + if (x == 3) __gen_e_acsl_and_2 = y == 2; else __gen_e_acsl_and_2 = 0; + if (! __gen_e_acsl_and_2) __gen_e_acsl_implies_3 = 1; + else __gen_e_acsl_implies_3 = x + (long)y == 5L; + __e_acsl_assert(__gen_e_acsl_implies_3,(char *)"Precondition", + (char *)"main", + (char *)"x == 3 && y == 2 ==> x + y == 5",38); + } x += y; } /*@ requires x ≡ 5; */ diff --git a/src/plugins/e-acsl/tests/runtime/oracle/local_init.err.oracle b/src/plugins/e-acsl/tests/runtime/oracle/local_init.err.oracle new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/plugins/e-acsl/tests/runtime/oracle/local_init.res.oracle b/src/plugins/e-acsl/tests/runtime/oracle/local_init.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..88cee4a0c74964b9aa8d0e1c7fb86f7fea60b9bc --- /dev/null +++ b/src/plugins/e-acsl/tests/runtime/oracle/local_init.res.oracle @@ -0,0 +1,30 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing FRAMAC_SHARE/e-acsl/e_acsl.h (with preprocessing) +[kernel] Parsing FRAMAC_SHARE/e-acsl/e_acsl_gmp.h (with preprocessing) +[kernel] Parsing FRAMAC_SHARE/e-acsl/e_acsl_mmodel_api.h (with preprocessing) +[kernel] Parsing tests/runtime/local_init.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value:initial-state] Values of globals at initialization + __fc_random_counter ∈ [--..--] + __fc_rand_max ∈ {32767} + __fc_heap_status ∈ [--..--] + __fc_mblen_state ∈ [--..--] + __fc_mbtowc_state ∈ [--..--] + __fc_wctomb_state ∈ [--..--] + __e_acsl_init ∈ [--..--] + __e_acsl_internal_heap ∈ [--..--] + __e_acsl_heap_allocation_size ∈ [--..--] + X ∈ [--..--] + p ∈ {{ NULL ; &S_p[0] }} + S_p[0..1] ∈ [--..--] +tests/runtime/local_init.c:12:[value] warning: out of bounds read. assert \valid_read(p); +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value:final-states] Values at end of function f: + x ∈ [--..--] +[value:final-states] Values at end of function main: + __retres ∈ {0} +[e-acsl] beginning translation. +[e-acsl] translation done in project "e-acsl". diff --git a/src/plugins/e-acsl/visit.ml b/src/plugins/e-acsl/visit.ml index a159cdea254416f7429a1357bf7b2fcfd9261655..81c69a3726d955c7d99ca0d2698db9bed4cf424f 100644 --- a/src/plugins/e-acsl/visit.ml +++ b/src/plugins/e-acsl/visit.ml @@ -647,7 +647,8 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]" else acc) global_vars - [ Misc.mk_call ~loc (Misc.mk_api_name "memory_clean") []; ret ] + [ Misc.mk_call ~loc (Misc.mk_api_name "memory_clean") []; + ret ] in b.bstmts <- List.rev l @ delete_stmts end; @@ -664,13 +665,12 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]" (* must generate [pre_block] which includes [stmt] before generating [post_block] *) let pre_block, env = - Env.pop_and_get env new_stmt ~global_clear:false Env.After - in - let pre_block = - if pre_block.blocals = [] then - Cil.transient_block pre_block - else - pre_block + Env.pop_and_get + ~split:true + env + new_stmt + ~global_clear:false + Env.After in let env = mk_post_env (Env.push env) in let post_block, env = @@ -681,14 +681,14 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]" Env.Before in (match stmt.skind with - | Instr (Local_init (vi, _, _)) when - Mmodel_analysis.old_must_model_vi self#behavior ~kf vi -> - let vi = Cil.get_varinfo self#behavior vi in - post_block.bstmts <- - post_block.bstmts @ - [Misc.mk_store_stmt vi; Misc.mk_full_init_stmt vi] - | _ -> ()); - let post_block = Cil.flatten_transient_sub_blocks post_block in + | Instr (Local_init (vi, _, _)) when + Mmodel_analysis.old_must_model_vi self#behavior ~kf vi -> + let vi = Cil.get_varinfo self#behavior vi in + (* must generate the new stmts after the declaration of [vi] *) + post_block.bstmts <- + post_block.bstmts @ + [Misc.mk_store_stmt vi; Misc.mk_full_init_stmt vi] + | _ -> ()); let post_block = Cil.transient_block post_block in Misc.mk_block prj new_stmt post_block, env end else