1extern void *malloc(__SIZE_TYPE__); 2extern void *memset(void *, int, __SIZE_TYPE__); 3typedef struct 4{ 5 short a; 6 unsigned short b; 7 unsigned short c; 8 unsigned long long Count; 9 long long Count2; 10} __attribute__((packed)) Struct1; 11 12typedef struct 13{ 14 short a; 15 unsigned short b; 16 unsigned short c; 17 unsigned long long d; 18 long long e; 19 long long f; 20} __attribute__((packed)) Struct2; 21 22typedef union 23{ 24 Struct1 a; 25 Struct2 b; 26} Union; 27 28typedef struct 29{ 30 int Count; 31 Union List[0]; 32} __attribute__((packed)) Struct3; 33 34unsigned long long Sum (Struct3 *instrs) __attribute__((noinline)); 35unsigned long long Sum (Struct3 *instrs) 36{ 37 unsigned long long count = 0; 38 int i; 39 40 for (i = 0; i < instrs->Count; i++) { 41 count += instrs->List[i].a.Count; 42 } 43 return count; 44} 45long long Sum2 (Struct3 *instrs) __attribute__((noinline)); 46long long Sum2 (Struct3 *instrs) 47{ 48 long long count = 0; 49 int i; 50 51 for (i = 0; i < instrs->Count; i++) { 52 count += instrs->List[i].a.Count2; 53 } 54 return count; 55} 56main() { 57 Struct3 *p = malloc (sizeof (int) + 3 * sizeof(Union)); 58 memset(p, 0, sizeof(int) + 3*sizeof(Union)); 59 p->Count = 3; 60 p->List[0].a.Count = 555; 61 p->List[1].a.Count = 999; 62 p->List[2].a.Count = 0x101010101ULL; 63 p->List[0].a.Count2 = 555; 64 p->List[1].a.Count2 = 999; 65 p->List[2].a.Count2 = 0x101010101LL; 66 if (Sum(p) != 555 + 999 + 0x101010101ULL) 67 abort(); 68 if (Sum2(p) != 555 + 999 + 0x101010101LL) 69 abort(); 70 return 0; 71} 72