[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[csmith-bugs] --check-global option causes all fields of a union to be printed



Hi everybody,

I'm using git version: 7d6fae9

The --check-global causes all fields of unions to be printed, when this is often not totally defined. 

N1256, 6.2.6.1:7 says: "When a value is stored in a member of an object of union type, the bytes of the object representation that do not correspond to that member but do correspond to other members take unspecified values."

For example, `csmith --check-global -s 50000`

union U0 {
   volatile uint32_t  f0;
   const volatile int64_t  f1;
   uint8_t  f2;
   volatile int32_t  f3;
};
printf("checksum g_2[0][0][0].f0 = %u\n", g_2[0][0][0].f0);
printf("checksum g_2[0][0][0].f1 = %lld\n", g_2[0][0][0].f1);
printf("checksum g_2[0][0][0].f2 = %u\n", g_2[0][0][0].f2);
printf("checksum g_2[0][0][0].f3 = %d\n", g_2[0][0][0].f3);

In this program, g_2 is global, and is never assigned to except through the initializer.  Since initialization of unions works on the first field only (6.7.8:10 "if it is a union, the first named member is initialized ..."), some of the bytes of f1 are never initialized or set to 0.  This makes the output of the program at least unspecified.

I didn't check, but if you are using f1 in the checksum calculation when not using --check-global, then that too would be unspecified.

-Chucky