Advertencia de “desreferenciar el puntero marcado con tipo romperá las reglas de alias estricto”

Yo uso un código donde lanzo una enumeración * a int *. Algo como esto:

enum foo { ... }
...
foo foobar;
int *pi = reinterpret_cast<int*>(&foobar);

Al compilar el código (g ++ 4.1.2), recibo el siguiente mensaje de advertencia:

dereferencing type-punned pointer will break strict-aliasing rules

Busqué en Google este mensaje y descubrí que solo ocurre cuando está activada la optimización de alias estricto. Tengo las siguientes preguntas:

Si dejo el código con esta advertencia, ¿generará un código potencialmente incorrecto?¿Hay alguna forma de solucionar este problema?Si no lo hay, ¿es posible desactivar el alias estricto desde el interior del archivo fuente (porque no quiero desactivarlo para todos los archivos fuente y no quiero hacer una regla Makefile separada para este archivo fuente) )?

Y sí, realmente necesito este tipo de alias.

Respuestas a la pregunta(5)

Su respuesta a la pregunta