diff options
author | ludwig <ludwig@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2008-11-03 17:03:54 +0000 |
---|---|---|
committer | ludwig <ludwig@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2008-11-03 17:03:54 +0000 |
commit | b31e8a67d9b1f11b9943b595a4fd66d3a07dd085 (patch) | |
tree | 712bb692c851148cf64d90d53dce9c753fb83923 | |
parent | 5502af97628223ea8f5192647cb1dd5dbd72ae3b (diff) | |
download | ioquake3-aero-b31e8a67d9b1f11b9943b595a4fd66d3a07dd085.tar.gz ioquake3-aero-b31e8a67d9b1f11b9943b595a4fd66d3a07dd085.zip |
fix strict aliasing issues
Patch by Przemysław Iskra (#3805)
git-svn-id: svn://svn.icculus.org/quake3/trunk@1481 edf5b092-35ff-0310-97b2-ce42778d08ea
-rw-r--r-- | Makefile | 16 | ||||
-rw-r--r-- | code/cgame/cg_syscalls.c | 6 | ||||
-rw-r--r-- | code/client/cl_cgame.c | 8 | ||||
-rw-r--r-- | code/client/cl_ui.c | 8 | ||||
-rw-r--r-- | code/game/g_syscalls.c | 30 | ||||
-rw-r--r-- | code/qcommon/cm_trace.c | 5 | ||||
-rw-r--r-- | code/qcommon/msg.c | 36 | ||||
-rw-r--r-- | code/qcommon/q_math.c | 26 | ||||
-rw-r--r-- | code/qcommon/q_shared.c | 9 | ||||
-rw-r--r-- | code/qcommon/q_shared.h | 6 | ||||
-rw-r--r-- | code/qcommon/qcommon.h | 9 | ||||
-rw-r--r-- | code/server/sv_game.c | 11 | ||||
-rw-r--r-- | code/tools/lcc/src/bytecode.c | 11 | ||||
-rw-r--r-- | code/tools/lcc/src/c.h | 6 | ||||
-rw-r--r-- | code/ui/ui_syscalls.c | 12 |
15 files changed, 91 insertions, 108 deletions
@@ -234,7 +234,7 @@ ifeq ($(PLATFORM),linux) endif endif - BASE_CFLAGS = -Wall -fno-strict-aliasing -Wimplicit -Wstrict-prototypes \ + BASE_CFLAGS = -Wall -Wimplicit -Wstrict-prototypes \ -pipe -DUSE_ICON $(shell sdl-config --cflags) ifeq ($(USE_OPENAL),1) @@ -350,7 +350,7 @@ ifeq ($(PLATFORM),darwin) BASE_CFLAGS += -mstackrealign endif - BASE_CFLAGS += -fno-strict-aliasing -DMACOS_X -fno-common -pipe + BASE_CFLAGS += -DMACOS_X -fno-common -pipe ifeq ($(USE_OPENAL),1) BASE_CFLAGS += -DUSE_OPENAL @@ -421,7 +421,7 @@ ifeq ($(PLATFORM),mingw32) ARCH=x86 - BASE_CFLAGS = -Wall -fno-strict-aliasing -Wimplicit -Wstrict-prototypes \ + BASE_CFLAGS = -Wall -Wimplicit -Wstrict-prototypes \ -DUSE_ICON # In the absence of wspiapi.h, require Windows XP or later @@ -514,7 +514,7 @@ ifeq ($(PLATFORM),freebsd) endif #alpha test - BASE_CFLAGS = -Wall -fno-strict-aliasing -Wimplicit -Wstrict-prototypes \ + BASE_CFLAGS = -Wall -Wimplicit -Wstrict-prototypes \ -DUSE_ICON $(shell sdl-config --cflags) ifeq ($(USE_OPENAL),1) @@ -580,7 +580,7 @@ ifeq ($(PLATFORM),openbsd) ARCH=i386 - BASE_CFLAGS = -Wall -fno-strict-aliasing -Wimplicit -Wstrict-prototypes \ + BASE_CFLAGS = -Wall -Wimplicit -Wstrict-prototypes \ -DUSE_ICON $(shell sdl-config --cflags) ifeq ($(USE_OPENAL),1) @@ -642,7 +642,7 @@ ifeq ($(PLATFORM),netbsd) SHLIBLDFLAGS=-shared $(LDFLAGS) THREAD_LIBS=-lpthread - BASE_CFLAGS = -Wall -fno-strict-aliasing -Wimplicit -Wstrict-prototypes + BASE_CFLAGS = -Wall -Wimplicit -Wstrict-prototypes ifneq ($(ARCH),i386) BASE_CFLAGS += -DNO_VM_COMPILED @@ -706,7 +706,7 @@ ifeq ($(PLATFORM),sunos) endif - BASE_CFLAGS = -Wall -fno-strict-aliasing -Wimplicit -Wstrict-prototypes \ + BASE_CFLAGS = -Wall -Wimplicit -Wstrict-prototypes \ -pipe -DUSE_ICON $(shell sdl-config --cflags) OPTIMIZE = -O3 -ffast-math -funroll-loops @@ -1018,7 +1018,7 @@ makedirs: # QVM BUILD TOOLS ############################################################################# -TOOLS_OPTIMIZE = -g -O2 -Wall -fno-strict-aliasing +TOOLS_OPTIMIZE = -g -O2 -Wall TOOLS_CFLAGS = $(TOOLS_OPTIMIZE) \ -DTEMPDIR=\"$(TEMPDIR)\" -DSYSTEM=\"\" \ -I$(Q3LCCSRCDIR) \ diff --git a/code/cgame/cg_syscalls.c b/code/cgame/cg_syscalls.c index 758d1b4..cdc1060 100644 --- a/code/cgame/cg_syscalls.c +++ b/code/cgame/cg_syscalls.c @@ -37,9 +37,9 @@ void dllEntry( intptr_t (QDECL *syscallptr)( intptr_t arg,... ) ) { int PASSFLOAT( float x ) { - float floatTemp; - floatTemp = x; - return *(int *)&floatTemp; + floatint_t fi; + fi.f = x; + return fi.i; } void trap_Print( const char *fmt ) { diff --git a/code/client/cl_cgame.c b/code/client/cl_cgame.c index 615884f..ef15798 100644 --- a/code/client/cl_cgame.c +++ b/code/client/cl_cgame.c @@ -400,11 +400,9 @@ void CL_ShutdownCGame( void ) { } static int FloatAsInt( float f ) { - int temp; - - *(float *)&temp = f; - - return temp; + floatint_t fi; + fi.f = f; + return fi.i; } /* diff --git a/code/client/cl_ui.c b/code/client/cl_ui.c index 3cabd04..56a226b 100644 --- a/code/client/cl_ui.c +++ b/code/client/cl_ui.c @@ -691,11 +691,9 @@ FloatAsInt ==================== */ static int FloatAsInt( float f ) { - int temp; - - *(float *)&temp = f; - - return temp; + floatint_t fi; + fi.f = f; + return fi.i; } /* diff --git a/code/game/g_syscalls.c b/code/game/g_syscalls.c index d82be06..59d89bd 100644 --- a/code/game/g_syscalls.c +++ b/code/game/g_syscalls.c @@ -36,9 +36,9 @@ void dllEntry( intptr_t (QDECL *syscallptr)( intptr_t arg,... ) ) { } int PASSFLOAT( float x ) { - float floatTemp; - floatTemp = x; - return *(int *)&floatTemp; + floatint_t fi; + fi.f = x; + return fi.i; } void trap_Printf( const char *fmt ) { @@ -290,9 +290,9 @@ void trap_AAS_PresenceTypeBoundingBox(int presencetype, vec3_t mins, vec3_t maxs } float trap_AAS_Time(void) { - int temp; - temp = syscall( BOTLIB_AAS_TIME ); - return (*(float*)&temp); + floatint_t fi; + fi.i = syscall( BOTLIB_AAS_TIME ); + return fi.f; } int trap_AAS_PointAreaNum(vec3_t point) { @@ -476,15 +476,15 @@ void trap_BotFreeCharacter(int character) { } float trap_Characteristic_Float(int character, int index) { - int temp; - temp = syscall( BOTLIB_AI_CHARACTERISTIC_FLOAT, character, index ); - return (*(float*)&temp); + floatint_t fi; + fi.i = syscall( BOTLIB_AI_CHARACTERISTIC_FLOAT, character, index ); + return fi.f; } float trap_Characteristic_BFloat(int character, int index, float min, float max) { - int temp; - temp = syscall( BOTLIB_AI_CHARACTERISTIC_BFLOAT, character, index, PASSFLOAT(min), PASSFLOAT(max) ); - return (*(float*)&temp); + floatint_t fi; + fi.i = syscall( BOTLIB_AI_CHARACTERISTIC_BFLOAT, character, index, PASSFLOAT(min), PASSFLOAT(max) ); + return fi.f; } int trap_Characteristic_Integer(int character, int index) { @@ -652,9 +652,9 @@ int trap_BotGetMapLocationGoal(char *name, void /* struct bot_goal_s */ *goal) { } float trap_BotAvoidGoalTime(int goalstate, int number) { - int temp; - temp = syscall( BOTLIB_AI_AVOID_GOAL_TIME, goalstate, number ); - return (*(float*)&temp); + floatint_t fi; + fi.i = syscall( BOTLIB_AI_AVOID_GOAL_TIME, goalstate, number ); + return fi.f; } void trap_BotSetAvoidGoalTime(int goalstate, int number, float avoidtime) { diff --git a/code/qcommon/cm_trace.c b/code/qcommon/cm_trace.c index bab7eed..e9bffe9 100644 --- a/code/qcommon/cm_trace.c +++ b/code/qcommon/cm_trace.c @@ -131,10 +131,7 @@ SquareRootFloat ================ */ float SquareRootFloat(float number) { - union { - float f; - int i; - } t; + floatint_t t; float x, y; const float f = 1.5F; diff --git a/code/qcommon/msg.c b/code/qcommon/msg.c index 1fc03eb..b883c83 100644 --- a/code/qcommon/msg.c +++ b/code/qcommon/msg.c @@ -291,13 +291,9 @@ void MSG_WriteLong( msg_t *sb, int c ) { } void MSG_WriteFloat( msg_t *sb, float f ) { - union { - float f; - int l; - } dat; - + floatint_t dat; dat.f = f; - MSG_WriteBits( sb, dat.l, 32 ); + MSG_WriteBits( sb, dat.i, 32 ); } void MSG_WriteString( msg_t *sb, const char *s ) { @@ -423,13 +419,9 @@ int MSG_ReadLong( msg_t *msg ) { } float MSG_ReadFloat( msg_t *msg ) { - union { - byte b[4]; - float f; - int l; - } dat; + floatint_t dat; - dat.l = MSG_ReadBits( msg, 32 ); + dat.i = MSG_ReadBits( msg, 32 ); if ( msg->readcount > msg->cursize ) { dat.f = -1; } @@ -563,20 +555,22 @@ int MSG_ReadDelta( msg_t *msg, int oldV, int bits ) { } void MSG_WriteDeltaFloat( msg_t *msg, float oldV, float newV ) { + floatint_t fi; if ( oldV == newV ) { MSG_WriteBits( msg, 0, 1 ); return; } + fi.f = newV; MSG_WriteBits( msg, 1, 1 ); - MSG_WriteBits( msg, *(int *)&newV, 32 ); + MSG_WriteBits( msg, fi.i, 32 ); } float MSG_ReadDeltaFloat( msg_t *msg, float oldV ) { if ( MSG_ReadBits( msg, 1 ) ) { - float newV; + floatint_t fi; - *(int *)&newV = MSG_ReadBits( msg, 32 ); - return newV; + fi.i = MSG_ReadBits( msg, 32 ); + return fi.f; } return oldV; } @@ -617,20 +611,22 @@ int MSG_ReadDeltaKey( msg_t *msg, int key, int oldV, int bits ) { } void MSG_WriteDeltaKeyFloat( msg_t *msg, int key, float oldV, float newV ) { + floatint_t fi; if ( oldV == newV ) { MSG_WriteBits( msg, 0, 1 ); return; } + fi.f = newV; MSG_WriteBits( msg, 1, 1 ); - MSG_WriteBits( msg, (*(int *)&newV) ^ key, 32 ); + MSG_WriteBits( msg, fi.i ^ key, 32 ); } float MSG_ReadDeltaKeyFloat( msg_t *msg, int key, float oldV ) { if ( MSG_ReadBits( msg, 1 ) ) { - float newV; + floatint_t fi; - *(int *)&newV = MSG_ReadBits( msg, 32 ) ^ key; - return newV; + fi.i = MSG_ReadBits( msg, 32 ) ^ key; + return fi.f; } return oldV; } diff --git a/code/qcommon/q_math.c b/code/qcommon/q_math.c index bfaa60a..80c9f8e 100644 --- a/code/qcommon/q_math.c +++ b/code/qcommon/q_math.c @@ -501,10 +501,7 @@ void VectorRotate( vec3_t in, vec3_t matrix[3], vec3_t out ) */ float Q_rsqrt( float number ) { - union { - float f; - int i; - } t; + floatint_t t; float x2, y; const float threehalfs = 1.5F; @@ -519,9 +516,10 @@ float Q_rsqrt( float number ) } float Q_fabs( float f ) { - int tmp = * ( int * ) &f; - tmp &= 0x7FFFFFFF; - return * ( float * ) &tmp; + floatint_t fi; + fi.f = f; + fi.i &= 0x7FFFFFFF; + return fi.f; } #endif @@ -1301,15 +1299,11 @@ Don't pass doubles to this */ int Q_isnan( float x ) { - union - { - float f; - unsigned int i; - } t; + floatint_t fi; - t.f = x; - t.i &= 0x7FFFFFFF; - t.i = 0x7F800000 - t.i; + fi.f = x; + fi.ui &= 0x7FFFFFFF; + fi.ui = 0x7F800000 - fi.ui; - return (int)( (unsigned int)t.i >> 31 ); + return (int)( (unsigned int)fi.ui >> 31 ); } diff --git a/code/qcommon/q_shared.c b/code/qcommon/q_shared.c index de173d8..1ddab8d 100644 --- a/code/qcommon/q_shared.c +++ b/code/qcommon/q_shared.c @@ -205,16 +205,11 @@ qint64 Long64NoSwap (qint64 ll) return ll; } -typedef union { - float f; - unsigned int i; -} _FloatByteUnion; - float FloatSwap (const float *f) { - _FloatByteUnion out; + floatint_t out; out.f = *f; - out.i = LongSwap(out.i); + out.ui = LongSwap(out.ui); return out.f; } diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 41ff158..54b8bfb 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -151,6 +151,12 @@ typedef unsigned char byte; typedef enum {qfalse, qtrue} qboolean; +typedef union { + float f; + int i; + unsigned int ui; +} floatint_t; + typedef int qhandle_t; typedef int sfxHandle_t; typedef int fileHandle_t; diff --git a/code/qcommon/qcommon.h b/code/qcommon/qcommon.h index 5838bf7..6a264d3 100644 --- a/code/qcommon/qcommon.h +++ b/code/qcommon/qcommon.h @@ -356,12 +356,9 @@ void *VM_ExplicitArgPtr( vm_t *vm, intptr_t intValue ); #define VMA(x) VM_ArgPtr(args[x]) static ID_INLINE float _vmf(intptr_t x) { - union { - int i; - float f; - } t; - t.i = (int)x; - return t.f; + floatint_t fi; + fi.i = (int) x; + return fi.f; } #define VMF(x) _vmf(args[x]) diff --git a/code/server/sv_game.c b/code/server/sv_game.c index adf1f5a..7bfbf03 100644 --- a/code/server/sv_game.c +++ b/code/server/sv_game.c @@ -288,14 +288,9 @@ void SV_GetUsercmd( int clientNum, usercmd_t *cmd ) { //============================================== static int FloatAsInt( float f ) { - union - { - int i; - float f; - } temp; - - temp.f = f; - return temp.i; + floatint_t fi; + fi.f = f; + return fi.i; } /* diff --git a/code/tools/lcc/src/bytecode.c b/code/tools/lcc/src/bytecode.c index b267d6f..871056a 100644 --- a/code/tools/lcc/src/bytecode.c +++ b/code/tools/lcc/src/bytecode.c @@ -40,8 +40,9 @@ static void I(defconst)(int suffix, int size, Value v) { case P: print("byte %d %U\n", size, (unsigned long)v.p); return; case F: if (size == 4) { - float f = v.d; - print("byte 4 %u\n", *(unsigned *)&f); + floatint_t fi; + fi.f = v.d; + print("byte 4 %u\n", fi.ui); } else { unsigned *p = (unsigned *)&v.d; print("byte 4 %u\n", p[swap]); @@ -67,10 +68,10 @@ static void I(defsymbol)(Symbol p) { case P: p->x.name = stringf("%U", p->u.c.v.p); break; case F: { // JDC: added this to get inline floats - unsigned temp; + floatint_t temp; - *(float *)&temp = p->u.c.v.d; - p->x.name = stringf("%U", temp ); + temp.f = p->u.c.v.d; + p->x.name = stringf("%U", temp.ui ); } break;// JDC: added this default: assert(0); diff --git a/code/tools/lcc/src/c.h b/code/tools/lcc/src/c.h index e36380e..68c8f62 100644 --- a/code/tools/lcc/src/c.h +++ b/code/tools/lcc/src/c.h @@ -98,6 +98,12 @@ typedef struct { void *xt; } Xtype; +typedef union { + float f; + int i; + unsigned int ui; +} floatint_t; + #include "config.h" typedef struct metrics { unsigned char size, align, outofline; diff --git a/code/ui/ui_syscalls.c b/code/ui/ui_syscalls.c index 77c14eb..9048a95 100644 --- a/code/ui/ui_syscalls.c +++ b/code/ui/ui_syscalls.c @@ -35,9 +35,9 @@ void dllEntry( intptr_t (QDECL *syscallptr)( intptr_t arg,... ) ) { } int PASSFLOAT( float x ) { - float floatTemp; - floatTemp = x; - return *(int *)&floatTemp; + floatint_t fi; + fi.f = x; + return fi.i; } void trap_Print( const char *string ) { @@ -65,9 +65,9 @@ void trap_Cvar_Set( const char *var_name, const char *value ) { } float trap_Cvar_VariableValue( const char *var_name ) { - int temp; - temp = syscall( UI_CVAR_VARIABLEVALUE, var_name ); - return (*(float*)&temp); + floatint_t fi; + fi.i = syscall( UI_CVAR_VARIABLEVALUE, var_name ); + return fi.f; } void trap_Cvar_VariableStringBuffer( const char *var_name, char *buffer, int bufsize ) { |