diff --git a/src/plugins/e-acsl/tests/runtime/oracle/gen_ranges_in_builtins.c b/src/plugins/e-acsl/tests/runtime/oracle/gen_ranges_in_builtins.c index be415a777f7fb66cf91060d6acf4cfa2fe63d271..3ab8f51b1b5c794751636bf00dccf01b91b52a22 100644 --- a/src/plugins/e-acsl/tests/runtime/oracle/gen_ranges_in_builtins.c +++ b/src/plugins/e-acsl/tests/runtime/oracle/gen_ranges_in_builtins.c @@ -19,8 +19,7 @@ int main(void) { int __gen_e_acsl_valid; __gen_e_acsl_valid = __e_acsl_valid((void *)((char *)a + 4 * 0), - (size_t)(4 * (4 - 0)),(void *)a, - (void *)(& a)); + (size_t)16,(void *)a,(void *)(& a)); __e_acsl_assert(__gen_e_acsl_valid,(char *)"Assertion",(char *)"main", (char *)"\\valid(a + (0 .. 4))",13); } @@ -38,8 +37,7 @@ int main(void) { int __gen_e_acsl_valid_3; __gen_e_acsl_valid_3 = __e_acsl_valid((void *)((char *)a + 4 * 10), - (size_t)(4 * (11 - 10)),(void *)a, - (void *)(& a)); + (size_t)4,(void *)a,(void *)(& a)); __e_acsl_assert(! __gen_e_acsl_valid_3,(char *)"Assertion", (char *)"main",(char *)"!\\valid(a + (10 .. 11))",16); } @@ -49,18 +47,16 @@ int main(void) /*@ assert \valid(b + (0 .. 10)); */ { int __gen_e_acsl_valid_4; - __gen_e_acsl_valid_4 = __e_acsl_valid((void *)(b + 1 * 0), - (size_t)(1 * (10 - 0)),(void *)b, - (void *)(& b)); + __gen_e_acsl_valid_4 = __e_acsl_valid((void *)(b + 1 * 0),(size_t)10, + (void *)b,(void *)(& b)); __e_acsl_assert(__gen_e_acsl_valid_4,(char *)"Assertion",(char *)"main", (char *)"\\valid(b + (0 .. 10))",21); } /*@ assert ¬\valid(b + (11 .. 15)); */ { int __gen_e_acsl_valid_5; - __gen_e_acsl_valid_5 = __e_acsl_valid((void *)(b + 1 * 11), - (size_t)(1 * (15 - 11)),(void *)b, - (void *)(& b)); + __gen_e_acsl_valid_5 = __e_acsl_valid((void *)(b + 1 * 11),(size_t)4, + (void *)b,(void *)(& b)); __e_acsl_assert(! __gen_e_acsl_valid_5,(char *)"Assertion", (char *)"main",(char *)"!\\valid(b + (11 .. 15))",22); } @@ -71,8 +67,7 @@ int main(void) { int __gen_e_acsl_valid_6; __gen_e_acsl_valid_6 = __e_acsl_valid((void *)((char *)(t) + 8 * 0), - (size_t)(8 * (2 - 0)),(void *)(t), - (void *)(t)); + (size_t)16,(void *)(t),(void *)(t)); __e_acsl_assert(__gen_e_acsl_valid_6,(char *)"Assertion",(char *)"main", (char *)"\\valid(&t[0 .. 2])",25); } @@ -80,8 +75,7 @@ int main(void) { int __gen_e_acsl_valid_7; __gen_e_acsl_valid_7 = __e_acsl_valid((void *)((char *)(t) + 8 * 3), - (size_t)(8 * (5 - 3)),(void *)(t), - (void *)(t)); + (size_t)16,(void *)(t),(void *)(t)); __e_acsl_assert(! __gen_e_acsl_valid_7,(char *)"Assertion", (char *)"main",(char *)"!\\valid(&t[3 .. 5])",26); } @@ -94,7 +88,7 @@ int main(void) int __gen_e_acsl_initialized; __gen_e_acsl_initialized = __e_acsl_initialized((void *)((char *)(t2) + 8 * 0), - (size_t)(8 * (1 - 0))); + (size_t)8); __e_acsl_assert(__gen_e_acsl_initialized,(char *)"Assertion", (char *)"main",(char *)"\\initialized(&t2[0 .. 1])",31); } @@ -103,7 +97,7 @@ int main(void) int __gen_e_acsl_initialized_2; __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)((char *)(t2) + 8 * 2), - (size_t)(8 * (3 - 2))); + (size_t)8); __e_acsl_assert(! __gen_e_acsl_initialized_2,(char *)"Assertion", (char *)"main",(char *)"!\\initialized(&t2[2 .. 3])",32); } @@ -111,7 +105,7 @@ int main(void) { int __gen_e_acsl_initialized_3; __gen_e_acsl_initialized_3 = __e_acsl_initialized((void *)(b + 1 * 0), - (size_t)(1 * (10 - 0))); + (size_t)10); __e_acsl_assert(! __gen_e_acsl_initialized_3,(char *)"Assertion", (char *)"main",(char *)"!\\initialized(b + (0 .. 10))", 34); @@ -121,21 +115,21 @@ int main(void) /*@ assert ¬\initialized(&t3[n - 1 .. n + 2][1][0 .. 1]); */ { int __gen_e_acsl_forall; - int __gen_e_acsl_range_5429; + int __gen_e_acsl_range_2; __gen_e_acsl_forall = 1; - __gen_e_acsl_range_5429 = 0; + __gen_e_acsl_range_2 = 0; while (1) { - if (__gen_e_acsl_range_5429 <= 1) ; else break; + if (__gen_e_acsl_range_2 <= 1) ; else break; { int __gen_e_acsl_forall_2; - long __gen_e_acsl_range_5428; + long __gen_e_acsl_range; __gen_e_acsl_forall_2 = 1; - __gen_e_acsl_range_5428 = n - 1L; + __gen_e_acsl_range = n - 1L; while (1) { - if (__gen_e_acsl_range_5428 <= n + 2L) ; else break; + if (__gen_e_acsl_range <= n + 2L) ; else break; { int __gen_e_acsl_initialized_4; - __gen_e_acsl_initialized_4 = __e_acsl_initialized((void *)(& t3[__gen_e_acsl_range_5428][1][__gen_e_acsl_range_5429]), + __gen_e_acsl_initialized_4 = __e_acsl_initialized((void *)(& t3[__gen_e_acsl_range][1][__gen_e_acsl_range_2]), sizeof(float)); if (__gen_e_acsl_initialized_4) ; else { @@ -143,7 +137,7 @@ int main(void) goto e_acsl_end_loop1; } } - __gen_e_acsl_range_5428 ++; + __gen_e_acsl_range ++; } e_acsl_end_loop1: ; if (__gen_e_acsl_forall_2) ; @@ -152,13 +146,50 @@ int main(void) goto e_acsl_end_loop2; } } - __gen_e_acsl_range_5429 ++; + __gen_e_acsl_range_2 ++; } e_acsl_end_loop2: ; __e_acsl_assert(! __gen_e_acsl_forall,(char *)"Assertion",(char *)"main", (char *)"!\\initialized(&t3[n - 1 .. n + 2][1][0 .. 1])", 39); } + /*@ assert ¬\valid_read(&t3[6][1][0] + (2 .. 10)); */ + { + int __gen_e_acsl_valid_read; + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)((char *)(& t3[6][1][0]) + + 4 * 2),(size_t)32, + (void *)(& t3[6][1][0]), + (void *)0); + __e_acsl_assert(! __gen_e_acsl_valid_read,(char *)"Assertion", + (char *)"main", + (char *)"!\\valid_read(&t3[6][1][0] + (2 .. 10))",41); + } + /*@ assert \valid_read(&t3[n - 1 .. n + 2][1]); */ + { + int __gen_e_acsl_forall_3; + long __gen_e_acsl_range_3; + __gen_e_acsl_forall_3 = 1; + __gen_e_acsl_range_3 = n - 1L; + while (1) { + if (__gen_e_acsl_range_3 <= n + 2L) ; else break; + { + int __gen_e_acsl_valid_read_2; + __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)(& t3[__gen_e_acsl_range_3][1]), + sizeof(float [4]), + (void *)(& t3[__gen_e_acsl_range_3][1]), + (void *)0); + if (__gen_e_acsl_valid_read_2) ; + else { + __gen_e_acsl_forall_3 = 0; + goto e_acsl_end_loop3; + } + } + __gen_e_acsl_range_3 ++; + } + e_acsl_end_loop3: ; + __e_acsl_assert(__gen_e_acsl_forall_3,(char *)"Assertion",(char *)"main", + (char *)"\\valid_read(&t3[n - 1 .. n + 2][1])",42); + } __retres = 0; __e_acsl_delete_block((void *)(t3)); __e_acsl_delete_block((void *)(t2)); diff --git a/src/plugins/e-acsl/tests/runtime/ranges_in_builtins.c b/src/plugins/e-acsl/tests/runtime/ranges_in_builtins.c index ee1064b721b011ff12c6fb71954dd04b3e09730d..8332495491577b9b6880b9083cbc396ef0e402ba 100644 --- a/src/plugins/e-acsl/tests/runtime/ranges_in_builtins.c +++ b/src/plugins/e-acsl/tests/runtime/ranges_in_builtins.c @@ -37,4 +37,7 @@ int main(void) { int n = 2; float t3[7][2][4]; /*@ assert !\initialized(&t3[(n-1)..(n+2)][1][0..1]); */ ; + + /*@ assert !\valid_read(&t3[6][1][0] + (2..10)); */ + /*@ assert \valid_read(&t3[(n-1)..(n+2)][1]); */ } \ No newline at end of file diff --git a/src/plugins/e-acsl/translate.ml b/src/plugins/e-acsl/translate.ml index 029ff74f8bc74a16094fa0498539884959c9ccc1..a3d2bbae2a53f0cd1ad35c85174a4639f7478a32 100644 --- a/src/plugins/e-acsl/translate.ml +++ b/src/plugins/e-acsl/translate.ml @@ -650,8 +650,8 @@ and mmodel_call_with_ranges ~loc kf name ctx env t mmodel_call_default = from set<lty> to lty *) | Ltype(lti, [lty]) when lti.lt_name = "set" -> lty - | Ltype _ | Ctype _ | Linteger | Lreal | Larrow _ | Lvar _ -> - assert false + | Ltype _ | Ctype _ | Linteger | Lreal | Larrow _ | Lvar _ as lty -> + lty in let t' = Logic_const.term ~loc @@ -663,8 +663,10 @@ and mmodel_call_with_ranges ~loc kf name ctx env t mmodel_call_default = Logic_const.pvalid ~loc (Logic_const.here_label, t') | "initialized" -> Logic_const.pinitialized ~loc (Logic_const.here_label, t') - | _ -> - assert false + | "valid_read" -> + Logic_const.pvalid_read ~loc (Logic_const.here_label, t') + | _ as s -> + Options.fatal "unexpected builtin %s during range elimination" s; in let p_quantified = List.fold_left (fun p (tmin, lv, tmax) -> @@ -688,7 +690,7 @@ and mmodel_call_with_ranges ~loc kf name ctx env t mmodel_call_default = and mmodel_call_memory_block ~loc kf name ctx env p r = (* Call to [__e_acsl_<name>] for term of the form [p + r] - when [<name> = valid or initialized] (TODO: valid_read) and + when [<name> = valid or initialized or valid_read] and where [p] is an address, [r] a range offset *) let n1, n2 = match r.term_node with | Trange(Some n1, Some n2) -> @@ -728,6 +730,7 @@ and mmodel_call_memory_block ~loc kf name ctx env p r = let ctx_ity = Typing.integer_ty_of_typ ctx in Typing.type_term ~use_gmp_opt:true ~ctx:ctx_ity size; let size, env = term_to_exp kf env size in + let size = Cil.constFold false size in (* base and base_addr *) let base, _ = Misc.ptr_index ~loc ptr in let base_addr = match base.enode with @@ -748,7 +751,7 @@ and mmodel_call_memory_block ~loc kf name ctx env p r = let args = match name with | "valid" | "valid_read" -> [ ptr; size; base; base_addr ] | "initialized" -> [ ptr; size ] - | _ -> not_yet env ("builtin" ^ name) + | _ -> not_yet env ("builtin " ^ name) in [ Misc.mk_call ~loc ~result:(Cil.var v) fname args ]) in @@ -820,8 +823,9 @@ and bounded_lv_of_range t = match t.term_node with | Trange(Some n1, Some n2) -> let id = Cil_const.new_raw_id () in + let name = Env.Varname.get ~scope:Env.Local_block "range" in let lv = { - lv_name = "range_" ^ (string_of_int id); + lv_name = name; lv_id = id; lv_type = Linteger; lv_kind = LVQuant;