Does it violate strict aliasing rules to move items of any type around using uint32_t, then read them back? If so, does it also violate strict aliasing rules to memcpy from an array of uint32_ts to an array of any type, then read the elements back?
The following code sample demonstrates both cases:
#include <assert.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
int main(void) {
const char *strings[5] = {
"zero", "one", "two", "three", "four"
};
uint32_t buffer[5];
int i;
assert(sizeof(const char*) == sizeof(uint32_t));
memcpy(buffer, strings, sizeof(buffer));
//twiddle with the buffer a bit
buffer[0] = buffer[3];
buffer[2] = buffer[4];
buffer[3] = buffer[1];
//Does this violate strict aliasing?
const char **buffer_cc = (const char**)buffer;
printf("Test 1:
");
for (i=0; i<5; i++)
printf(" %s ", buffer_cc[i]);
printf("
");
//How about this?
memcpy(strings, buffer, sizeof(strings));
printf("Test 2:
");
for (i=0; i<5; i++)
printf(" %s ", strings[i]);
printf("
");
return 0;
}
Please disregard my assumption of a 32-bit platform. Also, if the elements aren t the same size as uint32_t, I know to pad them and copy the correct number of uint32_t s. My question focuses on whether or not doing so violates strict aliasing.