| int foo1 () |
| { |
| union { int l; char c[sizeof (int)]; } k1; |
| char *m; |
| k1.l = 0; |
| /* This test variant triggers ADDR_EXPR of k explicitly in order to |
| ensure it's registered with the runtime. */ |
| m = k1.c; |
| k1.c [sizeof (int)-1] = m[sizeof (int)-2]; |
| } |
| |
| int foo2 () |
| { |
| union { int l; char c[sizeof (int)]; } k2; |
| k2.l = 0; |
| /* Since this access is known-in-range, k need not be registered |
| with the runtime, but then this access better not be instrumented |
| either. */ |
| k2.c [sizeof (int)-1] ++; |
| return k2.l; |
| } |
| |
| int foo3idx = sizeof (int)-1; |
| |
| int foo3 () |
| { |
| union { int l; char c[sizeof (int)]; } k3; |
| k3.l = 0; |
| /* NB this test uses foo3idx, an extern variable, to defeat mudflap |
| known-in-range-index optimizations. */ |
| k3.c [foo3idx] ++; |
| return k3.l; |
| } |
| |
| int main () |
| { |
| foo1 (); |
| foo2 (); |
| foo3 (); |
| return 0; |
| } |