Skip to content
Snippets Groups Projects
Commit b484b3f6 authored by Julien Signoles's avatar Julien Signoles
Browse files

[typing] fix inference of intervals for complex term_lval

parent 3cf2b60e
No related branches found
No related tags found
No related merge requests found
...@@ -109,12 +109,6 @@ let infer_sizeof ty = ...@@ -109,12 +109,6 @@ let infer_sizeof ty =
let infer_alignof ty = singleton_of_int (Cil.bytesAlignOf ty) let infer_alignof ty = singleton_of_int (Cil.bytesAlignOf ty)
(* used to infer type for offsets *)
type offset_interv =
| I_no_offset (* no offset for this lvalue: will use the host *)
| I_field of interv (* a field with its infered interval *)
| I_index (* an index *)
let rec infer env t = let rec infer env t =
let get_cty t = match t.term_type with Ctype ty -> ty | _ -> assert false in let get_cty t = match t.term_type with Ctype ty -> ty | _ -> assert false in
match t.term_node with match t.term_node with
...@@ -251,12 +245,12 @@ let rec infer env t = ...@@ -251,12 +245,12 @@ let rec infer env t =
| Ttype _ | Ttype _
| Tempty_set -> raise Not_an_integer | Tempty_set -> raise Not_an_integer
and infer_term_lval env (host, offset) = and infer_term_lval env (host, offset as tlv) =
let io = infer_term_offset env offset in match offset with
match io with | TNoOffset -> infer_term_host env host
| I_no_offset -> infer_term_host env host | _ ->
| I_field i -> i let ty = Logic_utils.logicCType (Cil.typeOfTermLval tlv) in
| I_index -> raise Not_an_integer interv_of_typ ty
and infer_term_host env = function and infer_term_host env = function
| TVar v -> | TVar v ->
...@@ -272,21 +266,6 @@ and infer_term_host env = function ...@@ -272,21 +266,6 @@ and infer_term_host env = function
Printer.pp_typ ty Printer.pp_typ ty
Printer.pp_term t Printer.pp_term t
and infer_term_offset env = function
| TNoOffset -> I_no_offset
| TField (f, o) ->
let io = infer_term_offset env o in
(match io with
| I_no_offset -> I_field (interv_of_typ f.ftype)
| I_field _ as i -> i
| I_index ->
(match Cil.unrollType f.ftype with
| TArray(ty, _, _, _) -> I_field (interv_of_typ ty)
| TPtr _ -> raise Not_an_integer
| _ -> assert false))
| TIndex _ -> I_index
| TModel _ -> Error.not_yet "model"
(* (*
Local Variables: Local Variables:
compile-command: "make" compile-command: "make"
......
...@@ -35,16 +35,16 @@ int search(int elt) ...@@ -35,16 +35,16 @@ int search(int elt)
__gen_e_acsl_i = 0; __gen_e_acsl_i = 0;
while (1) { while (1) {
if (__gen_e_acsl_i < k) ; else break; if (__gen_e_acsl_i < k) ; else break;
__e_acsl_assert(__gen_e_acsl_i < 10,(char *)"RTE",(char *)"search", __e_acsl_assert((unsigned int)((unsigned long)__gen_e_acsl_i) < 10,
(char *)"index_bound: __gen_e_acsl_i < 10",18); (char *)"RTE",(char *)"search",
__e_acsl_assert(0 <= __gen_e_acsl_i,(char *)"RTE",(char *)"search", (char *)"index_bound: (unsigned long)__gen_e_acsl_i < 10",
(char *)"index_bound: 0 <= __gen_e_acsl_i",18); 18);
if (A[__gen_e_acsl_i] < elt) ; if (A[(unsigned long)__gen_e_acsl_i] < elt) ;
else { else {
__gen_e_acsl_forall = 0; __gen_e_acsl_forall = 0;
goto e_acsl_end_loop1; goto e_acsl_end_loop1;
} }
__gen_e_acsl_i ++; __gen_e_acsl_i = (int)(__gen_e_acsl_i + 1L);
} }
e_acsl_end_loop1: ; e_acsl_end_loop1: ;
__e_acsl_assert(__gen_e_acsl_forall,(char *)"Invariant",(char *)"search", __e_acsl_assert(__gen_e_acsl_forall,(char *)"Invariant",(char *)"search",
...@@ -79,18 +79,16 @@ int search(int elt) ...@@ -79,18 +79,16 @@ int search(int elt)
__gen_e_acsl_i_2 = 0; __gen_e_acsl_i_2 = 0;
while (1) { while (1) {
if (__gen_e_acsl_i_2 < k) ; else break; if (__gen_e_acsl_i_2 < k) ; else break;
__e_acsl_assert(__gen_e_acsl_i_2 < 10,(char *)"RTE", __e_acsl_assert((unsigned int)((unsigned long)__gen_e_acsl_i_2) < 10,
(char *)"search", (char *)"RTE",(char *)"search",
(char *)"index_bound: __gen_e_acsl_i_2 < 10",18); (char *)"index_bound: (unsigned long)__gen_e_acsl_i_2 < 10",
__e_acsl_assert(0 <= __gen_e_acsl_i_2,(char *)"RTE", 18);
(char *)"search", if (A[(unsigned long)__gen_e_acsl_i_2] < elt) ;
(char *)"index_bound: 0 <= __gen_e_acsl_i_2",18);
if (A[__gen_e_acsl_i_2] < elt) ;
else { else {
__gen_e_acsl_forall_2 = 0; __gen_e_acsl_forall_2 = 0;
goto e_acsl_end_loop2; goto e_acsl_end_loop2;
} }
__gen_e_acsl_i_2 ++; __gen_e_acsl_i_2 = (int)(__gen_e_acsl_i_2 + 1L);
} }
e_acsl_end_loop2: ; e_acsl_end_loop2: ;
__e_acsl_assert(__gen_e_acsl_forall_2,(char *)"Invariant", __e_acsl_assert(__gen_e_acsl_forall_2,(char *)"Invariant",
...@@ -150,10 +148,10 @@ int __gen_e_acsl_search(int elt) ...@@ -150,10 +148,10 @@ int __gen_e_acsl_search(int elt)
__gen_e_acsl_i = 0; __gen_e_acsl_i = 0;
while (1) { while (1) {
if (__gen_e_acsl_i < 9) ; else break; if (__gen_e_acsl_i < 9) ; else break;
__e_acsl_assert(__gen_e_acsl_i + 1 < 10,(char *)"RTE",(char *)"search", __e_acsl_assert((unsigned int)((unsigned long)(__gen_e_acsl_i + 1)) < 10,
(char *)"index_bound: (int)(__gen_e_acsl_i+1) < 10",7); (char *)"RTE",(char *)"search",
__e_acsl_assert(0 <= __gen_e_acsl_i + 1,(char *)"RTE",(char *)"search", (char *)"index_bound: (unsigned long)(__gen_e_acsl_i+1) < 10",
(char *)"index_bound: 0 <= (int)(__gen_e_acsl_i+1)",7); 7);
__e_acsl_assert(__gen_e_acsl_i < 10,(char *)"RTE",(char *)"search", __e_acsl_assert(__gen_e_acsl_i < 10,(char *)"RTE",(char *)"search",
(char *)"index_bound: __gen_e_acsl_i < 10",7); (char *)"index_bound: __gen_e_acsl_i < 10",7);
__e_acsl_assert(0 <= __gen_e_acsl_i,(char *)"RTE",(char *)"search", __e_acsl_assert(0 <= __gen_e_acsl_i,(char *)"RTE",(char *)"search",
...@@ -163,7 +161,7 @@ int __gen_e_acsl_search(int elt) ...@@ -163,7 +161,7 @@ int __gen_e_acsl_search(int elt)
__gen_e_acsl_forall = 0; __gen_e_acsl_forall = 0;
goto e_acsl_end_loop3; goto e_acsl_end_loop3;
} }
__gen_e_acsl_i ++; __gen_e_acsl_i = (int)(__gen_e_acsl_i + 1L);
} }
e_acsl_end_loop3: ; e_acsl_end_loop3: ;
__e_acsl_assert(__gen_e_acsl_forall,(char *)"Precondition", __e_acsl_assert(__gen_e_acsl_forall,(char *)"Precondition",
...@@ -186,7 +184,7 @@ int __gen_e_acsl_search(int elt) ...@@ -186,7 +184,7 @@ int __gen_e_acsl_search(int elt)
__gen_e_acsl_forall_2 = 0; __gen_e_acsl_forall_2 = 0;
goto e_acsl_end_loop5; goto e_acsl_end_loop5;
} }
__gen_e_acsl_j_2 ++; __gen_e_acsl_j_2 = (int)(__gen_e_acsl_j_2 + 1L);
} }
e_acsl_end_loop5: ; e_acsl_end_loop5: ;
__gen_e_acsl_at_2 = __gen_e_acsl_forall_2; __gen_e_acsl_at_2 = __gen_e_acsl_forall_2;
...@@ -207,7 +205,7 @@ int __gen_e_acsl_search(int elt) ...@@ -207,7 +205,7 @@ int __gen_e_acsl_search(int elt)
__gen_e_acsl_exists = 1; __gen_e_acsl_exists = 1;
goto e_acsl_end_loop4; goto e_acsl_end_loop4;
} }
__gen_e_acsl_j ++; __gen_e_acsl_j = (int)(__gen_e_acsl_j + 1L);
} }
e_acsl_end_loop4: ; e_acsl_end_loop4: ;
__gen_e_acsl_at = __gen_e_acsl_exists; __gen_e_acsl_at = __gen_e_acsl_exists;
......
...@@ -37,12 +37,16 @@ int main(void) ...@@ -37,12 +37,16 @@ int main(void)
(char *)"*p == 1",11); (char *)"*p == 1",11);
} }
/*@ assert t[0] ≡ 2; */ /*@ assert t[0] ≡ 2; */
__e_acsl_assert(t[0] == 2,(char *)"Assertion",(char *)"main", __e_acsl_assert(t[0UL] == 2,(char *)"Assertion",(char *)"main",
(char *)"t[0] == 2",12); (char *)"t[0] == 2",12);
/*@ assert t[2] ≡ 4; */ /*@ assert t[2] ≡ 4; */
__e_acsl_assert(t[2] == 4,(char *)"Assertion",(char *)"main", __e_acsl_assert(t[2] == 4,(char *)"Assertion",(char *)"main",
(char *)"t[2] == 4",13); (char *)"t[2] == 4",13);
/*@ assert t[(2*sizeof(int))/sizeof((int)0x0)] ≡ 4; */ /*@ assert t[(2*sizeof(int))/sizeof((int)0x0)] ≡ 4; */
__e_acsl_assert((unsigned long)((unsigned long)(2 * 4) / 4) < 3,
(char *)"RTE",(char *)"main",
(char *)"index_bound: (unsigned long)((unsigned long)(2*4)/4) < 3",
14);
__e_acsl_assert(t[(2 * 4) / 4] == 4,(char *)"Assertion",(char *)"main", __e_acsl_assert(t[(2 * 4) / 4] == 4,(char *)"Assertion",(char *)"main",
(char *)"t[(2*sizeof(int))/sizeof((int)0x0)] == 4",14); (char *)"t[(2*sizeof(int))/sizeof((int)0x0)] == 4",14);
{ {
...@@ -50,30 +54,28 @@ int main(void) ...@@ -50,30 +54,28 @@ int main(void)
i = 0; i = 0;
while (i < 2) { while (i < 2) {
/*@ assert t[i] ≡ i+2; */ /*@ assert t[i] ≡ i+2; */
__e_acsl_assert(i < 3,(char *)"RTE",(char *)"main", __e_acsl_assert((unsigned int)((unsigned long)i) < 3,(char *)"RTE",
(char *)"index_bound: i < 3",17); (char *)"main",
__e_acsl_assert(0 <= i,(char *)"RTE",(char *)"main", (char *)"index_bound: (unsigned long)i < 3",17);
(char *)"index_bound: 0 <= i",17); __e_acsl_assert(t[(unsigned long)i] == i + 2,(char *)"Assertion",
__e_acsl_assert((long)t[i] == (long)i + (long)2,(char *)"Assertion",
(char *)"main",(char *)"t[i] == i+2",17); (char *)"main",(char *)"t[i] == i+2",17);
/*@ assert t[2-i] ≡ 4-i; */ /*@ assert t[2-i] ≡ 4-i; */
__e_acsl_assert((long)2 - (long)i < (long)3,(char *)"RTE", __e_acsl_assert((unsigned int)((unsigned long)(2 - i)) < 3,
(char *)"main", (char *)"RTE",(char *)"main",
(char *)"index_bound: (long)(2-(long)i) < 3",18); (char *)"index_bound: (unsigned long)((long)(2-i)) < 3",
__e_acsl_assert(0L <= (long)2 - (long)i,(char *)"RTE",(char *)"main", 18);
(char *)"index_bound: 0 <= (long)(2-(long)i)",18); __e_acsl_assert(t[(unsigned long)(2 - i)] == 4 - i,(char *)"Assertion",
__e_acsl_assert((long)t[(long)2 - (long)i] == (long)4 - (long)i, (char *)"main",(char *)"t[2-i] == 4-i",18);
(char *)"Assertion",(char *)"main",
(char *)"t[2-i] == 4-i",18);
/*@ assert *(&t[2]-i) ≡ 4-i; */ /*@ assert *(&t[2]-i) ≡ 4-i; */
{ {
int __gen_e_acsl_valid_read_2; int __gen_e_acsl_valid_read_2;
__gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)(& t[2] - i), __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)(& t[2] - (unsigned long)i),
sizeof(int)); sizeof(int));
__e_acsl_assert(__gen_e_acsl_valid_read_2,(char *)"RTE", __e_acsl_assert(__gen_e_acsl_valid_read_2,(char *)"RTE",
(char *)"main", (char *)"main",
(char *)"mem_access: \\valid_read(&t[2]-i)",19); (char *)"mem_access: \\valid_read(&t[2]-(unsigned long)i)",
__e_acsl_assert((long)*(& t[2] - i) == (long)4 - (long)i, 19);
__e_acsl_assert(*(& t[2] - (unsigned long)i) == 4 - i,
(char *)"Assertion",(char *)"main", (char *)"Assertion",(char *)"main",
(char *)"*(&t[2]-i) == 4-i",19); (char *)"*(&t[2]-i) == 4-i",19);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment