...
When GCC 3.4.6 compiles this code with optimization, the assignment through the aliased pointer is effectively eliminated.
Compliant Solution (union)
This compliant solution uses a union type that includes a type compatible with the effective type of the object:
...
This function typically outputs "2222 2222." However, there is no guarantee that this will be true, even on implementations that defined the unspecified behavior; values of type short need not have the same representation as values of type int.
Compliant Solution (memcpy)
This compliant solution uses memcpy to convert the shorts to an int:
| Code Block |
|---|
#include <stdio.h>
#include <string.h>
void func(void) {
short a[2];
a[0]=0x1111;
a[1]=0x1111;
int i = 0x22222222;
memcpy(a, &i, sizeof a);
printf("%x %x\n", a[0], a[1]);
} |
Using memcpy for type punning avoids the unspecified behavior of the union. A good optimizing compiler will recognize the use of memcpy and will emit code just as fast as the union approach.
Noncompliant Code Example
...
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <stdlib.h>
struct gadget {
int i;
double d;
char *p;
};
struct widget {
char *q;
int j;
double e;
};
void func(void) {
struct gadget *gp;
struct widget *wp;
gp = (struct gadget *)malloc(sizeof(struct gadget));
if (!gp) {
/* Handle error */
}
/* ... Initialize gadget ... */
wp = (struct widget *)realloc(gp, sizeof(struct widget));
if (!wp) {
free(gp);
/* Handle error */
}
if (wp->j == 12) {
/* ... */
}
/* ... */
free(wp);
} |
Compliant Solution
This compliant solution reuses the memory from the gadget object but reinitializes the memory to a consistent state before reading from it:
...
Most compilers will produce a warning diagnostic if the two array types used in an expression are incompatible.
Compliant Solution
In this compliant solution, b is declared to point to an array with the same number of elements as a, satisfying the size specifier criterion for array compatibility:
...