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

come risolvere avvertimento dereferencing type-punned pointer will break strict-aliasing rules nel codice sopraCome risolvere avvertimento: dereferenziazione tipo puntatore-punned si romperà regole severe-aliasing

+0

Si potrebbe compilare con l'-fno-strict -aliasing flag on. Questo rimuoverà gli avvertimenti sui rigidi problemi di aliasing –

+0

@TonyTheLion: questo non risolve il problema, lo nasconde e nasconde altri potenziali problemi nel codice. Non è una buona idea. – Mat

+0

@Mat, no, questo risolve il problema con un costo di ottimizzazione. –

risposta

9

Eliminare il tipo-giochi di parole, e sostituirla con qualcosa che isn' t fragile di fronte alle 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; 
} 

ragionevoli compilatori ottimizzanti abbasserà il memcpy chiamate, e generare codice equivalente (a volte meglio) per quello che si ottiene dal tipo-giochi di parole.

Un'altra soluzione comune che vedrete riguarda i sindacati. Tutte queste soluzioni presuppongono che sizeof(int) == sizeof(float). Potresti voler aggiungere un asserzione a questo effetto.

1

È possibile utilizzare i sindacati per il tipo-giochi di parole, che si prende cura di eventuali problemi di allineamento e di aliasing (C99: TC3 menziona esplicitamente che questo è davvero legale):

#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

Per chiunque desideri il riferimento TC3, questo è in §6.5.2.3, nota 82 –

+0

. ..e nota a piè di pagina 95 della stessa sezione della bozza di aprile C1x;) – Christoph

+0

cosa fa esattamente questo. ? value.as_int = HTON_I32 (value.as_int); – Sudhakar

Problemi correlati