1 #include <stddef.h> 2 3 struct S { 4 int i; 5 int j; 6 }; 7 struct R { 8 int k; 9 struct S a; 10 }; 11 struct Q { 12 float k; 13 struct S a; 14 }; 15 struct Q s; 16 int __attribute__((noinline,noclone)) test1(void * q)17test1 (void *q) 18 { 19 struct S *b = (struct S *)((char *)q + sizeof (int)); 20 s.a.i = 0; 21 b->i = 3; 22 return s.a.i; 23 } 24 int __attribute__((noinline,noclone)) test2(void * q)25test2 (void *q) 26 { 27 struct S *b = &((struct R *)q)->a; 28 s.a.i = 0; 29 b->i = 3; 30 return s.a.i; 31 } 32 int __attribute__((noinline,noclone)) test3(void * q)33test3 (void *q) 34 { 35 s.a.i = 0; 36 ((struct S *)((char *)q + sizeof (int)))->i = 3; 37 return s.a.i; 38 } 39 extern void abort (void); 40 int main()41main() 42 { 43 if (sizeof (float) != sizeof (int) 44 || offsetof (struct R, a) != sizeof (int) 45 || offsetof (struct Q, a) != sizeof (int)) 46 return 0; 47 s.a.i = 1; 48 s.a.j = 2; 49 if (test1 ((void *)&s) != 3) 50 abort (); 51 s.a.i = 1; 52 s.a.j = 2; 53 if (test2 ((void *)&s) != 3) 54 abort (); 55 s.a.i = 1; 56 s.a.j = 2; 57 if (test3 ((void *)&s) != 3) 58 abort (); 59 return 0; 60 } 61