From ffb8b4cc9a3295d5a1ad2cceac7ea76fde587a0b Mon Sep 17 00:00:00 2001 From: Jan Rochel <jan.rochel@cea.fr> Date: Wed, 6 Mar 2024 18:24:17 +0100 Subject: [PATCH] [alias] fix inverted offsets The readout reconstructed offsets in the wrong order. This fixes tests/known_bugs/union_readback.c Fixes #1368 --- src/plugins/alias/src/abstract_state.ml | 4 +- .../tests/fixed_bugs/oracle/origin.res.oracle | 8 +- .../oracle/union_readback.res.oracle | 16 +++ .../union_readback.c | 0 .../tests/offsets/oracle/nested2.res.oracle | 10 +- .../real_world/oracle/example1.res.oracle | 64 ++++++------ .../real_world/oracle/example2.res.oracle | 98 +++++++++---------- 7 files changed, 107 insertions(+), 93 deletions(-) create mode 100644 src/plugins/alias/tests/fixed_bugs/oracle/union_readback.res.oracle rename src/plugins/alias/tests/{known_bugs => fixed_bugs}/union_readback.c (100%) diff --git a/src/plugins/alias/src/abstract_state.ml b/src/plugins/alias/src/abstract_state.ml index 811472106b7..1878a7f6e60 100644 --- a/src/plugins/alias/src/abstract_state.ml +++ b/src/plugins/alias/src/abstract_state.ml @@ -171,14 +171,14 @@ module Readout = struct (fun e -> let pred_lvals = checking_for_cycles s visited @@ E.src e in let modify_lval lv = match E.label e with - | Field f -> let lhost, o = lv in lhost, Field (f, o) + | Field f -> Cil.addOffsetLval (Field (f, NoOffset)) lv | Pointer -> (* TODO: This Cil.typeOfLval may crash with a fatal kernel error for certain reconstructed lvals involving a union type. See tests/known_bugs/union_readback.c *) let ty = Cil.typeOfLval lv in if Cil.isArrayType ty then - let lhost, o = lv in lhost, Index (Simplified.nul_exp, o) + Cil.addOffsetLval (Index (Simplified.nul_exp, NoOffset)) lv else let () = if not @@ Cil.isPointerType ty then Options.debug "unexpected type: %a" Printer.pp_typ ty diff --git a/src/plugins/alias/tests/fixed_bugs/oracle/origin.res.oracle b/src/plugins/alias/tests/fixed_bugs/oracle/origin.res.oracle index 61e807ea83e..be7875287ef 100644 --- a/src/plugins/alias/tests/fixed_bugs/oracle/origin.res.oracle +++ b/src/plugins/alias/tests/fixed_bugs/oracle/origin.res.oracle @@ -11,19 +11,19 @@ [alias:unsafe-cast] origin.c:8: Warning: unsafe cast from int * to char *; analysis may be unsound [alias] May-aliases after instruction tmp = (void (*)(void))*((char *)(v.t)); are - { v[0..].t; tmp } + { v.t[0..]; tmp } [alias] May-alias graph after instruction tmp = (void (*)(void))*((char *)(v.t)); is 0:{ tmp } → 1:{ f } 4:{ v } -t→ 5:{ } 5:{ } → 0:{ tmp } [alias] analysing instruction: int g = (int)tmp; [alias:unsafe-cast] origin.c:8: Warning: unsafe cast from void (*)(void) to int; analysis may be unsound -[alias] May-aliases after instruction int g = (int)tmp; are { v[0..].t; tmp } +[alias] May-aliases after instruction int g = (int)tmp; are { v.t[0..]; tmp } [alias] May-alias graph after instruction int g = (int)tmp; is 0:{ tmp } → 1:{ f } 4:{ v } -t→ 5:{ } 5:{ } → 0:{ tmp } -[alias] May-aliases at the end of function f: { v[0..].t; tmp } +[alias] May-aliases at the end of function f: { v.t[0..]; tmp } [alias] May-alias graph at the end of function f: 0:{ tmp } → 1:{ f } 4:{ v } -t→ 5:{ } 5:{ } → 0:{ tmp } [alias] Summary of function f: formals: locals: g tmp→{ f } returns: <none> - state: { v[0..].t; tmp } + state: { v.t[0..]; tmp } [alias] Analysis complete diff --git a/src/plugins/alias/tests/fixed_bugs/oracle/union_readback.res.oracle b/src/plugins/alias/tests/fixed_bugs/oracle/union_readback.res.oracle new file mode 100644 index 00000000000..65fd01657cf --- /dev/null +++ b/src/plugins/alias/tests/fixed_bugs/oracle/union_readback.res.oracle @@ -0,0 +1,16 @@ +[kernel] Parsing union_readback.c (with preprocessing) +[alias] analysing function: f +[alias] analysing instruction: flag.r.v = o; +[alias] May-aliases after instruction flag.r.v = o; are + { o; flag.r.v } { *o; *(flag.r.v) } +[alias] May-alias graph after instruction flag.r.v = o; is + 0:{ flag } -r→ 1:{ } 1:{ } -v→ 2:{ o } 2:{ o } → 4:{ } + 4:{ } → 5:{ } +[alias] May-aliases at the end of function f: { o; flag.r.v } { *o; *(flag.r.v) } +[alias] May-alias graph at the end of function f: + 0:{ flag } -r→ 1:{ } 1:{ } -v→ 2:{ o } 2:{ o } → 4:{ } + 4:{ } → 5:{ } +[alias] Summary of function f: + formals: o locals: flag returns: <none> + state: { o; flag.r.v } { *o; *(flag.r.v) } +[alias] Analysis complete diff --git a/src/plugins/alias/tests/known_bugs/union_readback.c b/src/plugins/alias/tests/fixed_bugs/union_readback.c similarity index 100% rename from src/plugins/alias/tests/known_bugs/union_readback.c rename to src/plugins/alias/tests/fixed_bugs/union_readback.c diff --git a/src/plugins/alias/tests/offsets/oracle/nested2.res.oracle b/src/plugins/alias/tests/offsets/oracle/nested2.res.oracle index 8cfb818473b..70e6a01b0b6 100644 --- a/src/plugins/alias/tests/offsets/oracle/nested2.res.oracle +++ b/src/plugins/alias/tests/offsets/oracle/nested2.res.oracle @@ -55,7 +55,7 @@ unsafe cast from st_2_t * to struct struct_2_t *; analysis may be unsound [alias] May-aliases after instruction t->t = (struct struct_2_t *)z1; are { t->t; z1 } { (t->t)->c; z1->c; a } { (t->t)->s; z1->s } - { (*(t->t))[0..].s; (*z1)[0..].s } + { (t->t)->s[0..]; z1->s[0..] } [alias] May-alias graph after instruction t->t = (struct struct_2_t *)z1; is 1:{ } -s→ 6:{ } 1:{ } -c→ 12:{ a } 2:{ t } → 3:{ } 3:{ } -t→ 13:{ z1 } 6:{ } → 7:{ } 7:{ } → 8:{ x1; x2 } @@ -63,7 +63,7 @@ [alias] analysing instruction: t->d = a; [alias] May-aliases after instruction t->d = a; are { t->t; z1 } { (t->t)->c; z1->c; t->d; a } { (t->t)->s; z1->s } - { (*(t->t))[0..].s; (*z1)[0..].s } + { (t->t)->s[0..]; z1->s[0..] } [alias] May-alias graph after instruction t->d = a; is 1:{ } -s→ 6:{ } 1:{ } -c→ 14:{ a } 2:{ t } → 3:{ } 3:{ } -t→ 13:{ z1 } 3:{ } -d→ 14:{ a } 6:{ } → 7:{ } @@ -71,14 +71,14 @@ [alias] analysing instruction: __retres = 0; [alias] May-aliases after instruction __retres = 0; are { t->t; z1 } { (t->t)->c; z1->c; t->d; a } { (t->t)->s; z1->s } - { (*(t->t))[0..].s; (*z1)[0..].s } + { (t->t)->s[0..]; z1->s[0..] } [alias] May-alias graph after instruction __retres = 0; is 1:{ } -s→ 6:{ } 1:{ } -c→ 14:{ a } 2:{ t } → 3:{ } 3:{ } -t→ 13:{ z1 } 3:{ } -d→ 14:{ a } 6:{ } → 7:{ } 7:{ } → 8:{ x1; x2 } 13:{ z1 } → 1:{ } 14:{ a } → 5:{ } [alias] May-aliases at the end of function main: { t->t; z1 } { (t->t)->c; z1->c; t->d; a } { (t->t)->s; z1->s } - { (*(t->t))[0..].s; (*z1)[0..].s } + { (t->t)->s[0..]; z1->s[0..] } [alias] May-alias graph at the end of function main: 1:{ } -s→ 6:{ } 1:{ } -c→ 14:{ a } 2:{ t } → 3:{ } 3:{ } -t→ 13:{ z1 } 3:{ } -d→ 14:{ a } 6:{ } → 7:{ } @@ -86,5 +86,5 @@ [alias] Summary of function main: formals: locals: x1 x2 z1 t a __retres returns: __retres state: { t->t; z1 } { (t->t)->c; z1->c; t->d; a } { (t->t)->s; z1->s } - { (*(t->t))[0..].s; (*z1)[0..].s } + { (t->t)->s[0..]; z1->s[0..] } [alias] Analysis complete diff --git a/src/plugins/alias/tests/real_world/oracle/example1.res.oracle b/src/plugins/alias/tests/real_world/oracle/example1.res.oracle index a83fa243f1a..d0c1c5e7a0b 100644 --- a/src/plugins/alias/tests/real_world/oracle/example1.res.oracle +++ b/src/plugins/alias/tests/real_world/oracle/example1.res.oracle @@ -14,22 +14,22 @@ 0:{ x; tmp } → 1:{ } 4:{ idata } → 5:{ } [alias] analysing instruction: idata = tmp->t2[*(tmp->n2)]; [alias] May-aliases after instruction idata = tmp->t2[*(tmp->n2)]; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } [alias] May-alias graph after instruction idata = tmp->t2[*(tmp->n2)]; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } [alias] analysing instruction: odata = tmp->t1[*(tmp->n1)]; [alias] May-aliases after instruction odata = tmp->t1[*(tmp->n1)]; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction odata = tmp->t1[*(tmp->n1)]; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } 10:{ } → 8:{ odata } [alias] analysing instruction: idx = 0; [alias] May-aliases after instruction idx = 0; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction idx = 0; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } @@ -37,24 +37,24 @@ [alias] analysing instruction: tmp_1 = sin(*(idata + idx)); [alias:undefined:fn] example1.c:45: Warning: function sin has no definition [alias] May-aliases after instruction tmp_1 = sin(*(idata + idx)); are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction tmp_1 = sin(*(idata + idx)); is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } 10:{ } → 8:{ odata } [alias] analysing instruction: *(odata + idx) = 0.5 * tmp_1; [alias] May-aliases after instruction *(odata + idx) = 0.5 * tmp_1; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction *(odata + idx) = 0.5 * tmp_1; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } 10:{ } → 8:{ odata } [alias] analysing instruction: idx ++; [alias] May-aliases after instruction idx ++; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction idx ++; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } @@ -72,24 +72,24 @@ <empty> [alias] Summary of function swap: [alias] May-aliases after instruction swap(tmp->n1); are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction swap(tmp->n1); is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } 10:{ } → 8:{ odata } [alias] analysing instruction: idata = tmp->t2[*(tmp->n2)]; [alias] May-aliases after instruction idata = tmp->t2[*(tmp->n2)]; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction idata = tmp->t2[*(tmp->n2)]; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } 10:{ } → 8:{ odata } [alias] analysing instruction: odata = tmp->t1[*(tmp->n1)]; [alias] May-aliases after instruction odata = tmp->t1[*(tmp->n1)]; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction odata = tmp->t1[*(tmp->n1)]; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } @@ -117,22 +117,22 @@ 14:{ x; tmp } → 15:{ } 18:{ idata } → 19:{ } [alias] analysing instruction: idata = tmp->t1[*(tmp->n1)]; [alias] May-aliases after instruction idata = tmp->t1[*(tmp->n1)]; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } [alias] May-alias graph after instruction idata = tmp->t1[*(tmp->n1)]; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } [alias] analysing instruction: odata = tmp->t2[*(tmp->n2)]; [alias] May-aliases after instruction odata = tmp->t2[*(tmp->n2)]; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction odata = tmp->t2[*(tmp->n2)]; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } 22:{ odata } → 23:{ } 24:{ } → 22:{ odata } [alias] analysing instruction: idx = 0; [alias] May-aliases after instruction idx = 0; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction idx = 0; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } @@ -141,8 +141,8 @@ *(odata + idx) = (double)3 * *(idata + idx) + (double)1; [alias] May-aliases after instruction *(odata + idx) = (double)3 * *(idata + idx) + (double)1; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction *(odata + idx) = (double)3 * *(idata + idx) + (double)1; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } @@ -150,32 +150,32 @@ 22:{ odata } → 23:{ } 24:{ } → 22:{ odata } [alias] analysing instruction: idx ++; [alias] May-aliases after instruction idx ++; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction idx ++; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } 22:{ odata } → 23:{ } 24:{ } → 22:{ odata } [alias] analysing instruction: swap(tmp->n2); [alias] May-aliases after instruction swap(tmp->n2); are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction swap(tmp->n2); is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } 22:{ odata } → 23:{ } 24:{ } → 22:{ odata } [alias] analysing instruction: idata = tmp->t1[*(tmp->n1)]; [alias] May-aliases after instruction idata = tmp->t1[*(tmp->n1)]; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction idata = tmp->t1[*(tmp->n1)]; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } 22:{ odata } → 23:{ } 24:{ } → 22:{ odata } [alias] analysing instruction: odata = tmp->t2[*(tmp->n2)]; [alias] May-aliases after instruction odata = tmp->t2[*(tmp->n2)]; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction odata = tmp->t2[*(tmp->n2)]; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } diff --git a/src/plugins/alias/tests/real_world/oracle/example2.res.oracle b/src/plugins/alias/tests/real_world/oracle/example2.res.oracle index f1b9a01af08..768b61717d0 100644 --- a/src/plugins/alias/tests/real_world/oracle/example2.res.oracle +++ b/src/plugins/alias/tests/real_world/oracle/example2.res.oracle @@ -18,22 +18,22 @@ 0:{ x; tmp } → 1:{ } 4:{ idata } → 5:{ } [alias] analysing instruction: idata = tmp->t2[*(tmp->n2)]; [alias] May-aliases after instruction idata = tmp->t2[*(tmp->n2)]; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } [alias] May-alias graph after instruction idata = tmp->t2[*(tmp->n2)]; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } [alias] analysing instruction: odata = tmp->t1[*(tmp->n1)]; [alias] May-aliases after instruction odata = tmp->t1[*(tmp->n1)]; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction odata = tmp->t1[*(tmp->n1)]; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } 10:{ } → 8:{ odata } [alias] analysing instruction: idx = 0; [alias] May-aliases after instruction idx = 0; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction idx = 0; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } @@ -41,24 +41,24 @@ [alias] analysing instruction: tmp_1 = sin(*(idata + idx)); [alias:undefined:fn] example2.c:45: Warning: function sin has no definition [alias] May-aliases after instruction tmp_1 = sin(*(idata + idx)); are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction tmp_1 = sin(*(idata + idx)); is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } 10:{ } → 8:{ odata } [alias] analysing instruction: *(odata + idx) = 0.5 * tmp_1; [alias] May-aliases after instruction *(odata + idx) = 0.5 * tmp_1; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction *(odata + idx) = 0.5 * tmp_1; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } 10:{ } → 8:{ odata } [alias] analysing instruction: idx ++; [alias] May-aliases after instruction idx ++; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction idx ++; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } @@ -76,47 +76,47 @@ <empty> [alias] Summary of function swap: [alias] May-aliases after instruction swap(tmp->n1); are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction swap(tmp->n1); is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } 10:{ } → 8:{ odata } [alias] analysing instruction: i ++; [alias] May-aliases after instruction i ++; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction i ++; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } 10:{ } → 8:{ odata } [alias] analysing instruction: idata = tmp->t2[*(tmp->n2)]; [alias] May-aliases after instruction idata = tmp->t2[*(tmp->n2)]; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction idata = tmp->t2[*(tmp->n2)]; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } 10:{ } → 8:{ odata } [alias] analysing instruction: odata = tmp->t1[*(tmp->n1)]; [alias] May-aliases after instruction odata = tmp->t1[*(tmp->n1)]; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction odata = tmp->t1[*(tmp->n1)]; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } 10:{ } → 8:{ odata } [alias] analysing instruction: __retres = (void *)0; [alias] May-aliases after instruction __retres = (void *)0; are - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph after instruction __retres = (void *)0; is 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } 10:{ } → 8:{ odata } [alias] May-aliases at the end of function f1: - { x; tmp } { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; idata } - { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; odata } + { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] May-alias graph at the end of function f1: 0:{ x; tmp } → 1:{ } 1:{ } -t2→ 6:{ } 1:{ } -t1→ 10:{ } 4:{ idata } → 5:{ } 6:{ } → 4:{ idata } 8:{ odata } → 9:{ } @@ -124,9 +124,8 @@ [alias] Summary of function f1: formals: x locals: tmp idata odata idx i tmp_1 __retres returns: __retres - state: { x; tmp } { x->t2; tmp->t2 } - { (*x)[0..].t2; (*tmp)[0..].t2; idata } { x->t1; tmp->t1 } - { (*x)[0..].t1; (*tmp)[0..].t1; odata } + state: { x; tmp } { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; idata } + { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; odata } [alias] analysing function: f2 [alias] analysing instruction: ty *tmp = x; [alias] May-aliases after instruction ty *tmp = x; are { x; tmp } @@ -146,22 +145,22 @@ 14:{ x; tmp } → 15:{ } 18:{ idata } → 19:{ } [alias] analysing instruction: idata = tmp->t1[*(tmp->n1)]; [alias] May-aliases after instruction idata = tmp->t1[*(tmp->n1)]; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } [alias] May-alias graph after instruction idata = tmp->t1[*(tmp->n1)]; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } [alias] analysing instruction: odata = tmp->t2[*(tmp->n2)]; [alias] May-aliases after instruction odata = tmp->t2[*(tmp->n2)]; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction odata = tmp->t2[*(tmp->n2)]; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } 22:{ odata } → 23:{ } 24:{ } → 22:{ odata } [alias] analysing instruction: idx = 0; [alias] May-aliases after instruction idx = 0; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction idx = 0; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } @@ -170,8 +169,8 @@ *(odata + idx) = (double)3 * *(idata + idx) + (double)1; [alias] May-aliases after instruction *(odata + idx) = (double)3 * *(idata + idx) + (double)1; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction *(odata + idx) = (double)3 * *(idata + idx) + (double)1; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } @@ -179,55 +178,55 @@ 22:{ odata } → 23:{ } 24:{ } → 22:{ odata } [alias] analysing instruction: idx ++; [alias] May-aliases after instruction idx ++; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction idx ++; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } 22:{ odata } → 23:{ } 24:{ } → 22:{ odata } [alias] analysing instruction: swap(tmp->n2); [alias] May-aliases after instruction swap(tmp->n2); are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction swap(tmp->n2); is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } 22:{ odata } → 23:{ } 24:{ } → 22:{ odata } [alias] analysing instruction: i ++; [alias] May-aliases after instruction i ++; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction i ++; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } 22:{ odata } → 23:{ } 24:{ } → 22:{ odata } [alias] analysing instruction: idata = tmp->t1[*(tmp->n1)]; [alias] May-aliases after instruction idata = tmp->t1[*(tmp->n1)]; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction idata = tmp->t1[*(tmp->n1)]; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } 22:{ odata } → 23:{ } 24:{ } → 22:{ odata } [alias] analysing instruction: odata = tmp->t2[*(tmp->n2)]; [alias] May-aliases after instruction odata = tmp->t2[*(tmp->n2)]; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction odata = tmp->t2[*(tmp->n2)]; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } 22:{ odata } → 23:{ } 24:{ } → 22:{ odata } [alias] analysing instruction: __retres = (void *)0; [alias] May-aliases after instruction __retres = (void *)0; are - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph after instruction __retres = (void *)0; is 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } 22:{ odata } → 23:{ } 24:{ } → 22:{ odata } [alias] May-aliases at the end of function f2: - { x; tmp } { x->t1; tmp->t1 } { (*x)[0..].t1; (*tmp)[0..].t1; idata } - { x->t2; tmp->t2 } { (*x)[0..].t2; (*tmp)[0..].t2; odata } + { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] May-alias graph at the end of function f2: 14:{ x; tmp } → 15:{ } 15:{ } -t1→ 20:{ } 15:{ } -t2→ 24:{ } 18:{ idata } → 19:{ } 20:{ } → 18:{ idata } @@ -235,9 +234,8 @@ [alias] Summary of function f2: formals: x locals: tmp idx idata odata i __retres returns: __retres - state: { x; tmp } { x->t1; tmp->t1 } - { (*x)[0..].t1; (*tmp)[0..].t1; idata } { x->t2; tmp->t2 } - { (*x)[0..].t2; (*tmp)[0..].t2; odata } + state: { x; tmp } { x->t1; tmp->t1 } { x->t1[0..]; tmp->t1[0..]; idata } + { x->t2; tmp->t2 } { x->t2[0..]; tmp->t2[0..]; odata } [alias] analysing function: main [alias] analysing instruction: a = (ty *)malloc(sizeof(ty)); [alias] May-aliases after instruction a = (ty *)malloc(sizeof(ty)); are <none> -- GitLab