0
|
1 int foo1 ()
|
|
2 {
|
|
3 union { int l; char c[sizeof (int)]; } k1;
|
|
4 char *m;
|
|
5 k1.l = 0;
|
|
6 /* This test variant triggers ADDR_EXPR of k explicitly in order to
|
|
7 ensure it's registered with the runtime. */
|
|
8 m = k1.c;
|
|
9 k1.c [sizeof (int)-1] = m[sizeof (int)-2];
|
|
10 }
|
|
11
|
|
12 int foo2 ()
|
|
13 {
|
|
14 union { int l; char c[sizeof (int)]; } k2;
|
|
15 k2.l = 0;
|
|
16 /* Since this access is known-in-range, k need not be registered
|
|
17 with the runtime, but then this access better not be instrumented
|
|
18 either. */
|
|
19 k2.c [sizeof (int)-1] ++;
|
|
20 return k2.l;
|
|
21 }
|
|
22
|
|
23 int foo3idx = sizeof (int)-1;
|
|
24
|
|
25 int foo3 ()
|
|
26 {
|
|
27 union { int l; char c[sizeof (int)]; } k3;
|
|
28 k3.l = 0;
|
|
29 /* NB this test uses foo3idx, an extern variable, to defeat mudflap
|
|
30 known-in-range-index optimizations. */
|
|
31 k3.c [foo3idx] ++;
|
|
32 return k3.l;
|
|
33 }
|
|
34
|
|
35 int main ()
|
|
36 {
|
|
37 foo1 ();
|
|
38 foo2 ();
|
|
39 foo3 ();
|
|
40 return 0;
|
|
41 }
|