diff --git a/src/plugins/e-acsl/TODO b/src/plugins/e-acsl/TODO index b4f5963ab92dbc221c254f98fb440900e169442a..af4ca2c13f3ba14c28f052c2e5399f98ea9db904 100644 --- a/src/plugins/e-acsl/TODO +++ b/src/plugins/e-acsl/TODO @@ -1,3 +1,8 @@ +à traiter avant la 1ère release: +- quantifications sans exentension de syntaxe +- \return +- \old et \at + ######## # CODE # ######## diff --git a/src/plugins/e-acsl/tests/e-acsl-runtime/function_contract.i b/src/plugins/e-acsl/tests/e-acsl-runtime/function_contract.i index 5ff9f127134fd313b7df1c01e3405861c2af39f6..f82d2d4047223e48b316ab422b9180c6a6d03526 100644 --- a/src/plugins/e-acsl/tests/e-acsl-runtime/function_contract.i +++ b/src/plugins/e-acsl/tests/e-acsl-runtime/function_contract.i @@ -10,7 +10,7 @@ int X = 0, Y = 2; void f(void) { X = 1; } // several ensures -/*@ ensures X == 2; +/*@ ensures X == 2; @ ensures Y == 2; */ void g(void) { X = 2; } @@ -24,9 +24,9 @@ void h(void) { X += 1; } void i(void) { X += Y; } // several behaviors -/*@ behavior b1: +/*@ behavior b1: @ requires X == 5; - @ ensures X == 3; + @ ensures X == 3; @ behavior b2: @ requires X == 3 + Y; @ requires Y == 2; @@ -36,7 +36,7 @@ void j(void) { X = 3; } // mix requires and assumes /*@ behavior b1: @ assumes X == 1; - @ requires X == 0; + @ requires X == 0; @ behavior b2: @ assumes X == 3; @ assumes Y == 2; @@ -44,6 +44,13 @@ void j(void) { X = 3; } @ requires X + Y == 5; */ void k(void) { X += Y; } +// mix ensures + contract on return +/*@ ensures X == 5; */ +int l() { + /*@ assert Y == 2; */ + return X; +} + int main(void) { f(); g(); @@ -51,5 +58,6 @@ int main(void) { i(); j(); k(); + l(); return 0; } diff --git a/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/function_contract.res.oracle b/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/function_contract.res.oracle index c1bb930a271214543a3423a69849a928ab21de91..6c2e35a302d3699ead374d3de4d22c180c0cd4c8 100644 --- a/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/function_contract.res.oracle +++ b/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/function_contract.res.oracle @@ -5,30 +5,107 @@ X ∈ {0} Y ∈ {2} [value] computing for function f <- main. - Called from PROJECT_FILE.i:346. + Called from PROJECT_FILE.i:367. +[value] computing for function mpz_init_set_si <- f <- main. + Called from PROJECT_FILE.i:134. +PROJECT_FILE.i:29:[value] Function mpz_init_set_si: postcondition got status valid. +[value] Done for function mpz_init_set_si +[value] computing for function mpz_init_set_si <- f <- main. + Called from PROJECT_FILE.i:134. +[value] Done for function mpz_init_set_si +[value] computing for function mpz_cmp <- f <- main. + Called from PROJECT_FILE.i:135. +PROJECT_FILE.i:45:[value] Function mpz_cmp: precondition got status valid. +PROJECT_FILE.i:46:[value] Function mpz_cmp: precondition got status valid. +[value] Done for function mpz_cmp +[value] computing for function e_acsl_fail <- f <- main. + Called from PROJECT_FILE.i:136. +[value] computing for function printf <- e_acsl_fail <- f <- main. + Called from PROJECT_FILE.i:125. +[value] Done for function printf +[value] computing for function exit <- e_acsl_fail <- f <- main. + Called from PROJECT_FILE.i:125. +PROJECT_FILE.i:115:[value] Function exit: postcondition got status invalid. +[value] Done for function exit +[value] Recording results for e_acsl_fail +[value] Done for function e_acsl_fail +[value] computing for function mpz_clear <- f <- main. + Called from PROJECT_FILE.i:137. +PROJECT_FILE.i:39:[value] Function mpz_clear: precondition got status valid. +[value] Done for function mpz_clear +[value] computing for function mpz_clear <- f <- main. + Called from PROJECT_FILE.i:137. +[value] Done for function mpz_clear PROJECT_FILE.i:129:[value] Function f: postcondition got status valid. [value] Recording results for f [value] Done for function f [value] computing for function g <- main. - Called from PROJECT_FILE.i:347. + Called from PROJECT_FILE.i:368. +[value] computing for function mpz_init_set_si <- g <- main. + Called from PROJECT_FILE.i:149. +[value] Done for function mpz_init_set_si +[value] computing for function mpz_init_set_si <- g <- main. + Called from PROJECT_FILE.i:150. +[value] Done for function mpz_init_set_si +[value] computing for function mpz_cmp <- g <- main. + Called from PROJECT_FILE.i:150. +[value] Done for function mpz_cmp +[value] computing for function e_acsl_fail <- g <- main. + Called from PROJECT_FILE.i:151. +[value] computing for function printf <- e_acsl_fail <- g <- main. + Called from PROJECT_FILE.i:125. +[value] Done for function printf +[value] computing for function exit <- e_acsl_fail <- g <- main. + Called from PROJECT_FILE.i:125. +[value] Done for function exit +[value] Recording results for e_acsl_fail +[value] Done for function e_acsl_fail +[value] computing for function mpz_init_set_si <- g <- main. + Called from PROJECT_FILE.i:152. +[value] Done for function mpz_init_set_si +[value] computing for function mpz_init_set_si <- g <- main. + Called from PROJECT_FILE.i:152. +[value] Done for function mpz_init_set_si +[value] computing for function mpz_cmp <- g <- main. + Called from PROJECT_FILE.i:153. +[value] Done for function mpz_cmp +[value] computing for function e_acsl_fail <- g <- main. + Called from PROJECT_FILE.i:154. +[value] computing for function printf <- e_acsl_fail <- g <- main. + Called from PROJECT_FILE.i:125. +[value] Done for function printf +[value] computing for function exit <- e_acsl_fail <- g <- main. + Called from PROJECT_FILE.i:125. +[value] Done for function exit +[value] Recording results for e_acsl_fail +[value] Done for function e_acsl_fail +[value] computing for function mpz_clear <- g <- main. + Called from PROJECT_FILE.i:155. +[value] Done for function mpz_clear +[value] computing for function mpz_clear <- g <- main. + Called from PROJECT_FILE.i:155. +[value] Done for function mpz_clear +[value] computing for function mpz_clear <- g <- main. + Called from PROJECT_FILE.i:155. +[value] Done for function mpz_clear +[value] computing for function mpz_clear <- g <- main. + Called from PROJECT_FILE.i:156. +[value] Done for function mpz_clear PROJECT_FILE.i:143:[value] Function g: postcondition got status valid. PROJECT_FILE.i:144:[value] Function g: postcondition got status valid. [value] Recording results for g [value] Done for function g [value] computing for function h <- main. - Called from PROJECT_FILE.i:348. + Called from PROJECT_FILE.i:369. PROJECT_FILE.i:162:[value] Function h: precondition got status valid. [value] computing for function mpz_init_set_si <- h <- main. Called from PROJECT_FILE.i:166. -PROJECT_FILE.i:29:[value] Function mpz_init_set_si: postcondition got status valid. [value] Done for function mpz_init_set_si [value] computing for function mpz_init_set_si <- h <- main. Called from PROJECT_FILE.i:166. [value] Done for function mpz_init_set_si [value] computing for function mpz_cmp <- h <- main. Called from PROJECT_FILE.i:167. -PROJECT_FILE.i:45:[value] Function mpz_cmp: precondition got status valid. -PROJECT_FILE.i:46:[value] Function mpz_cmp: precondition got status valid. [value] Done for function mpz_cmp [value] computing for function e_acsl_fail <- h <- main. Called from PROJECT_FILE.i:168. @@ -37,13 +114,11 @@ PROJECT_FILE.i:46:[value] Function mpz_cmp: precondition got status valid. [value] Done for function printf [value] computing for function exit <- e_acsl_fail <- h <- main. Called from PROJECT_FILE.i:125. -PROJECT_FILE.i:115:[value] Function exit: postcondition got status invalid. [value] Done for function exit [value] Recording results for e_acsl_fail [value] Done for function e_acsl_fail [value] computing for function mpz_clear <- h <- main. Called from PROJECT_FILE.i:169. -PROJECT_FILE.i:39:[value] Function mpz_clear: precondition got status valid. [value] Done for function mpz_clear [value] computing for function mpz_clear <- h <- main. Called from PROJECT_FILE.i:169. @@ -51,7 +126,7 @@ PROJECT_FILE.i:39:[value] Function mpz_clear: precondition got status valid. [value] Recording results for h [value] Done for function h [value] computing for function i <- main. - Called from PROJECT_FILE.i:349. + Called from PROJECT_FILE.i:370. PROJECT_FILE.i:176:[value] Function i: precondition got status valid. PROJECT_FILE.i:177:[value] Function i: precondition got status valid. [value] computing for function mpz_init_set_si <- i <- main. @@ -107,7 +182,7 @@ PROJECT_FILE.i:177:[value] Function i: precondition got status valid. [value] Recording results for i [value] Done for function i [value] computing for function j <- main. - Called from PROJECT_FILE.i:350. + Called from PROJECT_FILE.i:371. PROJECT_FILE.i:196:[value] Function j, behavior b1: precondition got status valid. PROJECT_FILE.i:200:[value] Function j, behavior b2: precondition got status valid. PROJECT_FILE.i:201:[value] Function j, behavior b2: precondition got status valid. @@ -205,12 +280,77 @@ PROJECT_FILE.i:62:[value] Function mpz_add: precondition got status valid. [value] computing for function mpz_clear <- j <- main. Called from PROJECT_FILE.i:224. [value] Done for function mpz_clear +[value] computing for function mpz_init_set_si <- j <- main. + Called from PROJECT_FILE.i:230. +[value] Done for function mpz_init_set_si +[value] computing for function mpz_init_set_si <- j <- main. + Called from PROJECT_FILE.i:230. +[value] Done for function mpz_init_set_si +[value] computing for function mpz_cmp <- j <- main. + Called from PROJECT_FILE.i:231. +[value] Done for function mpz_cmp +[value] computing for function e_acsl_fail <- j <- main. + Called from PROJECT_FILE.i:232. +[value] computing for function printf <- e_acsl_fail <- j <- main. + Called from PROJECT_FILE.i:125. +[value] Done for function printf +[value] computing for function exit <- e_acsl_fail <- j <- main. + Called from PROJECT_FILE.i:125. +[value] Done for function exit +[value] Recording results for e_acsl_fail +[value] Done for function e_acsl_fail +[value] computing for function mpz_init_set_si <- j <- main. + Called from PROJECT_FILE.i:233. +[value] Done for function mpz_init_set_si +[value] computing for function mpz_init_set_si <- j <- main. + Called from PROJECT_FILE.i:233. +[value] Done for function mpz_init_set_si +[value] computing for function mpz_init_set_si <- j <- main. + Called from PROJECT_FILE.i:234. +[value] Done for function mpz_init_set_si +[value] computing for function mpz_init <- j <- main. + Called from PROJECT_FILE.i:234. +[value] Done for function mpz_init +[value] computing for function mpz_add <- j <- main. + Called from PROJECT_FILE.i:235. +[value] Done for function mpz_add +[value] computing for function mpz_cmp <- j <- main. + Called from PROJECT_FILE.i:236. +[value] Done for function mpz_cmp +[value] computing for function e_acsl_fail <- j <- main. + Called from PROJECT_FILE.i:237. +[value] computing for function printf <- e_acsl_fail <- j <- main. + Called from PROJECT_FILE.i:125. +[value] Done for function printf +[value] computing for function exit <- e_acsl_fail <- j <- main. + Called from PROJECT_FILE.i:125. +[value] Done for function exit +[value] Recording results for e_acsl_fail +[value] Done for function e_acsl_fail +[value] computing for function mpz_clear <- j <- main. + Called from PROJECT_FILE.i:238. +[value] Done for function mpz_clear +[value] computing for function mpz_clear <- j <- main. + Called from PROJECT_FILE.i:238. +[value] Done for function mpz_clear +[value] computing for function mpz_clear <- j <- main. + Called from PROJECT_FILE.i:238. +[value] Done for function mpz_clear +[value] computing for function mpz_clear <- j <- main. + Called from PROJECT_FILE.i:239. +[value] Done for function mpz_clear +[value] computing for function mpz_clear <- j <- main. + Called from PROJECT_FILE.i:239. +[value] Done for function mpz_clear +[value] computing for function mpz_clear <- j <- main. + Called from PROJECT_FILE.i:239. +[value] Done for function mpz_clear PROJECT_FILE.i:197:[value] Function j, behavior b1: postcondition got status valid. PROJECT_FILE.i:202:[value] Function j, behavior b2: postcondition got status valid. [value] Recording results for j [value] Done for function j [value] computing for function k <- main. - Called from PROJECT_FILE.i:351. + Called from PROJECT_FILE.i:372. PROJECT_FILE.i:247:[value] Function k, behavior b1: assumption got status invalid; precondition not evaluated. PROJECT_FILE.i:252:[value] Function k, behavior b2: precondition got status valid. PROJECT_FILE.i:253:[value] Function k, behavior b2: precondition got status valid. @@ -382,15 +522,71 @@ PROJECT_FILE.i:276:[value] assigning non deterministic value for the first time [value] Done for function mpz_clear [value] Recording results for k [value] Done for function k +[value] computing for function l <- main. + Called from PROJECT_FILE.i:373. +PROJECT_FILE.i:346:[value] Assertion got status valid. +[value] computing for function mpz_init_set_si <- l <- main. + Called from PROJECT_FILE.i:348. +[value] Done for function mpz_init_set_si +[value] computing for function mpz_init_set_si <- l <- main. + Called from PROJECT_FILE.i:348. +[value] Done for function mpz_init_set_si +[value] computing for function mpz_cmp <- l <- main. + Called from PROJECT_FILE.i:349. +[value] Done for function mpz_cmp +[value] computing for function e_acsl_fail <- l <- main. + Called from PROJECT_FILE.i:350. +[value] computing for function printf <- e_acsl_fail <- l <- main. + Called from PROJECT_FILE.i:125. +[value] Done for function printf +[value] computing for function exit <- e_acsl_fail <- l <- main. + Called from PROJECT_FILE.i:125. +[value] Done for function exit +[value] Recording results for e_acsl_fail +[value] Done for function e_acsl_fail +[value] computing for function mpz_clear <- l <- main. + Called from PROJECT_FILE.i:351. +[value] Done for function mpz_clear +[value] computing for function mpz_clear <- l <- main. + Called from PROJECT_FILE.i:351. +[value] Done for function mpz_clear +[value] computing for function mpz_init_set_si <- l <- main. + Called from PROJECT_FILE.i:355. +[value] Done for function mpz_init_set_si +[value] computing for function mpz_init_set_si <- l <- main. + Called from PROJECT_FILE.i:355. +[value] Done for function mpz_init_set_si +[value] computing for function mpz_cmp <- l <- main. + Called from PROJECT_FILE.i:356. +[value] Done for function mpz_cmp +[value] computing for function e_acsl_fail <- l <- main. + Called from PROJECT_FILE.i:357. +[value] computing for function printf <- e_acsl_fail <- l <- main. + Called from PROJECT_FILE.i:125. +[value] Done for function printf +[value] computing for function exit <- e_acsl_fail <- l <- main. + Called from PROJECT_FILE.i:125. +[value] Done for function exit +[value] Recording results for e_acsl_fail +[value] Done for function e_acsl_fail +[value] computing for function mpz_clear <- l <- main. + Called from PROJECT_FILE.i:358. +[value] Done for function mpz_clear +[value] computing for function mpz_clear <- l <- main. + Called from PROJECT_FILE.i:358. +[value] Done for function mpz_clear +PROJECT_FILE.i:343:[value] Function l: postcondition got status valid. +[value] Recording results for l +[value] Done for function l [value] Recording results for main [value] done for function main [value] ====== VALUES COMPUTED ====== +[value] Values for function e_acsl_fail: + NON TERMINATING FUNCTION [value] Values for function f: X ∈ {1} [value] Values for function g: X ∈ {2} -[value] Values for function e_acsl_fail: - NON TERMINATING FUNCTION [value] Values for function h: X ∈ {3} [value] Values for function i: @@ -399,6 +595,7 @@ PROJECT_FILE.i:276:[value] assigning non deterministic value for the first time X ∈ {3} [value] Values for function k: X ∈ {5} +[value] Values for function l: [value] Values for function main: X ∈ {5} __retres ∈ {0} @@ -451,7 +648,6 @@ int Y = 2; void f(void) { X = 1; - goto return_label; { mpz_t e_acsl_1; mpz_t e_acsl_2; int e_acsl_3; mpz_init_set_si((__mpz_struct *)(e_acsl_1),(long)X); mpz_init_set_si((__mpz_struct *)(e_acsl_2),(long)1); @@ -459,10 +655,10 @@ void f(void) (__mpz_struct const *)(e_acsl_2)); if (! (e_acsl_3 == 0)) { e_acsl_fail((char *)"(X == 1)"); } mpz_clear((__mpz_struct *)(e_acsl_1)); - mpz_clear((__mpz_struct *)(e_acsl_2)); return_label: /* internal */ - return; + mpz_clear((__mpz_struct *)(e_acsl_2)); } + return; } /*@ ensures X ≡ 2; @@ -470,7 +666,6 @@ void f(void) void g(void) { X = 2; - goto return_label; { mpz_t e_acsl_1; mpz_t e_acsl_2; int e_acsl_3; mpz_t e_acsl_4; mpz_t e_acsl_5; int e_acsl_6; mpz_init_set_si((__mpz_struct *)(e_acsl_1),(long)X); @@ -486,10 +681,10 @@ void g(void) mpz_clear((__mpz_struct *)(e_acsl_1)); mpz_clear((__mpz_struct *)(e_acsl_2)); mpz_clear((__mpz_struct *)(e_acsl_4)); - mpz_clear((__mpz_struct *)(e_acsl_5)); return_label: /* internal */ - return; + mpz_clear((__mpz_struct *)(e_acsl_5)); } + return; } /*@ requires X ≡ 2; */ @@ -581,7 +776,6 @@ void j(void) } X = 3; - goto return_label; { mpz_t e_acsl_12; mpz_t e_acsl_13; int e_acsl_14; mpz_t e_acsl_15; mpz_t e_acsl_16; mpz_t e_acsl_17; mpz_t e_acsl_18; int e_acsl_19; mpz_init_set_si((__mpz_struct *)(e_acsl_12),(long)X); @@ -603,10 +797,10 @@ void j(void) mpz_clear((__mpz_struct *)(e_acsl_15)); mpz_clear((__mpz_struct *)(e_acsl_16)); mpz_clear((__mpz_struct *)(e_acsl_17)); - mpz_clear((__mpz_struct *)(e_acsl_18)); return_label: /* internal */ - return; + mpz_clear((__mpz_struct *)(e_acsl_18)); } + return; } /*@ behavior b1: @@ -723,6 +917,33 @@ void k(void) return; } +/*@ ensures X ≡ 5; */ +int l(void) +{ + /*@ assert Y ≡ 2; */ ; + { mpz_t e_acsl_1; mpz_t e_acsl_2; int e_acsl_3; + mpz_init_set_si((__mpz_struct *)(e_acsl_1),(long)Y); + mpz_init_set_si((__mpz_struct *)(e_acsl_2),(long)2); + e_acsl_3 = mpz_cmp((__mpz_struct const *)(e_acsl_1), + (__mpz_struct const *)(e_acsl_2)); + if (! (e_acsl_3 == 0)) { e_acsl_fail((char *)"(Y == 2)"); } + mpz_clear((__mpz_struct *)(e_acsl_1)); + mpz_clear((__mpz_struct *)(e_acsl_2)); + } + + { mpz_t e_acsl_4; mpz_t e_acsl_5; int e_acsl_6; + mpz_init_set_si((__mpz_struct *)(e_acsl_4),(long)X); + mpz_init_set_si((__mpz_struct *)(e_acsl_5),(long)5); + e_acsl_6 = mpz_cmp((__mpz_struct const *)(e_acsl_4), + (__mpz_struct const *)(e_acsl_5)); + if (! (e_acsl_6 == 0)) { e_acsl_fail((char *)"(X == 5)"); } + mpz_clear((__mpz_struct *)(e_acsl_4)); + mpz_clear((__mpz_struct *)(e_acsl_5)); + } + + return (X); +} + int main(void) { int __retres; @@ -732,6 +953,7 @@ int main(void) i(); j(); k(); + l(); __retres = 0; return (__retres); } diff --git a/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/gen_function_contract.c b/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/gen_function_contract.c index 905f2505d5d5ec5111f9a0f22457d7fb447a67ed..8bb2d6e477882cacbb8749119408bc72aa679ac9 100644 --- a/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/gen_function_contract.c +++ b/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/gen_function_contract.c @@ -581,7 +581,6 @@ int Y = 2; void f(void) { X = 1; - goto return_label; { mpz_t e_acsl_1; mpz_t e_acsl_2; int e_acsl_3; __gmpz_init_set_si((__mpz_struct *)(e_acsl_1),(long)X); __gmpz_init_set_si((__mpz_struct *)(e_acsl_2),(long)1); @@ -589,10 +588,10 @@ void f(void) (__mpz_struct const *)(e_acsl_2)); if (! (e_acsl_3 == 0)) { e_acsl_fail((char *)"(X == 1)"); } __gmpz_clear((__mpz_struct *)(e_acsl_1)); - __gmpz_clear((__mpz_struct *)(e_acsl_2)); return_label: /* internal */ - return; + __gmpz_clear((__mpz_struct *)(e_acsl_2)); } + return; } /*@ ensures X ≡ 2; @@ -600,7 +599,6 @@ void f(void) void g(void) { X = 2; - goto return_label; { mpz_t e_acsl_1; mpz_t e_acsl_2; int e_acsl_3; mpz_t e_acsl_4; mpz_t e_acsl_5; int e_acsl_6; __gmpz_init_set_si((__mpz_struct *)(e_acsl_1),(long)X); @@ -616,10 +614,10 @@ void g(void) __gmpz_clear((__mpz_struct *)(e_acsl_1)); __gmpz_clear((__mpz_struct *)(e_acsl_2)); __gmpz_clear((__mpz_struct *)(e_acsl_4)); - __gmpz_clear((__mpz_struct *)(e_acsl_5)); return_label: /* internal */ - return; + __gmpz_clear((__mpz_struct *)(e_acsl_5)); } + return; } /*@ requires X ≡ 2; */ @@ -711,7 +709,6 @@ void j(void) } X = 3; - goto return_label; { mpz_t e_acsl_12; mpz_t e_acsl_13; int e_acsl_14; mpz_t e_acsl_15; mpz_t e_acsl_16; mpz_t e_acsl_17; mpz_t e_acsl_18; int e_acsl_19; __gmpz_init_set_si((__mpz_struct *)(e_acsl_12),(long)X); @@ -733,10 +730,10 @@ void j(void) __gmpz_clear((__mpz_struct *)(e_acsl_15)); __gmpz_clear((__mpz_struct *)(e_acsl_16)); __gmpz_clear((__mpz_struct *)(e_acsl_17)); - __gmpz_clear((__mpz_struct *)(e_acsl_18)); return_label: /* internal */ - return; + __gmpz_clear((__mpz_struct *)(e_acsl_18)); } + return; } /*@ behavior b1: @@ -854,6 +851,33 @@ void k(void) return; } +/*@ ensures X ≡ 5; */ +int l(void) +{ + /*@ assert Y ≡ 2; */ ; + { mpz_t e_acsl_1; mpz_t e_acsl_2; int e_acsl_3; + __gmpz_init_set_si((__mpz_struct *)(e_acsl_1),(long)Y); + __gmpz_init_set_si((__mpz_struct *)(e_acsl_2),(long)2); + e_acsl_3 = __gmpz_cmp((__mpz_struct const *)(e_acsl_1), + (__mpz_struct const *)(e_acsl_2)); + if (! (e_acsl_3 == 0)) { e_acsl_fail((char *)"(Y == 2)"); } + __gmpz_clear((__mpz_struct *)(e_acsl_1)); + __gmpz_clear((__mpz_struct *)(e_acsl_2)); + } + + { mpz_t e_acsl_4; mpz_t e_acsl_5; int e_acsl_6; + __gmpz_init_set_si((__mpz_struct *)(e_acsl_4),(long)X); + __gmpz_init_set_si((__mpz_struct *)(e_acsl_5),(long)5); + e_acsl_6 = __gmpz_cmp((__mpz_struct const *)(e_acsl_4), + (__mpz_struct const *)(e_acsl_5)); + if (! (e_acsl_6 == 0)) { e_acsl_fail((char *)"(X == 5)"); } + __gmpz_clear((__mpz_struct *)(e_acsl_4)); + __gmpz_clear((__mpz_struct *)(e_acsl_5)); + } + + return (X); +} + int main(void) { int __retres; @@ -863,6 +887,7 @@ int main(void) i(); j(); k(); + l(); __retres = 0; return (__retres); } diff --git a/src/plugins/e-acsl/visit.ml b/src/plugins/e-acsl/visit.ml index 2fc97d1856d4b509d72a7283e4fdf0139bbe50b0..5f93279bf3134aa990087f232c337a2fcff49a6f 100644 --- a/src/plugins/e-acsl/visit.ml +++ b/src/plugins/e-acsl/visit.ml @@ -593,11 +593,8 @@ class e_acsl_visitor prj generate = object (self) (fun (User old_a | AI(_, old_a)) (env, post_stmts) -> let a = (* [VP] Don't use Visitor here, as it will fill the - queue in the middle of the computation... - *) - Cil.visitCilCodeAnnotation - (self :> Cil.cilVisitor) - old_a + queue in the middle of the computation... *) + Cil.visitCilCodeAnnotation (self :> Cil.cilVisitor) old_a in let kf = Cil.get_kernel_function self#behavior (Extlib.the self#current_kf) @@ -607,8 +604,7 @@ class e_acsl_visitor prj generate = object (self) in let post_stmts = match post_block with | None -> post_stmts - | Some b -> - mkStmt ~valid_sid:true (Block b) :: post_stmts + | Some b -> mkStmt ~valid_sid:true (Block b) :: post_stmts in env, post_stmts) (get_original_stmt self#behavior stmt) @@ -638,7 +634,7 @@ class e_acsl_visitor prj generate = object (self) | Some b -> (* that is the return stmt of a function with a postcondition *) post_block <- None; - post_stmts @ [ mkStmt ~valid_sid:true (Block b) ] + mkStmt ~valid_sid:true (Block b) :: post_stmts else post_stmts in