Reconciling High-Level Optimizations and Low-Level Code in LLVM
Nuno P. Lopes
OOPSLA’18 Boston
Seoul National Univ. Juneyoung Lee Chung-Kil Hur Zhengyang Liu John Regehr University of Utah Ralf Jung Microsoft Research MPI-SWS
Reconciling High-Level Optimizations and Low-Level Code in LLVM - - PowerPoint PPT Presentation
OOPSLA 18 Boston Reconciling High-Level Optimizations and Low-Level Code in LLVM Juneyoung Lee Seoul National Univ. Chung-Kil Hur MPI-SWS Ralf Jung Zhengyang Liu University of Utah John Regehr Nuno P. Lopes Microsoft Research
Nuno P. Lopes
OOPSLA’18 Boston
Seoul National Univ. Juneyoung Lee Chung-Kil Hur Zhengyang Liu John Regehr University of Utah Ralf Jung Microsoft Research MPI-SWS
2
Low-level Code
2
Low-level Code
Allows access via int-to-ptr cast
2
High-level Optimizations
Low-level Code
Allows access via int-to-ptr cast
2
High-level Optimizations
Low-level Code
Allows access via int-to-ptr cast Assumes no one can access my local vars
2
High-level Optimizations
Low-level Code
Allows access via int-to-ptr cast Assumes no one can access my local vars
3
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); }
4
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); }
4
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); }
4
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); }
4
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
4
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
4
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
4
0x0
Memory:
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
4
0x0
Memory:
0x100
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
4
0x0
Memory:
0x101
0x100 0x101
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
4
0x0
Memory:
0x101
0x100 0x101 true
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
4
0x0
Memory:
0x101
0x100 0x101 0x101 true
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
4
0x0
Memory:
0x101
0x100 0x101 0x101 true
10
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
4
0x0
Memory:
0x101
0x100 0x101 0x101 true
10
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
4
0x0
Memory:
0x101
0x100 0x101 0x101 true
10
10
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
4
0x0
Memory:
0x101
0x100 0x101 0x101 true
10
10
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); }
0x100 0x101
0x101
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
5
0x0
Memory:
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); }
(p,0x100) (q,0x101)
0x101
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
5
0x0
Memory:
0x100 0x101
q: 0
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); }
(p,0x100) (q,0x101)
0x101
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
5
0x0
Memory:
0x100
true
0x101
q: 0
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); }
(p,0x100) (q,0x101)
0x101
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
5
0x0
Memory:
0x100
(p,0x101) true
0x101
q: 0
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); }
(p,0x100) (q,0x101)
0x101
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
5
0x0
Memory:
0x100
(p,0x101) true
0x101
q: 0
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); }
(p,0x100) (q,0x101)
0x101
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
5
0x0
Memory:
0x100
(p,0x101) true
0x101
q: 0
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); }
(p,0x100) (q,0x101)
0x101
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
constant prop.
5
0x0
Memory:
0x100
(p,0x101) true
0x101
q: 0
6
constant prop.
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
6
constant prop.
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
6
constant prop.
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); }
char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
prop. cast elim.
7
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
prop.
7
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
prop.
7
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
prop.
7
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
cast elim.
7
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
constant prop.
7
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
10
7
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
10
7
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
10
7
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
10
7
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
10
8
9
10
10
10
10
10
10
10
k = (i==j ? i : j)
11
k = j
k = (i==j ? i : j)
11
k = j true
k = (i==j ? i : j)
11
k = j true
i
k = (i==j ? i : j)
11
k = j true
j
k = (i==j ? i : j)
11
k = j
false
k = (i==j ? i : j)
11
k = j
false j
k = (i==j ? i : j)
11
k = j
j
k = (i==j ? i : j)
11
k = j (p,0x100)
k = (i==j ? i : j)
11
k = j (q,0x100) (p,0x100)
k = (i==j ? i : j)
11
k = j true (q,0x100) (p,0x100)
k = (i==j ? i : j)
11
k = j true (q,0x100) (p,0x100)
k = (i==j ? i : j)
11
k = j true (q,0x100) (q,0x100) (p,0x100)
k = (i==j ? i : j)
11
k = j true (q,0x100) (q,0x100) (p,0x100)
k = (i==j ? i : j)
12
k = j
true (q,0x100) (q,0x100) (p,0x100)
k = (i==j ? i : j)
12
k = j
true (q,0x100) (q,0x100) (p,0x100) 0x100 0x100 0x100
13
14
0x100
Memory:
14
0x100
Memory:
14
0x100
Memory:
the Memory Layout
14
0x100
Memory:
the Memory Layout
14
0x100
Memory:
the Memory Layout
14
0x100
Memory:
the Memory Layout
14
0x100
Memory:
the Memory Layout
14
0x100
Memory:
the Memory Layout
15
i = (int)p p2 = (char*)i *p2 = 10
0x100
Memory:
15
i = (int)p p2 = (char*)i *p2 = 10
0x100
Memory:
15
i = (int)p p2 = (char*)i *p2 = 10
0x100
Memory:
15
i = (int)p p2 = (char*)i *p2 = 10
0x100
Memory:
15
i = (int)p p2 = (char*)i *p2 = 10
0x100
Memory:
15
i = (int)p p2 = (char*)i *p2 = 10
0x100
Memory:
16
i = (int)p p2 = (char*)i *p2 = 10
0x100
Memory:
16
i = (int)p p2 = (char*)i *p2 = 10
0x100
Memory:
16
i = (int)p p2 = (char*)i *p2 = 10
0x100
Memory:
17
0x100
Memory:
the Memory Layout
17
0x100
Memory:
18
char *p = malloc(1) q = (int*)0x100 q = (int*)0x100 char *p = malloc(1)
0x100
Memory:
18
char *p = malloc(1) q = (int*)0x100 q = (int*)0x100 char *p = malloc(1)
0x100
Memory:
18
char *p = malloc(1) q = (int*)0x100 q = (int*)0x100 char *p = malloc(1)
0x100
Memory:
18
char *p = malloc(1) q = (int*)0x100 q = (int*)0x100 char *p = malloc(1)
0x100
Memory:
18
char *p = malloc(1) q = (int*)0x100 q = (int*)0x100 char *p = malloc(1)
0x100
Memory:
18
char *p = malloc(1) q = (int*)0x100 q = (int*)0x100 char *p = malloc(1)
0x100
Memory:
q = (int*)0x100 char *p = malloc(1)
19
char *p = malloc(1) q = (int*)0x100
0x100
Memory:
q = (int*)0x100 char *p = malloc(1)
19
char *p = malloc(1) q = (int*)0x100
0x100
Memory:
20
21
char p[1] = {0}; f(); print(p[0]);
21
char p[1] = {0}; f(); print(p[0]);
char p[1] = {0}; f(); print(0);
constant prop.
21
char p[1] = {0}; f(); print(p[0]);
(p,0x100)
char p[1] = {0}; f(); print(0);
constant prop.
21
char p[1] = {0}; f(); print(p[0]);
(p,0x100)
*(char*)(0x100)=1;
char p[1] = {0}; f(); print(0);
constant prop.
21
char p[1] = {0}; f(); print(p[0]);
(p,0x100)
*(char*)(0x100)=1;
(∗,0x100)
char p[1] = {0}; f(); print(0);
constant prop.
Full Provenance
21
char p[1] = {0}; f(); print(p[0]);
(p,0x100)
*(char*)(0x100)=1;
(∗,0x100)
char p[1] = {0}; f(); print(0);
constant prop.
Guessing Full Provenance
21
char p[1] = {0}; f(); print(p[0]);
(p,0x100)
*(char*)(0x100)=1;
(∗,0x100)
char p[1] = {0}; f(); print(0);
constant prop.
Guessing Full Provenance
22
char p[1] = {0}; f(); print(p[0]);
constant prop.
(p,0x100)
*(char*)(0x100)=1;
(∗,0x100)
char p[1] = {0}; f(); print(0);
22
char p[1] = {0}; f(); print(p[0]);
constant prop.
(p,0x100)
*(char*)(0x100)=1;
(∗,0x100) (p,0x200)
char p[1] = {0}; f(); print(0);
22
char p[1] = {0}; f(); print(p[0]);
constant prop.
(p,0x100)
*(char*)(0x100)=1;
(∗,0x100) (p,0x200)
char p[1] = {0}; f(); print(0);
22
char p[1] = {0}; f(); print(p[0]);
constant prop.
(p,0x100)
*(char*)(0x100)=1;
(∗,0x100)
(p,0x200)
char p[1] = {0}; f(); print(0);
23
char p[1] = {0}; *(char*)(0x100) = 1; print(p[0]); 0x100
Memory:
0x200
23
char p[1] = {0}; *(char*)(0x100) = 1; print(p[0]); 0x100
Memory:
0x200
23
char p[1] = {0}; *(char*)(0x100) = 1; print(p[0]); (p,0x100) 0x100
Memory:
0x200
23
char p[1] = {0}; *(char*)(0x100) = 1; print(p[0]); (p,0x100) (p,0x200) 0x100
Memory:
0x200
23
char p[1] = {0}; *(char*)(0x100) = 1; print(p[0]); (p,0x100) (p,0x200) 0x100
Memory:
0x200
inaccessible at 0x100
23
char p[1] = {0}; *(char*)(0x100) = 1; print(p[0]); (p,0x100) (p,0x200) 0x100
Memory:
0x200
inaccessible at 0x100
char p[1] = {0}; *(char*)(0x100) = 1; print(p[0]);
24
char p[1] = {0}; if (p == 0x100){ *(char*)(0x100) = 1; } print(p[0]);
24
char p[1] = {0}; if (p == 0x100){ *(char*)(0x100) = 1; } print(p[0]);
24
(p,0x100) (p,0x200)
char p[1] = {0}; if (p == 0x100){ *(char*)(0x100) = 1; } print(p[0]);
24
(p,0x100) (p,0x200)
char p[1] = {0}; if (p == 0x100){ *(char*)(0x100) = 1; } print(p[0]);
24
(p,0x100) (p,0x200)
char p[1] = {0}; if (p == 0x100){ *(char*)(0x100) = 1; } print(p[0]);
24
(p,0x100) (p,0x200)
25
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
constant prop.
prop. cast elim.
25
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
cast elim.
25
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
Can Access q[0] due to Full Prov. cast elim.
25
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
Can Access q[0] due to Full Prov. cast elim. Cannot Access q[0] due to Prov. p
25
char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(0); } char p[1],q[1] = {0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(p+1) = 10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)(int)(p+1)=10; print(q[0]); } char p[1],q[1]={0}; int ip = (int)(p+1); int iq = (int)q; if (iq == ip) { *(char*)iq = 10; print(q[0]); }
Can Access q[0] due to Full Prov. cast elim. Cannot Access q[0] due to Prov. p
26
26
27
28