aboutsummaryrefslogtreecommitdiffstats
path: root/code/qcommon
diff options
context:
space:
mode:
authorludwig <ludwig@edf5b092-35ff-0310-97b2-ce42778d08ea>2008-11-03 17:03:54 +0000
committerludwig <ludwig@edf5b092-35ff-0310-97b2-ce42778d08ea>2008-11-03 17:03:54 +0000
commitb31e8a67d9b1f11b9943b595a4fd66d3a07dd085 (patch)
tree712bb692c851148cf64d90d53dce9c753fb83923 /code/qcommon
parent5502af97628223ea8f5192647cb1dd5dbd72ae3b (diff)
downloadioquake3-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
Diffstat (limited to 'code/qcommon')
-rw-r--r--code/qcommon/cm_trace.c5
-rw-r--r--code/qcommon/msg.c36
-rw-r--r--code/qcommon/q_math.c26
-rw-r--r--code/qcommon/q_shared.c9
-rw-r--r--code/qcommon/q_shared.h6
-rw-r--r--code/qcommon/qcommon.h9
6 files changed, 38 insertions, 53 deletions
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])