
;; Function f (f)

Points-to analysis

Constraints:

ANYTHING = &ANYTHING
READONLY = &READONLY
ESCAPED = *ESCAPED
ESCAPED = ESCAPED + UNKNOWN
*ESCAPED = NONLOCAL
NONLOCAL = &NONLOCAL
NONLOCAL = &ESCAPED
INTEGER = &ANYTHING
start = &NONLOCAL
end = &NONLOCAL
a = &NONLOCAL
b = &NONLOCAL
c = &NONLOCAL
sp = &NONLOCAL
count_3 = &NULL
i_5 = start
D.2014_7 = i_2
D.2015_8 = D.2014_7
D.2015_8 = &NONLOCAL
D.2016_10 = a + UNKNOWN
D.2014_11 = i_2
D.2015_12 = D.2014_11
D.2015_12 = &NONLOCAL
D.2017_14 = b + UNKNOWN
D.2018_15 = *D.2017_14
D.2019_17 = D.2018_15
D.2019_17 = c
*D.2016_10 = D.2019_17
count_18 = count_1
count_18 = &NONLOCAL
i_19 = i_2
i_19 = &NONLOCAL
count_1 = &NULL
count_1 = count_18
i_2 = i_5
i_2 = i_19
D.2020_21 = *sp + 128
D.2021_22 = *D.2020_21 + 64
D.2022_23 = D.2021_22
ESCAPED = &READONLY
exit = NONLOCAL
ESCAPED = &exit
M_var = NONLOCAL
ESCAPED = &M_var
count_24 = count_1
ESCAPED = count_24

Collapsing static cycles and doing variable substitution
Building predecessor graph
Detecting pointer and location equivalences
Rewriting constraints and unifying variables
Uniting pointer but not location equivalent variables
Finding indirect cycles
Solving graph

Points-to sets

ANYTHING = { ANYTHING }
READONLY = { READONLY }
ESCAPED = { NULL READONLY ESCAPED NONLOCAL exit M_var }
NONLOCAL = { ESCAPED NONLOCAL }
STOREDANYTHING = { }
INTEGER = { ANYTHING }
start = { NONLOCAL }
end = { NONLOCAL } same as start
a = { NONLOCAL } same as start
b = { NONLOCAL } same as start
c = { NONLOCAL } same as start
sp = { NONLOCAL } same as start
count_3 = { NULL }
i_5 = { NONLOCAL } same as start
D.2014_7 = { NONLOCAL } same as start
i_2 = { NONLOCAL } same as start
D.2015_8 = { NONLOCAL } same as start
D.2016_10 = { NONLOCAL }
D.2014_11 = { NONLOCAL } same as start
D.2015_12 = { NONLOCAL } same as start
D.2017_14 = { NONLOCAL }
D.2018_15 = { ESCAPED NONLOCAL }
D.2019_17 = { ESCAPED NONLOCAL }
count_18 = { NULL NONLOCAL }
count_1 = { NULL NONLOCAL } same as count_18
i_19 = { NONLOCAL } same as start
D.2020_21 = { ESCAPED NONLOCAL }
D.2021_22 = { ESCAPED NONLOCAL }
D.2022_23 = { ESCAPED NONLOCAL } same as D.2021_22
exit = { ESCAPED NONLOCAL }
M_var = { ESCAPED NONLOCAL }
count_24 = { NULL NONLOCAL } same as count_18


Alias information for f

Aliased symbols

.MEM, UID D.2025, void, is global, default def: .MEM_26(D)
M_var, UID D.1241, int, is addressable, is global, initial: 1048576

Call clobber information

ESCAPED, points-to non-local, points-to NULL, points-to vars: { M_var } (includes global vars)

Flow-insensitive points-to information

a_9(D), points-to non-local, points-to vars: { }
D.2016_10, points-to non-local, points-to vars: { }
b_13(D), points-to non-local, points-to vars: { }
D.2017_14, points-to non-local, points-to vars: { }
sp_20(D), points-to non-local, points-to vars: { }
D.2020_21, points-to non-local, points-to escaped, points-to vars: { }
D.2021_22, points-to non-local, points-to escaped, points-to vars: { }
D.2022_23, points-to non-local, points-to escaped, points-to vars: { }

