2011-11-22 14 views
5
#define HTON_I32(x) htonl(x) 
inline float __HTON_F32(float x) 
{ 
    int i = HTON_I32(*((int *)(&x))); 
    return (*((float *)(&i))); 
} 

cómo resolver advertencia dereferencing type-punned pointer will break strict-aliasing rules en el código anteriorde cómo resolver la advertencia: puntero de tipo hizo juegos de palabras desreferenciar va a romper las reglas estrictas-aliasing

+0

Usted puede compilar con la -fno-estricta -aliasing bandera en. Esto eliminará las advertencias sobre problemas de aliasing estrictos –

+0

@TonyTheLion: eso no resuelve el problema, lo oculta y oculta otros posibles problemas en el código. No es Buena idea. – Mat

+0

@Mat, no, esto resuelve el problema con un costo de optimización. –

Respuesta

9

Eliminar el tipo-juegos de palabras, y reemplazarlo con algo que ISN' T frágil en la cara de aliasing:

#include <string.h> 

inline float __HTON_F32(float x) { 
    int i; 
    memcpy(&i, &x, sizeof x); 
    i = HTON_I32(i); 
    memcpy(&x, &i, sizeof x); 
    return x; 
} 

compiladores optimizadores razonables bajarán las memcpy llamadas, y generan (a veces mejor) código equivalente a lo que se obtiene de tipo juego de palabras.

Otra solución común que verá implica sindicatos. Todas estas soluciones asumen que sizeof(int) == sizeof(float). Es posible que desee agregar una afirmación a ese efecto.

1

Puede utilizar uniones de tipo-juegos de palabras, que se encarga de los posibles problemas de alineación y aliasing (C99: TC3 menciona explícitamente que esto es de hecho legal):

#include <stdint.h> 

inline float __HTON_F32(float x) { 
    union { float as_float; int32_t as_int; } value = { x }; 
    value.as_int = HTON_I32(value.as_int); 
    return value.as_float; 
} 
+1

Para cualquiera que desee la referencia TC3, esto es en §6.5.2.3, nota al pie 82 –

+0

. ... y la nota de pie de página 95 de la misma sección del borrador C1x de abril;) – Christoph

+0

¿Qué hace exactamente esto? ? value.as_int = HTON_I32 (value.as_int); – Sudhakar

Cuestiones relacionadas