From f96a163cf8e09c6258b0ed471bce495777308036 Mon Sep 17 00:00:00 2001 From: hymei Date: Sun, 27 Feb 2022 21:24:21 +0800 Subject: [PATCH] arm64 : fix clang compile errors --- datamodel/dmserializerkeyvalues.cpp | 2 +- dmxloader/dmxattribute.cpp | 2 ++ game/client/cstrike/VGUI/buypreset_panel.cpp | 2 +- game/server/props.cpp | 3 ++- game/shared/cstrike/cs_weapon_parse.cpp | 4 +++- public/dt_common.h | 9 +++++---- public/tier0/basetypes.h | 19 +++++++++++++------ 7 files changed, 27 insertions(+), 14 deletions(-) diff --git a/datamodel/dmserializerkeyvalues.cpp b/datamodel/dmserializerkeyvalues.cpp index 24a45de0..f446e7ab 100644 --- a/datamodel/dmserializerkeyvalues.cpp +++ b/datamodel/dmserializerkeyvalues.cpp @@ -264,7 +264,7 @@ DmAttributeType_t CDmSerializerKeyValues::DetermineAttributeType( KeyValues *pKe if ( sscanf( pKeyValues->GetString(), "%f %f", &f1, &f2 ) == 2 ) return AT_VECTOR2; - int i = pKeyValues->GetInt( NULL, INT_MAX ); + int i = pKeyValues->GetInt( nullptr, INT_MAX ); if ( ( sscanf( pKeyValues->GetString(), "%d", &i ) == 1 ) && ( !strchr( pKeyValues->GetString(), '.' ) ) ) return AT_INT; diff --git a/dmxloader/dmxattribute.cpp b/dmxloader/dmxattribute.cpp index aea474c7..293cce8b 100644 --- a/dmxloader/dmxattribute.cpp +++ b/dmxloader/dmxattribute.cpp @@ -73,8 +73,10 @@ struct CSizeTest COMPILE_TIME_ASSERT( sizeof( QAngle ) == 12 ); COMPILE_TIME_ASSERT( sizeof( Quaternion ) == 16 ); COMPILE_TIME_ASSERT( sizeof( VMatrix ) == 64 ); +#if !defined( PLATFORM_64BITS ) COMPILE_TIME_ASSERT( sizeof( CUtlString ) == 4 ); COMPILE_TIME_ASSERT( sizeof( CUtlBinaryBlock ) == 16 ); +#endif COMPILE_TIME_ASSERT( sizeof( DmObjectId_t ) == 16 ); }; }; diff --git a/game/client/cstrike/VGUI/buypreset_panel.cpp b/game/client/cstrike/VGUI/buypreset_panel.cpp index 321984b4..b6937036 100644 --- a/game/client/cstrike/VGUI/buypreset_panel.cpp +++ b/game/client/cstrike/VGUI/buypreset_panel.cpp @@ -93,7 +93,7 @@ public: KeyValues *line = lines->GetFirstValue(); while ( line ) { - const char *str = line->GetString( NULL, "" ); + const char *str = line->GetString( nullptr, "" ); Vector4D p; int numPoints = sscanf( str, "%f %f %f %f", &p[0], &p[1], &p[2], &p[3] ); if ( numPoints == 4 ) diff --git a/game/server/props.cpp b/game/server/props.cpp index 648191db..e536447b 100644 --- a/game/server/props.cpp +++ b/game/server/props.cpp @@ -5618,7 +5618,8 @@ class CPhysicsPropMultiplayer : public CPhysicsProp, public IMultiplayerPhysics SetCollisionGroup( COLLISION_GROUP_DEBRIS ); } - m_fMass = VPhysicsGetObject()->GetMass(); + if(VPhysicsGetObject()) + m_fMass = VPhysicsGetObject()->GetMass(); // VPhysicsGetObject() is NULL on the client, which prevents the client from finding a decent // AABB surrounding the collision bounds. If we've got a VPhysicsGetObject()->GetCollide(), we'll diff --git a/game/shared/cstrike/cs_weapon_parse.cpp b/game/shared/cstrike/cs_weapon_parse.cpp index d23ea72e..5f78b9c2 100644 --- a/game/shared/cstrike/cs_weapon_parse.cpp +++ b/game/shared/cstrike/cs_weapon_parse.cpp @@ -99,7 +99,9 @@ CCSWeaponInfo g_EquipmentInfo[MAX_EQUIPMENT]; void PrepareEquipmentInfo( void ) { - memset( g_EquipmentInfo, 0, ARRAYSIZE( g_EquipmentInfo ) ); + // MoeMod : dont use memset here + for(int i = 0; i < MAX_EQUIPMENT; ++i) + g_EquipmentInfo[i] = {}; g_EquipmentInfo[2].SetWeaponPrice( CSGameRules()->GetBlackMarketPriceForWeapon( WEAPON_KEVLAR ) ); g_EquipmentInfo[2].SetDefaultPrice( KEVLAR_PRICE ); diff --git a/public/dt_common.h b/public/dt_common.h index 996300a5..ed4f1fa1 100644 --- a/public/dt_common.h +++ b/public/dt_common.h @@ -91,11 +91,12 @@ // Use this to extern send and receive datatables, and reference them. -#define EXTERN_SEND_TABLE(tableName) namespace tableName {extern SendTable g_SendTable;} -#define EXTERN_RECV_TABLE(tableName) namespace tableName {extern RecvTable g_RecvTable;} +#define EXTERN_SEND_TABLE(tableName) namespace tableName {extern SendTable g_SendTable; extern int g_SendTableInit;} +#define EXTERN_RECV_TABLE(tableName) namespace tableName {extern RecvTable g_RecvTable; extern int g_RecvTableInit;} -#define REFERENCE_SEND_TABLE(tableName) tableName::g_SendTable -#define REFERENCE_RECV_TABLE(tableName) tableName::g_RecvTable +// MoeMod: ODR Use it to prevent being dropped by linker +#define REFERENCE_SEND_TABLE(tableName) (tableName::g_SendTableInit + &tableName::g_SendTableInit, tableName::g_SendTable) +#define REFERENCE_RECV_TABLE(tableName) (tableName::g_RecvTableInit + &tableName::g_RecvTableInit, tableName::g_RecvTable) class SendProp; diff --git a/public/tier0/basetypes.h b/public/tier0/basetypes.h index 470effe9..c1ee2a96 100644 --- a/public/tier0/basetypes.h +++ b/public/tier0/basetypes.h @@ -171,17 +171,24 @@ typedef float vec_t; // This assumes the ANSI/IEEE 754-1985 standard //----------------------------------------------------------------------------- -inline unsigned long& FloatBits( vec_t& f ) +// MoeMod : fix reinterpret_cast UB - Maybe fail with strict alias +union FloatCast_u { - return *reinterpret_cast(&f); + vec_t f; + unsigned int i; +}; + +inline unsigned int& FloatBits( vec_t& f ) +{ + return reinterpret_cast(&f)->i; } -inline unsigned long const& FloatBits( vec_t const& f ) +inline unsigned int const& FloatBits( vec_t const& f ) { - return *reinterpret_cast(&f); + return reinterpret_cast(&f)->i; } -inline vec_t BitsToFloat( unsigned long i ) +inline vec_t BitsToFloat( unsigned int i ) { vec_t f; memcpy( &f, &i, sizeof(f)); @@ -193,7 +200,7 @@ inline bool IsFinite( vec_t f ) return ((FloatBits(f) & 0x7F800000) != 0x7F800000); } -inline unsigned long FloatAbsBits( vec_t f ) +inline unsigned int FloatAbsBits( vec_t f ) { return FloatBits(f) & 0x7FFFFFFF; }