f (int start, int end, int * a, int * b, int c, struct s * sp)
{
  int i;
  int count;
  int (*<T264>) (const char *, void *, int *) D.2022;
  void * D.2021;
  struct s * D.2020;
  int D.2019;
  int D.2018;
  int * D.2017;
  int * D.2016;
  long unsigned int D.2015;
  long unsigned int D.2014;

<bb 2>:
  count_3 = 0;
  i_5 = start_4(D);
  goto <bb 4>;

<bb 3>:
  D.2014_7 = (long unsigned int) i_2;
  D.2015_8 = D.2014_7 * 4;
  D.2016_10 = a_9(D) + D.2015_8;
  D.2014_11 = (long unsigned int) i_2;
  D.2015_12 = D.2014_11 * 4;
  D.2017_14 = b_13(D) + D.2015_12;
  D.2018_15 = *D.2017_14;
  D.2019_17 = D.2018_15 + c_16(D);
  *D.2016_10 = D.2019_17;
  count_18 = count_1 + 1;
  i_19 = i_2 + 1;

<bb 4>:
  # count_1 = PHI <0(2), count_18(3)>
  # i_2 = PHI <i_5(2), i_19(3)>
  if (i_2 <= end_6(D))
    goto <bb 3>;
  else
    goto <bb 5>;

<bb 5>:
  D.2020_21 = sp_20(D)->s;
  D.2021_22 = D.2020_21->vp;
  D.2022_23 = (int (*<T264>) (const char *, void *, int *)) D.2021_22;
  D.2022_23 ("Hello World!\n", exit, &M_var);
  count_24 = count_1;
  return count_24;

}



;; Function g (g)

Points-to analysis

Constraints:

ANYTHING = &ANYTHING
READONLY = &READONLY
ESCAPED = *ESCAPED
ESCAPED = ESCAPED + UNKNOWN
*ESCAPED = NONLOCAL
NONLOCAL = &NONLOCAL
NONLOCAL = &ESCAPED
INTEGER = &ANYTHING
i = &NONLOCAL
D.2012_3 = &NONLOCAL
D.2012_4 = &NONLOCAL
D.2012_5 = &NONLOCAL
D.2012_6 = &NONLOCAL
D.2012_7 = &NONLOCAL
D.2012_8 = &NULL
D.2012_1 = &NONLOCAL
D.2012_1 = &NONLOCAL
D.2012_1 = &NONLOCAL
D.2012_1 = &NONLOCAL
D.2012_1 = &NONLOCAL
D.2012_1 = &NULL
ESCAPED = D.2012_1

Collapsing static cycles and doing variable substitution
Building predecessor graph
Detecting pointer and location equivalences
Rewriting constraints and unifying variables
Uniting pointer but not location equivalent variables
Finding indirect cycles
Solving graph

Points-to sets

ANYTHING = { ANYTHING }
READONLY = { READONLY }
ESCAPED = { NULL ESCAPED NONLOCAL }
NONLOCAL = { ESCAPED NONLOCAL }
STOREDANYTHING = { }
INTEGER = { ANYTHING }
i = { NONLOCAL }
D.2012_3 = { NONLOCAL } same as i
D.2012_4 = { NONLOCAL } same as i
D.2012_5 = { NONLOCAL } same as i
D.2012_6 = { NONLOCAL } same as i
D.2012_7 = { NONLOCAL } same as i
D.2012_8 = { NULL }
D.2012_1 = { NULL NONLOCAL }


Alias information for g

Aliased symbols

.MEM, UID D.2026, void, is global

Call clobber information

ESCAPED, points-to non-local, points-to NULL, points-to vars: { }

Flow-insensitive points-to information


g (int i)
{
  int D.2012;

<bb 2>:
  switch (i_2(D)) <default: <L5>, case 1: <L0>, case 2: <L1>, case 3: <L2>, case 4: <L3>, case 5: <L4>>

<L0>:
  D.2012_3 = 42;
  goto <bb 9>;

<L1>:
  D.2012_4 = 60;
  goto <bb 9>;

<L2>:
  D.2012_5 = 7;
  goto <bb 9>;

<L3>:
  D.2012_6 = 3;
  goto <bb 9>;

<L4>:
  D.2012_7 = 1048576;
  goto <bb 9>;

<L5>:
  D.2012_8 = 0;

<bb 9>:
  # D.2012_1 = PHI <42(3), 60(4), 7(5), 3(6), 1048576(7), 0(8)>
  return D.2012_1;

}


