From 25dc9a24a84ab7d13b0b67711fb26f5cd101da88 Mon Sep 17 00:00:00 2001 From: slipher Date: Mon, 3 Jun 2024 15:16:58 -0500 Subject: [PATCH 1/7] NUKE sgame copy of trap_QuoteString --- src/shared/server/sg_api.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/shared/server/sg_api.cpp b/src/shared/server/sg_api.cpp index e9318a9810..c68260af31 100644 --- a/src/shared/server/sg_api.cpp +++ b/src/shared/server/sg_api.cpp @@ -145,11 +145,6 @@ void trap_GetTimeString(char *buffer, int size, const char *format, const qtime_ Q_strncpyz(buffer, text.c_str(), size); } -void trap_QuoteString(const char *str, char *buffer, int size) -{ - Q_strncpyz(buffer, Cmd::Escape(str).c_str(), size); -} - int trap_BotAllocateClient() { int res; From fa9b299e17a961fddff84a5f968cca2b32421514 Mon Sep 17 00:00:00 2001 From: slipher Date: Mon, 3 Jun 2024 15:35:45 -0500 Subject: [PATCH 2/7] Put declarations of src/shared sgame trap functions there src/shared/server/sg_api.cpp contains trap_* functions which wrap sgame->engine IPC messages. For some reason the declarations of these functions lived in Unvanquished/sgame/sg_trapcalls.h; move them to sg_api.h next to the implementations. --- src/shared/server/sg_api.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/shared/server/sg_api.h b/src/shared/server/sg_api.h index ba552a1440..cd7a08be88 100644 --- a/src/shared/server/sg_api.h +++ b/src/shared/server/sg_api.h @@ -35,4 +35,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. extern IPC::SharedMemory shmRegion; +void trap_LocateGameData( int numGEntities, int sizeofGEntity_t, int sizeofGClient ); +void trap_DropClient( int clientNum, const char *reason ); +void trap_SendServerCommand( int clientNum, const char *text ); +void trap_SetConfigstring( int num, const char *string ); +void trap_SetConfigstringRestrictions( int num, const clientList_t *clientList ); +void trap_GetConfigstring( int num, char *buffer, int bufferSize ); +void trap_SetUserinfo( int num, const char *buffer ); +void trap_GetUserinfo( int num, char *buffer, int bufferSize ); +void trap_GetServerinfo( char *buffer, int bufferSize ); +int trap_BotAllocateClient(); +void trap_BotFreeClient( int clientNum ); +void trap_GetUsercmd( int clientNum, usercmd_t *cmd ); +bool trap_GetEntityToken( char *buffer, int bufferSize ); +int trap_BotGetServerCommand( int clientNum, char *message, int size ); +int trap_RSA_GenerateMessage( const char *public_key, char *cleartext, char *encrypted ); +void trap_GenFingerprint( const char *pubkey, int size, char *buffer, int bufsize ); +void trap_GetPlayerPubkey( int clientNum, char *pubkey, int size ); +void trap_GetTimeString( char *buffer, int size, const char *format, const qtime_t *tm ); + #endif From 57b8febc2a2e6088e671b938e260cfc0aee27f6f Mon Sep 17 00:00:00 2001 From: slipher Date: Wed, 5 Jun 2024 13:49:56 -0500 Subject: [PATCH 3/7] Move declarations of cgame trap_ functions to right place Also clean up some extraneous includes in other headers. --- src/common/cm/cm_local.h | 1 + src/common/cm/cm_public.h | 2 - src/engine/client/cg_api.h | 112 +-------------------------------- src/engine/client/cg_msgdef.h | 1 + src/engine/server/server.h | 6 -- src/engine/server/sv_sgame.cpp | 3 - src/shared/CommonProxies.h | 1 + src/shared/client/cg_api.cpp | 1 + src/shared/client/cg_api.h | 99 +++++++++++++++++++++++++++++ 9 files changed, 104 insertions(+), 122 deletions(-) diff --git a/src/common/cm/cm_local.h b/src/common/cm/cm_local.h index 7c3377adc2..09ff99311d 100644 --- a/src/common/cm/cm_local.h +++ b/src/common/cm/cm_local.h @@ -38,6 +38,7 @@ Maryland 20850 USA. #include "common/Cvar.h" #include "common/Log.h" #include "engine/qcommon/qcommon.h" +#include "engine/qcommon/qfiles.h" // fake submodel handles #define CAPSULE_MODEL_HANDLE ( MAX_SUBMODELS ) diff --git a/src/common/cm/cm_public.h b/src/common/cm/cm_public.h index e5d62f6002..1747445cca 100644 --- a/src/common/cm/cm_public.h +++ b/src/common/cm/cm_public.h @@ -33,8 +33,6 @@ Maryland 20850 USA. */ #include "engine/qcommon/q_shared.h" -#include "engine/qcommon/qfiles.h" -#include "engine/renderer/tr_types.h" void CM_LoadMap(Str::StringRef name); void CM_ClearMap(); diff --git a/src/engine/client/cg_api.h b/src/engine/client/cg_api.h index 58d371dc24..e7b3931fac 100644 --- a/src/engine/client/cg_api.h +++ b/src/engine/client/cg_api.h @@ -20,15 +20,11 @@ along with this program. If not, see . =========================================================================== */ +// Definitions used in engine/cgame communication #ifndef CGAPI_H #define CGAPI_H - #include "engine/qcommon/q_shared.h" -#include "engine/renderer/tr_types.h" -#include "common/KeyIdentification.h" -#include "common/cm/cm_public.h" -#include "../../shared/CommonProxies.h" #ifdef BUILD_CGAME // TODO: find a better way that does not depend on a gamelogic file from an engine file #include "shared/bg_public.h" @@ -42,8 +38,6 @@ along with this program. If not, see . // multiple commands may be combined into a single packet, so this // needs to be larger than PACKET_BACKUP -#define MAX_ENTITIES_IN_SNAPSHOT 512 - // snapshots are a view of the server at a given time // Snapshots are generated at regular time intervals by the server, @@ -88,108 +82,4 @@ enum class MouseMode SystemCursor, // The input is sent as positions, the cursor should be rendered by the system }; -void trap_SendClientCommand( const char *s ); -void trap_UpdateScreen(); -int trap_CM_MarkFragments( int numPoints, const vec3_t *points, const vec3_t projection, int maxPoints, vec3_t pointBuffer, int maxFragments, markFragment_t *fragmentBuffer ); -void trap_S_StartSound( vec3_t origin, int entityNum, soundChannel_t entchannel, sfxHandle_t sfx ); -void trap_S_StartLocalSound( sfxHandle_t sfx, soundChannel_t channelNum ); -void trap_S_ClearLoopingSounds( bool killall ); -void trap_S_AddLoopingSound( int entityNum, const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx ); -void trap_S_AddRealLoopingSound( int entityNum, const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx ); -void trap_S_StopLoopingSound( int entityNum ); -void trap_S_UpdateEntityPosition( int entityNum, const vec3_t origin ); -int trap_S_GetCurrentSoundTime(); - -void trap_S_Respatialize( int entityNum, const vec3_t origin, vec3_t axis[ 3 ], int inwater ); -sfxHandle_t trap_S_RegisterSound( const char *sample, bool compressed ); -void trap_S_StartBackgroundTrack( const char *intro, const char *loop ); -void trap_R_LoadWorldMap( const char *mapname ); -qhandle_t trap_R_RegisterModel( const char *name ); -qhandle_t trap_R_RegisterSkin( const char *name ); -qhandle_t trap_R_RegisterShader( const char *name, RegisterShaderFlags_t flags ); - -void trap_R_ClearScene(); -void trap_R_AddRefEntityToScene( const refEntity_t *re ); -void trap_R_AddPolyToScene( qhandle_t hShader, int numVerts, const polyVert_t *verts ); -void trap_R_AddPolysToScene( qhandle_t hShader, int numVerts, const polyVert_t *verts, int numPolys ); -void trap_R_AddLightToScene( const vec3_t org, float radius, float intensity, float r, float g, float b, qhandle_t hShader, int flags ); -void trap_R_AddAdditiveLightToScene( const vec3_t org, float intensity, float r, float g, float b ); -void trap_R_Add2dPolysIndexedToScene( polyVert_t *polys, int numVerts, int *indexes, int numIndexes, int trans_x, int trans_y, qhandle_t shader ); -void trap_R_SetMatrixTransform( const matrix_t matrix ); -void trap_R_ResetMatrixTransform(); -void trap_R_RenderScene( const refdef_t *fd ); -void trap_R_ClearColor(); -void trap_R_SetColor( const Color::Color &rgba ); -void trap_R_SetClipRegion( const float *region ); -void trap_R_ResetClipRegion(); -void trap_R_DrawStretchPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, qhandle_t hShader ); -void trap_R_DrawRotatedPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, qhandle_t hShader, float angle ); -void trap_R_ModelBounds( clipHandle_t model, vec3_t mins, vec3_t maxs ); -int trap_R_LerpTag( orientation_t *tag, const refEntity_t *refent, const char *tagName, int startIndex ); -void trap_R_GetTextureSize( qhandle_t handle, int *x, int *y ); -qhandle_t trap_R_GenerateTexture( const byte *data, int x, int y ); -void trap_GetCurrentSnapshotNumber( int *snapshotNumber, int *serverTime ); -bool trap_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ); -int trap_GetCurrentCmdNumber(); -bool trap_GetUserCmd( int cmdNumber, usercmd_t *ucmd ); -void trap_SetUserCmdValue( int stateValue, int flags, float sensitivityScale ); -int trap_Key_GetCatcher(); -void trap_Key_SetCatcher( int catcher ); -void trap_Key_SetBinding( Keyboard::Key key, int team, const char *cmd ); -std::vector trap_Key_GetConsoleKeys(); -void trap_Key_SetConsoleKeys(const std::vector& keys); -void trap_Key_ClearCmdButtons(); -void trap_Key_ClearStates(); -std::vector trap_Key_KeysDown( const std::vector& keys ); -void trap_SetMouseMode( MouseMode mode ); -void trap_S_StopBackgroundTrack(); -void trap_R_RemapShader( const char *oldShader, const char *newShader, const char *timeOffset ); -bool trap_GetEntityToken( char *buffer, int bufferSize ); -std::vector> trap_Key_GetKeysForBinds(int team, const std::vector& binds); -int trap_Key_GetCharForScancode( int scancode ); -bool trap_R_inPVS( const vec3_t p1, const vec3_t p2 ); -bool trap_R_inPVVS( const vec3_t p1, const vec3_t p2 ); -bool trap_R_LoadDynamicShader( const char *shadername, const char *shadertext ); -int trap_R_LightForPoint( vec3_t point, vec3_t ambientLight, vec3_t directedLight, vec3_t lightDir ); - -qhandle_t trap_R_RegisterAnimation( const char *name ); -int trap_R_BuildSkeleton( refSkeleton_t *skel, qhandle_t anim, int startFrame, int endFrame, float frac, bool clearOrigin ); -int trap_R_BlendSkeleton( refSkeleton_t *skel, const refSkeleton_t *blend, float frac ); -int trap_R_BoneIndex( qhandle_t hModel, const char *boneName ); -int trap_R_AnimNumFrames( qhandle_t hAnim ); -int trap_R_AnimFrameRate( qhandle_t hAnim ); - -void trap_CompleteCallback( const char *complete ); - -void trap_RegisterButtonCommands( const char *cmds ); - -void trap_GetClipboardData( char *, int); -void trap_QuoteString( const char *, char*, int ); - -void trap_notify_onTeamChange( int newTeam ); - -qhandle_t trap_RegisterVisTest(); -void trap_AddVisTestToScene( qhandle_t hTest, const vec3_t pos, - float depthAdjust, float area ); -float trap_CheckVisibility( qhandle_t hTest ); -void trap_UnregisterVisTest( qhandle_t hTest ); -void trap_SetColorGrading( int slot, qhandle_t hShader ); -void trap_R_ScissorEnable( bool enable ); -void trap_R_ScissorSet( int x, int y, int w, int h ); -int trap_LAN_GetServerCount( int source ); -void trap_LAN_GetServerInfo( int source, int n, char *buf, int buflen ); -int trap_LAN_GetServerPing( int source, int n ); -void trap_LAN_MarkServerVisible( int source, int n, bool visible ); -int trap_LAN_ServerIsVisible( int source, int n ); -bool trap_LAN_UpdateVisiblePings( int source ); -void trap_LAN_ResetPings( int n ); -int trap_LAN_ServerStatus( const char *serverAddress, char *serverStatus, int maxLen ); -void trap_LAN_ResetServerStatus(); -void trap_R_GetShaderNameFromHandle( const qhandle_t shader, char *out, int len ); -void trap_PrepareKeyUp(); -void trap_R_SetAltShaderTokens( const char * ); -void trap_S_UpdateEntityVelocity( int entityNum, const vec3_t velocity ); -void trap_S_SetReverb( int slotNum, const char* presetName, float ratio ); -void trap_S_BeginRegistration(); -void trap_S_EndRegistration(); #endif diff --git a/src/engine/client/cg_msgdef.h b/src/engine/client/cg_msgdef.h index c56225154b..f648631d23 100644 --- a/src/engine/client/cg_msgdef.h +++ b/src/engine/client/cg_msgdef.h @@ -24,6 +24,7 @@ along with this program. If not, see . #define CG_MSGDEF_H #include "cg_api.h" +#include "engine/renderer/tr_types.h" #include "common/IPC/CommonSyscalls.h" #include "common/KeyIdentification.h" diff --git a/src/engine/server/server.h b/src/engine/server/server.h index 5f2f704b9e..a200fd993d 100644 --- a/src/engine/server/server.h +++ b/src/engine/server/server.h @@ -102,12 +102,6 @@ struct server_t float ucompAve; int ucompNum; // -NERVE - SMF - - md3Tag_t tags[ MAX_SERVER_TAGS ]; - tagHeaderExt_t tagHeadersExt[ MAX_TAG_FILES ]; - - int num_tagheaders; - int num_tags; }; struct clientSnapshot_t diff --git a/src/engine/server/sv_sgame.cpp b/src/engine/server/sv_sgame.cpp index 521716724c..5e4f0b2955 100644 --- a/src/engine/server/sv_sgame.cpp +++ b/src/engine/server/sv_sgame.cpp @@ -322,9 +322,6 @@ Called on a map change, not on a map_restart */ void SV_InitGameProgs() { - sv.num_tagheaders = 0; - sv.num_tags = 0; - // load the game module gvm.Start(); diff --git a/src/shared/CommonProxies.h b/src/shared/CommonProxies.h index a5ee123353..0c66d74cc8 100644 --- a/src/shared/CommonProxies.h +++ b/src/shared/CommonProxies.h @@ -50,6 +50,7 @@ namespace VM { void trap_AddCommand(const char* cmdName); void trap_RemoveCommand(const char* cmdName); +void trap_CompleteCallback(const char* complete); int trap_Argc(); void trap_Argv(int n, char* buffer, int bufferLength); const Cmd::Args& trap_Args(); diff --git a/src/shared/client/cg_api.cpp b/src/shared/client/cg_api.cpp index 397521f1f1..21100e4cae 100644 --- a/src/shared/client/cg_api.cpp +++ b/src/shared/client/cg_api.cpp @@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include "cg_api.h" IPC::CommandBufferClient cmdBuffer("cgame"); diff --git a/src/shared/client/cg_api.h b/src/shared/client/cg_api.h index 06befef3d2..da139c8fd9 100644 --- a/src/shared/client/cg_api.h +++ b/src/shared/client/cg_api.h @@ -28,11 +28,110 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. =========================================================================== */ +// APIs for use by the cgame VM #ifndef SHARED_CLIENT_API_H_ #define SHARED_CLIENT_API_H_ +#include "engine/qcommon/q_shared.h" +#include "engine/renderer/tr_types.h" +#include "engine/client/cg_api.h" +#include "common/KeyIdentification.h" +#include "shared/CommonProxies.h" #include extern IPC::CommandBufferClient cmdBuffer; +void trap_SendClientCommand( const char *s ); +void trap_UpdateScreen(); +int trap_CM_MarkFragments( int numPoints, const vec3_t *points, const vec3_t projection, int maxPoints, vec3_t pointBuffer, int maxFragments, markFragment_t *fragmentBuffer ); +void trap_S_StartSound( vec3_t origin, int entityNum, soundChannel_t entchannel, sfxHandle_t sfx ); +void trap_S_StartLocalSound( sfxHandle_t sfx, soundChannel_t channelNum ); +void trap_S_ClearLoopingSounds( bool killall ); +void trap_S_AddLoopingSound( int entityNum, const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx ); +void trap_S_AddRealLoopingSound( int entityNum, const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx ); +void trap_S_StopLoopingSound( int entityNum ); +void trap_S_UpdateEntityPosition( int entityNum, const vec3_t origin ); +void trap_S_Respatialize( int entityNum, const vec3_t origin, vec3_t axis[ 3 ], int inwater ); +sfxHandle_t trap_S_RegisterSound( const char *sample, bool compressed ); +void trap_S_StartBackgroundTrack( const char *intro, const char *loop ); +void trap_R_LoadWorldMap( const char *mapname ); +qhandle_t trap_R_RegisterModel( const char *name ); +qhandle_t trap_R_RegisterSkin( const char *name ); +qhandle_t trap_R_RegisterShader( const char *name, RegisterShaderFlags_t flags ); +void trap_R_ClearScene(); +void trap_R_AddRefEntityToScene( const refEntity_t *re ); +void trap_R_AddPolyToScene( qhandle_t hShader, int numVerts, const polyVert_t *verts ); +void trap_R_AddPolysToScene( qhandle_t hShader, int numVerts, const polyVert_t *verts, int numPolys ); +void trap_R_AddLightToScene( const vec3_t org, float radius, float intensity, float r, float g, float b, qhandle_t hShader, int flags ); +void trap_R_AddAdditiveLightToScene( const vec3_t org, float intensity, float r, float g, float b ); +void trap_R_Add2dPolysIndexedToScene( polyVert_t *polys, int numVerts, int *indexes, int numIndexes, int trans_x, int trans_y, qhandle_t shader ); +void trap_R_SetMatrixTransform( const matrix_t matrix ); +void trap_R_ResetMatrixTransform(); +void trap_R_RenderScene( const refdef_t *fd ); +void trap_R_ClearColor(); +void trap_R_SetColor( const Color::Color &rgba ); +void trap_R_SetClipRegion( const float *region ); +void trap_R_ResetClipRegion(); +void trap_R_DrawStretchPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, qhandle_t hShader ); +void trap_R_DrawRotatedPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, qhandle_t hShader, float angle ); +void trap_R_ModelBounds( clipHandle_t model, vec3_t mins, vec3_t maxs ); +int trap_R_LerpTag( orientation_t *tag, const refEntity_t *refent, const char *tagName, int startIndex ); +void trap_R_GetTextureSize( qhandle_t handle, int *x, int *y ); +qhandle_t trap_R_GenerateTexture( const byte *data, int x, int y ); +void trap_GetCurrentSnapshotNumber( int *snapshotNumber, int *serverTime ); +bool trap_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ); +int trap_GetCurrentCmdNumber(); +bool trap_GetUserCmd( int cmdNumber, usercmd_t *ucmd ); +void trap_SetUserCmdValue( int stateValue, int flags, float sensitivityScale ); +int trap_Key_GetCatcher(); +void trap_Key_SetCatcher( int catcher ); +void trap_Key_SetBinding( Keyboard::Key key, int team, const char *cmd ); +std::vector trap_Key_GetConsoleKeys(); +void trap_Key_SetConsoleKeys(const std::vector& keys); +void trap_Key_ClearCmdButtons(); +void trap_Key_ClearStates(); +std::vector trap_Key_KeysDown( const std::vector& keys ); +void trap_SetMouseMode( MouseMode mode ); +void trap_S_StopBackgroundTrack(); +void trap_R_RemapShader( const char *oldShader, const char *newShader, const char *timeOffset ); +bool trap_GetEntityToken( char *buffer, int bufferSize ); +std::vector> trap_Key_GetKeysForBinds(int team, const std::vector& binds); +int trap_Key_GetCharForScancode( int scancode ); +bool trap_R_inPVS( const vec3_t p1, const vec3_t p2 ); +bool trap_R_inPVVS( const vec3_t p1, const vec3_t p2 ); +int trap_R_LightForPoint( vec3_t point, vec3_t ambientLight, vec3_t directedLight, vec3_t lightDir ); +qhandle_t trap_R_RegisterAnimation( const char *name ); +int trap_R_BuildSkeleton( refSkeleton_t *skel, qhandle_t anim, int startFrame, int endFrame, float frac, bool clearOrigin ); +int trap_R_BlendSkeleton( refSkeleton_t *skel, const refSkeleton_t *blend, float frac ); +int trap_R_BoneIndex( qhandle_t hModel, const char *boneName ); +int trap_R_AnimNumFrames( qhandle_t hAnim ); +int trap_R_AnimFrameRate( qhandle_t hAnim ); +void trap_RegisterButtonCommands( const char *cmds ); +void trap_QuoteString( const char *, char*, int ); +void trap_notify_onTeamChange( int newTeam ); +qhandle_t trap_RegisterVisTest(); +void trap_AddVisTestToScene( qhandle_t hTest, const vec3_t pos, + float depthAdjust, float area ); +float trap_CheckVisibility( qhandle_t hTest ); +void trap_UnregisterVisTest( qhandle_t hTest ); +void trap_SetColorGrading( int slot, qhandle_t hShader ); +void trap_R_ScissorEnable( bool enable ); +void trap_R_ScissorSet( int x, int y, int w, int h ); +int trap_LAN_GetServerCount( int source ); +void trap_LAN_GetServerInfo( int source, int n, char *buf, int buflen ); +int trap_LAN_GetServerPing( int source, int n ); +void trap_LAN_MarkServerVisible( int source, int n, bool visible ); +int trap_LAN_ServerIsVisible( int source, int n ); +bool trap_LAN_UpdateVisiblePings( int source ); +void trap_LAN_ResetPings( int n ); +int trap_LAN_ServerStatus( const char *serverAddress, char *serverStatus, int maxLen ); +void trap_LAN_ResetServerStatus(); +void trap_R_GetShaderNameFromHandle( const qhandle_t shader, char *out, int len ); +void trap_PrepareKeyUp(); +void trap_R_SetAltShaderTokens( const char * ); +void trap_S_UpdateEntityVelocity( int entityNum, const vec3_t velocity ); +void trap_S_SetReverb( int slotNum, const char* presetName, float ratio ); +void trap_S_BeginRegistration(); +void trap_S_EndRegistration(); + #endif From b791f8804adabff0656c0f35ff3a1463d4e453d1 Mon Sep 17 00:00:00 2001 From: slipher Date: Wed, 29 May 2024 10:17:59 -0500 Subject: [PATCH 4/7] Trap calls: fix unsafe memcpy vector building idiom memcpying into a vector can cause UB if the size is 0. In most cases, ths more efficient iterator-based constructor can be used. Fixes https://github.com/Unvanquished/Unvanquished/issues/2682 (the underlying cause). --- src/shared/client/cg_api.cpp | 21 ++++++++------------- src/shared/client/cg_api.h | 2 +- src/shared/server/sg_api.cpp | 3 +-- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/shared/client/cg_api.cpp b/src/shared/client/cg_api.cpp index 21100e4cae..594941bf5d 100644 --- a/src/shared/client/cg_api.cpp +++ b/src/shared/client/cg_api.cpp @@ -51,6 +51,8 @@ void trap_UpdateScreen() int trap_CM_MarkFragments( int numPoints, const vec3_t *points, const vec3_t projection, int maxPoints, vec3_t pointBuffer, int maxFragments, markFragment_t *fragmentBuffer ) { + if (!numPoints) return 0; + std::vector> mypoints(numPoints); std::array myproj; memcpy((float*)mypoints.data(), points, sizeof(float) * 3 * numPoints); @@ -325,8 +327,7 @@ void trap_R_AddPolyToScene( qhandle_t hShader, int numVerts, const polyVert_t *v return; } - std::vector myverts(numVerts); - memcpy(myverts.data(), verts, numVerts * sizeof(polyVert_t)); + std::vector myverts(verts, verts + numVerts); cmdBuffer.SendMsg(hShader, myverts); } @@ -339,25 +340,20 @@ void trap_R_AddPolysToScene( qhandle_t hShader, int numVerts, const polyVert_t * return; } - std::vector myverts(size); - memcpy(myverts.data(), verts, size * sizeof(polyVert_t)); + std::vector myverts(verts, verts + size); - /* Known to crash on Clang ≥ 14 in non-Debug native build if size is 0: - https://github.com/Unvanquished/Unvanquished/issues/2682 */ cmdBuffer.SendMsg(hShader, myverts, numVerts, numPolys); } -void trap_R_Add2dPolysIndexedToScene( polyVert_t* polys, int numPolys, int* indexes, int numIndexes, int trans_x, int trans_y, qhandle_t shader ) +void trap_R_Add2dPolysIndexedToScene( const polyVert_t* polys, int numPolys, const int* indexes, int numIndexes, int trans_x, int trans_y, qhandle_t shader ) { if (!numIndexes) { return; } - std::vector mypolys(numPolys); - std::vector myindices(numIndexes); - memcpy(mypolys.data(), polys, numPolys * sizeof( polyVert_t ) ); - memcpy(myindices.data(), indexes, numIndexes * sizeof( int ) ); + std::vector mypolys(polys, polys + numPolys); + std::vector myindices(indexes, indexes + numIndexes); cmdBuffer.SendMsg(mypolys, numPolys, myindices, numIndexes, trans_x, trans_y, shader); } @@ -571,8 +567,7 @@ qhandle_t trap_R_GenerateTexture( const byte *data, int x, int y ) { ASSERT( x && y ); qhandle_t handle; - std::vector mydata(x * y * 4); - memcpy(mydata.data(), data, x * y * 4 * sizeof( byte ) ); + std::vector mydata(data, data + 4 * x * y); VM::SendMsg(mydata, x, y, handle); return handle; } diff --git a/src/shared/client/cg_api.h b/src/shared/client/cg_api.h index da139c8fd9..86c8a8585c 100644 --- a/src/shared/client/cg_api.h +++ b/src/shared/client/cg_api.h @@ -64,7 +64,7 @@ void trap_R_AddPolyToScene( qhandle_t hShader, int numVerts, const po void trap_R_AddPolysToScene( qhandle_t hShader, int numVerts, const polyVert_t *verts, int numPolys ); void trap_R_AddLightToScene( const vec3_t org, float radius, float intensity, float r, float g, float b, qhandle_t hShader, int flags ); void trap_R_AddAdditiveLightToScene( const vec3_t org, float intensity, float r, float g, float b ); -void trap_R_Add2dPolysIndexedToScene( polyVert_t *polys, int numVerts, int *indexes, int numIndexes, int trans_x, int trans_y, qhandle_t shader ); +void trap_R_Add2dPolysIndexedToScene( const polyVert_t *polys, int numVerts, const int *indexes, int numIndexes, int trans_x, int trans_y, qhandle_t shader ); void trap_R_SetMatrixTransform( const matrix_t matrix ); void trap_R_ResetMatrixTransform(); void trap_R_RenderScene( const refdef_t *fd ); diff --git a/src/shared/server/sg_api.cpp b/src/shared/server/sg_api.cpp index c68260af31..faf17a9af0 100644 --- a/src/shared/server/sg_api.cpp +++ b/src/shared/server/sg_api.cpp @@ -124,8 +124,7 @@ int trap_RSA_GenerateMessage(const char *public_key, char *cleartext, char *encr void trap_GenFingerprint(const char *pubkey, int size, char *buffer, int bufsize) { - std::vector pubkey2(size, 0); - memcpy(pubkey2.data(), pubkey, size); + std::vector pubkey2(pubkey, pubkey + size); std::string fingerprint; VM::SendMsg(size, pubkey2, bufsize, fingerprint); Q_strncpyz(buffer, fingerprint.c_str(), bufsize); From 58c79ec82aeee7f2f9c4c499900ffc8a741676c1 Mon Sep 17 00:00:00 2001 From: slipher Date: Wed, 29 May 2024 15:37:11 -0500 Subject: [PATCH 5/7] Use memcpy less Motivated by https://github.com/DaemonEngine/Daemon/issues/839#issuecomment-2134993702 At least 2 places looked definitely buggy (i.e. can pass null to memcpy): - StripColors (one of the StripColors variants was deleted due to the bug but there is another!) - Util::Reader::ReadData (when reading an empty vector) --- src/common/Color.cpp | 2 +- src/common/Color.h | 2 +- src/common/IPC/CommandBuffer.cpp | 2 ++ src/common/Serialize.h | 3 +++ src/common/cm/cm_patch.cpp | 4 ++-- src/common/cm/cm_trisoup.cpp | 4 ++-- src/engine/client/cl_serverlist.cpp | 2 +- src/engine/qcommon/files.cpp | 6 ++++-- src/engine/qcommon/q_math.cpp | 2 +- src/engine/renderer/tr_backend.cpp | 2 +- src/engine/renderer/tr_bsp.cpp | 19 +++++++++---------- src/engine/renderer/tr_cmds.cpp | 6 +++--- src/engine/renderer/tr_curve.cpp | 16 ++++++++-------- src/engine/renderer/tr_decals.cpp | 4 ++-- src/engine/renderer/tr_font.cpp | 4 ++-- src/engine/renderer/tr_model_md3.cpp | 2 +- src/engine/renderer/tr_model_md5.cpp | 2 +- src/engine/renderer/tr_scene.cpp | 8 ++++---- src/engine/renderer/tr_shader.cpp | 8 ++++---- src/engine/renderer/tr_surface.cpp | 2 +- src/shared/client/cg_api.cpp | 8 ++++---- 21 files changed, 57 insertions(+), 51 deletions(-) diff --git a/src/common/Color.cpp b/src/common/Color.cpp index 6df82555a0..c28965156f 100644 --- a/src/common/Color.cpp +++ b/src/common/Color.cpp @@ -93,7 +93,7 @@ void StripColors( const char *in, char *out, size_t len ) { break; } - memcpy( out, text.begin(), text.size() ); + std::copy( text.begin(), text.end(), out ); out += text.size(); len -= text.size(); } diff --git a/src/common/Color.h b/src/common/Color.h index 0ebc3051ac..e1b6dc4004 100644 --- a/src/common/Color.h +++ b/src/common/Color.h @@ -207,7 +207,7 @@ class BasicColor void ToArray( component_type* output ) const { - memcpy( output, ToArray(), ArrayBytes() ); + std::copy_n( ToArray(), 4, output ); } // Size of the memory location returned by ToArray() in bytes diff --git a/src/common/IPC/CommandBuffer.cpp b/src/common/IPC/CommandBuffer.cpp index 4c2a21a0e9..e47a53c304 100644 --- a/src/common/IPC/CommandBuffer.cpp +++ b/src/common/IPC/CommandBuffer.cpp @@ -134,6 +134,7 @@ namespace IPC { } void CommandBuffer::InternalRead(size_t offset, char* out, size_t len) { + ASSERT(out); // must not be null when using memcpy char* data = base_ + DATA_OFFSET; offset = Normalize(offset); size_t canRead = size_ - offset; @@ -148,6 +149,7 @@ namespace IPC { } void CommandBuffer::InternalWrite(size_t offset, const char* in, size_t len) { + ASSERT(in); // must not be null when using memcpy char* data = base_ + DATA_OFFSET; offset = Normalize(offset); size_t canWrite = size_ - offset; diff --git a/src/common/Serialize.h b/src/common/Serialize.h index f7eb72ad91..1fd90ec063 100644 --- a/src/common/Serialize.h +++ b/src/common/Serialize.h @@ -149,6 +149,9 @@ namespace Util { void ReadData(void* p, size_t len) { + if (!len) + return; // ensure null is never passed to memcpy + if (pos + len <= data.size()) { memcpy(p, data.data() + pos, len); pos += len; diff --git a/src/common/cm/cm_patch.cpp b/src/common/cm/cm_patch.cpp index 2b7831f5cc..012293a2f7 100644 --- a/src/common/cm/cm_patch.cpp +++ b/src/common/cm/cm_patch.cpp @@ -757,9 +757,9 @@ static void CM_SurfaceCollideFromGrid( cGrid_t *grid, cSurfaceCollide_t *sc ) sc->numPlanes = numTempPlanes; sc->numFacets = numFacets; sc->facets = ( cFacet_t * ) CM_Alloc( numFacets * sizeof( *sc->facets ) ); - memcpy( sc->facets, facets, numFacets * sizeof( *sc->facets ) ); + std::copy_n( facets, numFacets, sc->facets ); sc->planes = ( cPlane_t * ) CM_Alloc( numTempPlanes * sizeof( *sc->planes ) ); - memcpy( sc->planes, tempPlanes, numTempPlanes * sizeof( *sc->planes ) ); + std::copy_n( tempPlanes, numTempPlanes, sc->planes ); } /* diff --git a/src/common/cm/cm_trisoup.cpp b/src/common/cm/cm_trisoup.cpp index 56492a8ff0..fcbd9dc35b 100644 --- a/src/common/cm/cm_trisoup.cpp +++ b/src/common/cm/cm_trisoup.cpp @@ -267,11 +267,11 @@ static void CM_SurfaceCollideFromTriangleSoup( cTriangleSoup_t *triSoup, cSurfac // copy the results out sc->numPlanes = numTempPlanes; sc->planes = ( cPlane_t * ) CM_Alloc( numTempPlanes * sizeof( *sc->planes ) ); - memcpy( sc->planes, tempPlanes, numTempPlanes * sizeof( *sc->planes ) ); + std::copy_n( tempPlanes, numTempPlanes, sc->planes ); sc->numFacets = numFacets; sc->facets = ( cFacet_t * ) CM_Alloc( numFacets * sizeof( *sc->facets ) ); - memcpy( sc->facets, facets, numFacets * sizeof( *sc->facets ) ); + std::copy_n( facets, numFacets, sc->facets ); } /* diff --git a/src/engine/client/cl_serverlist.cpp b/src/engine/client/cl_serverlist.cpp index 18407d1fc2..97da3daa0e 100644 --- a/src/engine/client/cl_serverlist.cpp +++ b/src/engine/client/cl_serverlist.cpp @@ -999,7 +999,7 @@ void CL_Ping_f() pingptr = &CL_GetFreePing(); - memcpy( &pingptr->adr, &to, sizeof( netadr_t ) ); + pingptr->adr = to; pingptr->start = Sys::Milliseconds(); pingptr->time = -1; GeneratePingChallenge( *pingptr ); diff --git a/src/engine/qcommon/files.cpp b/src/engine/qcommon/files.cpp index 4854f5ad15..9b532b30a3 100644 --- a/src/engine/qcommon/files.cpp +++ b/src/engine/qcommon/files.cpp @@ -393,9 +393,11 @@ int FS_Write(const void* buffer, int len, fileHandle_t handle) int FS_Read(void* buffer, int len, fileHandle_t handle) { FS_CheckHandle(handle, false); + if (len < 0) + Sys::Drop("FS_Read: invalid length"); if (handleTable[handle].isPakFile) { - if (len < 0) - Sys::Drop("FS_Read: invalid length"); + if (!len) + return 0; if (handleTable[handle].filePos >= handleTable[handle].fileData.size()) return 0; len = std::min(len, handleTable[handle].fileData.size() - handleTable[handle].filePos); diff --git a/src/engine/qcommon/q_math.cpp b/src/engine/qcommon/q_math.cpp index c8622612b1..511aad85ed 100644 --- a/src/engine/qcommon/q_math.cpp +++ b/src/engine/qcommon/q_math.cpp @@ -1513,7 +1513,7 @@ float VectorDistanceSquared( vec3_t v1, vec3_t v2 ) // *INDENT-OFF* void MatrixIdentity( matrix_t m ) { - memcpy( m, matrixIdentity, sizeof( matrix_t ) ); + MatrixCopy( matrixIdentity, m ); } void MatrixClear( matrix_t m ) diff --git a/src/engine/renderer/tr_backend.cpp b/src/engine/renderer/tr_backend.cpp index 4c43547d5c..ccca11bf23 100644 --- a/src/engine/renderer/tr_backend.cpp +++ b/src/engine/renderer/tr_backend.cpp @@ -754,7 +754,7 @@ static void SetViewportAndScissor() float mat[16], scale; vec4_t q, c; - memcpy( mat, backEnd.viewParms.projectionMatrix, sizeof(mat) ); + MatrixCopy( backEnd.viewParms.projectionMatrix, mat ); if( backEnd.viewParms.portalLevel > 0 ) { VectorCopy(backEnd.viewParms.portalFrustum[FRUSTUM_NEAR].normal, c); diff --git a/src/engine/renderer/tr_bsp.cpp b/src/engine/renderer/tr_bsp.cpp index aa82e2595d..b3711a8073 100644 --- a/src/engine/renderer/tr_bsp.cpp +++ b/src/engine/renderer/tr_bsp.cpp @@ -2792,7 +2792,7 @@ R_MovePatchSurfacesToHunk */ void R_MovePatchSurfacesToHunk() { - int i, size; + int i; srfGridMesh_t *grid, *hunkgrid; for ( i = 0; i < s_worldData.numSurfaces; i++ ) @@ -2807,23 +2807,22 @@ void R_MovePatchSurfacesToHunk() } // - size = sizeof( *grid ); - hunkgrid = (srfGridMesh_t*) ri.Hunk_Alloc( size, ha_pref::h_low ); - memcpy( hunkgrid, grid, size ); + hunkgrid = (srfGridMesh_t*) ri.Hunk_Alloc( sizeof(srfGridMesh_t), ha_pref::h_low ); + *hunkgrid = *grid; - hunkgrid->widthLodError = (float*) ri.Hunk_Alloc( grid->width * 4, ha_pref::h_low ); - memcpy( hunkgrid->widthLodError, grid->widthLodError, grid->width * 4 ); + hunkgrid->widthLodError = (float*) ri.Hunk_Alloc( grid->width * sizeof( float ), ha_pref::h_low ); + std::copy_n( grid->widthLodError, grid->width, hunkgrid->widthLodError ); - hunkgrid->heightLodError = (float*) ri.Hunk_Alloc( grid->height * 4, ha_pref::h_low ); - memcpy( hunkgrid->heightLodError, grid->heightLodError, grid->height * 4 ); + hunkgrid->heightLodError = (float*) ri.Hunk_Alloc( grid->height * sizeof( float ), ha_pref::h_low ); + std::copy_n( grid->heightLodError, grid->height, hunkgrid->heightLodError ); hunkgrid->numTriangles = grid->numTriangles; hunkgrid->triangles = (srfTriangle_t*) ri.Hunk_Alloc( grid->numTriangles * sizeof( srfTriangle_t ), ha_pref::h_low ); - memcpy( hunkgrid->triangles, grid->triangles, grid->numTriangles * sizeof( srfTriangle_t ) ); + std::copy_n( grid->triangles, grid->numTriangles, hunkgrid->triangles ); hunkgrid->numVerts = grid->numVerts; hunkgrid->verts = (srfVert_t*) ri.Hunk_Alloc( grid->numVerts * sizeof( srfVert_t ), ha_pref::h_low ); - memcpy( hunkgrid->verts, grid->verts, grid->numVerts * sizeof( srfVert_t ) ); + std::copy_n( grid->verts, grid->numVerts, hunkgrid->verts ); R_FreeSurfaceGridMesh( grid ); diff --git a/src/engine/renderer/tr_cmds.cpp b/src/engine/renderer/tr_cmds.cpp index 443d90aa10..4217be798b 100644 --- a/src/engine/renderer/tr_cmds.cpp +++ b/src/engine/renderer/tr_cmds.cpp @@ -607,7 +607,7 @@ void RE_2DPolyies( polyVert_t *verts, int numverts, qhandle_t hShader ) cmd->verts = &backEndData[ tr.smpFrame ]->polyVerts[ r_numPolyVerts ]; cmd->numverts = numverts; - memcpy( cmd->verts, verts, sizeof( polyVert_t ) * numverts ); + std::copy_n( verts, numverts, cmd->verts ); cmd->shader = R_GetShaderByHandle( hShader ); r_numPolyVerts += numverts; @@ -636,10 +636,10 @@ void RE_2DPolyiesIndexed( polyVert_t *verts, int numverts, int *indexes, int num cmd->verts = &backEndData[ tr.smpFrame ]->polyVerts[ r_numPolyVerts ]; cmd->numverts = numverts; - memcpy( cmd->verts, verts, sizeof( polyVert_t ) * numverts ); + std::copy_n( verts, numverts, cmd->verts ); cmd->shader = R_GetShaderByHandle( hShader ); cmd->indexes = &backEndData[ tr.smpFrame ]->polyIndexes[ r_numPolyIndexes ]; - memcpy( cmd->indexes, indexes, sizeof( int ) * numindexes ); + std::copy_n( indexes, numindexes, cmd->indexes ); cmd->numIndexes = numindexes; cmd->translation[ 0 ] = trans_x; cmd->translation[ 1 ] = trans_y; diff --git a/src/engine/renderer/tr_curve.cpp b/src/engine/renderer/tr_curve.cpp index 705a645037..af3405514e 100644 --- a/src/engine/renderer/tr_curve.cpp +++ b/src/engine/renderer/tr_curve.cpp @@ -424,15 +424,15 @@ static srfGridMesh_t *R_CreateSurfaceGridMesh( int width, int height, { grid = (srfGridMesh_t*)/*ri.Hunk_Alloc */ Z_Calloc( size ); - grid->widthLodError = (float*)/*ri.Hunk_Alloc */ Z_AllocUninit( width * 4 ); - memcpy( grid->widthLodError, errorTable[ 0 ], width * 4 ); + grid->widthLodError = (float*)/*ri.Hunk_Alloc */ Z_AllocUninit( width * sizeof( float ) ); + std::copy_n( errorTable[ 0 ], width, grid->widthLodError ); - grid->heightLodError = (float*)/*ri.Hunk_Alloc */ Z_AllocUninit( height * 4 ); - memcpy( grid->heightLodError, errorTable[ 1 ], height * 4 ); + grid->heightLodError = (float*)/*ri.Hunk_Alloc */ Z_AllocUninit( height * sizeof( float ) ); + std::copy_n( errorTable[ 1 ], height, grid->heightLodError ); grid->numTriangles = numTriangles; grid->triangles = (srfTriangle_t*) Z_AllocUninit( grid->numTriangles * sizeof( srfTriangle_t ) ); - memcpy( grid->triangles, triangles, numTriangles * sizeof( srfTriangle_t ) ); + std::copy_n( triangles, numTriangles, grid->triangles ); grid->numVerts = ( width * height ); grid->verts = (srfVert_t*) Z_AllocUninit( grid->numVerts * sizeof( srfVert_t ) ); @@ -443,14 +443,14 @@ static srfGridMesh_t *R_CreateSurfaceGridMesh( int width, int height, memset( grid, 0, size ); grid->widthLodError = (float*) ri.Hunk_Alloc( width * 4, ha_pref::h_low ); - memcpy( grid->widthLodError, errorTable[ 0 ], width * 4 ); + std::copy_n( errorTable[ 0 ], width, grid->widthLodError ); grid->heightLodError = (float*) ri.Hunk_Alloc( height * 4, ha_pref::h_low ); - memcpy( grid->heightLodError, errorTable[ 1 ], height * 4 ); + std::copy_n( errorTable[ 1 ], height, grid->heightLodError ); grid->numTriangles = numTriangles; grid->triangles = (srfTriangle_t*) ri.Hunk_Alloc( grid->numTriangles * sizeof( srfTriangle_t ), ha_pref::h_low ); - memcpy( grid->triangles, triangles, numTriangles * sizeof( srfTriangle_t ) ); + std::copy_n( triangles, numTriangles, grid->triangles ); grid->numVerts = ( width * height ); grid->verts = (srfVert_t*) ri.Hunk_Alloc( grid->numVerts * sizeof( srfVert_t ), ha_pref::h_low ); diff --git a/src/engine/renderer/tr_decals.cpp b/src/engine/renderer/tr_decals.cpp index 6bdeb76e56..0ebbd8ad14 100644 --- a/src/engine/renderer/tr_decals.cpp +++ b/src/engine/renderer/tr_decals.cpp @@ -316,7 +316,7 @@ void RE_ProjectDecal( qhandle_t hShader, int numPoints, vec3_t *points, vec4_t p /* create a new projector */ dp = &tr.refdef.decalProjectors[ r_numDecalProjectors & DECAL_PROJECTOR_MASK ]; - memcpy( dp, &temp, sizeof( *dp ) ); + *dp = temp; /* we have a winner */ r_numDecalProjectors++; @@ -863,7 +863,7 @@ void R_AddDecalSurface( decal_t *decal ) /* set it up */ srf->surfaceType = surfaceType_t::SF_DECAL; srf->numVerts = decal->numVerts; - memcpy( srf->verts, decal->verts, srf->numVerts * sizeof( *srf->verts ) ); + std::copy_n( decal->verts, decal->numVerts, srf->verts ); /* fade colors */ if ( decal->fadeStartTime < tr.refdef.time && decal->fadeStartTime < decal->fadeEndTime ) diff --git a/src/engine/renderer/tr_font.cpp b/src/engine/renderer/tr_font.cpp index 9d45c90849..30d2995d35 100644 --- a/src/engine/renderer/tr_font.cpp +++ b/src/engine/renderer/tr_font.cpp @@ -357,7 +357,7 @@ void RE_GlyphChar( fontInfo_t *font, int ch, glyphInfo_t *glyph ) } // we have a glyph - memcpy( glyph, &font->glyphBlock[ ch / 256][ ch % 256 ], sizeof( *glyph ) ); + *glyph = font->glyphBlock[ ch / 256][ ch % 256 ]; } void RE_Glyph( fontInfo_t *font, const char *str, glyphInfo_t *glyph ) @@ -487,7 +487,7 @@ void RE_RenderChunk( fontInfo_t *font, const int chunk ) if ( glyph ) { rendered = true; - memcpy( glyphs + i, glyph, sizeof( glyphInfo_t ) ); + glyphs[ i ] = *glyph; } if ( xOut == -1 ) diff --git a/src/engine/renderer/tr_model_md3.cpp b/src/engine/renderer/tr_model_md3.cpp index 03eead05b3..8a10c2fb4f 100644 --- a/src/engine/renderer/tr_model_md3.cpp +++ b/src/engine/renderer/tr_model_md3.cpp @@ -367,7 +367,7 @@ bool R_LoadMD3( model_t *mod, int lod, const void *buffer, const char *modName ) mdvModel->numVBOSurfaces = vboSurfaces.size(); size_t allocSize = vboSurfaces.size() * sizeof( vboSurfaces[ 0 ] ); mdvModel->vboSurfaces = (srfVBOMDVMesh_t**) ri.Hunk_Alloc( allocSize, ha_pref::h_low ); - memcpy( mdvModel->vboSurfaces, vboSurfaces.data(), allocSize ); + std::copy( vboSurfaces.begin(), vboSurfaces.end(), mdvModel->vboSurfaces ); } return true; diff --git a/src/engine/renderer/tr_model_md5.cpp b/src/engine/renderer/tr_model_md5.cpp index 2a28b50db9..bba9ba0958 100644 --- a/src/engine/renderer/tr_model_md5.cpp +++ b/src/engine/renderer/tr_model_md5.cpp @@ -638,7 +638,7 @@ bool R_LoadMD5( model_t *mod, const char *buffer, const char *modName ) md5->numVBOSurfaces = vboSurfaces.size(); size_t allocSize = vboSurfaces.size() * sizeof( vboSurfaces[ 0 ] ); md5->vboSurfaces = (srfVBOMD5Mesh_t**) ri.Hunk_Alloc( allocSize, ha_pref::h_low ); - memcpy( md5->vboSurfaces, vboSurfaces.data(), allocSize ); + std::copy( vboSurfaces.begin(), vboSurfaces.end(), md5->vboSurfaces ); return true; } diff --git a/src/engine/renderer/tr_scene.cpp b/src/engine/renderer/tr_scene.cpp index 4bcebc2877..951cc720c9 100644 --- a/src/engine/renderer/tr_scene.cpp +++ b/src/engine/renderer/tr_scene.cpp @@ -189,7 +189,7 @@ static void R_AddPolysToScene( qhandle_t hShader, int numVerts, const polyVert_t poly->numVerts = numVerts; poly->verts = &backEndData[ tr.smpFrame ]->polyVerts[ r_numPolyVerts ]; - memcpy( poly->verts, &verts[ numVerts * j ], numVerts * sizeof( *verts ) ); + std::copy_n( &verts[ numVerts * j ], numVerts, poly->verts ); // done. r_numPolys++; @@ -281,7 +281,7 @@ void RE_AddRefEntityToScene( const refEntity_t *ent ) Sys::Drop("RE_AddRefEntityToScene: bad reType %s", Util::enum_str(ent->reType)); } - memcpy( &backEndData[ tr.smpFrame ]->entities[ r_numEntities ].e, ent, sizeof( refEntity_t ) ); + backEndData[ tr.smpFrame ]->entities[ r_numEntities ].e = *ent; backEndData[ tr.smpFrame ]->entities[ r_numEntities ].lightingCalculated = false; r_numEntities++; @@ -317,7 +317,7 @@ void RE_AddRefLightToScene( const refLight_t *l ) } light = &backEndData[ tr.smpFrame ]->lights[ r_numLights++ ]; - memcpy( &light->l, l, sizeof( light->l ) ); + light->l = *l; light->isStatic = false; light->additive = true; @@ -373,7 +373,7 @@ static void R_AddWorldLightsToScene() continue; } - memcpy( &backEndData[ tr.smpFrame ]->lights[ r_numLights ], light, sizeof( trRefLight_t ) ); + backEndData[ tr.smpFrame ]->lights[ r_numLights ] = *light; r_numLights++; } } diff --git a/src/engine/renderer/tr_shader.cpp b/src/engine/renderer/tr_shader.cpp index 1af486e9b3..86815fdfc7 100644 --- a/src/engine/renderer/tr_shader.cpp +++ b/src/engine/renderer/tr_shader.cpp @@ -5489,9 +5489,8 @@ static shader_t *MakeShaderPermanent() ASSERT( numStages <= MAX_SHADER_STAGES ); - const size_t stageListSize = sizeof( shaderStage_t ) * numStages; - newShader->stages = (shaderStage_t*) ri.Hunk_Alloc( stageListSize, ha_pref::h_low ); - memcpy( newShader->stages, stages.data(), stageListSize ); + newShader->stages = (shaderStage_t*) ri.Hunk_Alloc( sizeof( shaderStage_t ) * numStages, ha_pref::h_low ); + std::copy_n( stages.data(), numStages, newShader->stages ); for ( size_t s = 0; s < numStages; s++ ) { @@ -5499,7 +5498,8 @@ static shader_t *MakeShaderPermanent() { size_t size = newShader->stages[ s ].bundle[ b ].numTexMods * sizeof( texModInfo_t ); newShader->stages[ s ].bundle[ b ].texMods = (texModInfo_t*) ri.Hunk_Alloc( size, ha_pref::h_low ); - memcpy( newShader->stages[ s ].bundle[ b ].texMods, stages[ s ].bundle[ b ].texMods, size ); + std::copy_n( stages[ s ].bundle[ b ].texMods, newShader->stages[ s ].bundle[ b ].numTexMods, + newShader->stages[ s ].bundle[ b ].texMods ); } } diff --git a/src/engine/renderer/tr_surface.cpp b/src/engine/renderer/tr_surface.cpp index 994dca3824..d4318512f4 100644 --- a/src/engine/renderer/tr_surface.cpp +++ b/src/engine/renderer/tr_surface.cpp @@ -1240,7 +1240,7 @@ void Tess_SurfaceIQM( srfIQModel_t *surf ) { { if( model->num_joints > 0 ) { - memcpy( tess.bones, bones, model->num_joints * sizeof(transform_t) ); + std::copy_n( bones, model->num_joints, tess.bones ); tess.numBones = model->num_joints; } else diff --git a/src/shared/client/cg_api.cpp b/src/shared/client/cg_api.cpp index 594941bf5d..24e479c9b4 100644 --- a/src/shared/client/cg_api.cpp +++ b/src/shared/client/cg_api.cpp @@ -55,7 +55,7 @@ int trap_CM_MarkFragments( int numPoints, const vec3_t *points, const vec3_t pro std::vector> mypoints(numPoints); std::array myproj; - memcpy((float*)mypoints.data(), points, sizeof(float) * 3 * numPoints); + memcpy(mypoints.data(), points, sizeof(float) * 3 * numPoints); VectorCopy(projection, myproj); std::vector> mypointBuffer; @@ -63,7 +63,7 @@ int trap_CM_MarkFragments( int numPoints, const vec3_t *points, const vec3_t pro VM::SendMsg(mypoints, myproj, maxPoints, maxFragments, mypointBuffer, myfragmentBuffer); memcpy(pointBuffer, mypointBuffer.data(), sizeof(float) * 3 * maxPoints); - memcpy(fragmentBuffer, myfragmentBuffer.data(), sizeof(markFragment_t) * myfragmentBuffer.size()); + std::copy(myfragmentBuffer.begin(), myfragmentBuffer.end(), fragmentBuffer); return myfragmentBuffer.size(); } @@ -362,7 +362,7 @@ void trap_R_Add2dPolysIndexedToScene( const polyVert_t* polys, int numPolys, con void trap_R_SetMatrixTransform( const matrix_t matrix ) { std::array mymatrix; - memcpy(mymatrix.data(), matrix, 16 * sizeof(float)); + MatrixCopy(matrix, mymatrix.data()); cmdBuffer.SendMsg(mymatrix); } @@ -403,7 +403,7 @@ void trap_R_SetColor( const Color::Color &rgba ) void trap_R_SetClipRegion( const float *region ) { std::array myregion; - memcpy(myregion.data(), region, 4 * sizeof(float)); + Vector4Copy(region, myregion); cmdBuffer.SendMsg(myregion); } From 7853307cd6b4b44d45ebd8532076b547b923406e Mon Sep 17 00:00:00 2001 From: slipher Date: Fri, 31 May 2024 10:10:36 -0500 Subject: [PATCH 6/7] Rewrite Color class to avoid undefined behavior Doing (&red)[2] via ToArray() is UB --- src/common/Color.h | 64 +++++++++++++++++++-------------------- src/common/cm/cm_load.cpp | 2 +- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/common/Color.h b/src/common/Color.h index e1b6dc4004..8c98ebc74c 100644 --- a/src/common/Color.h +++ b/src/common/Color.h @@ -102,10 +102,10 @@ class ColorAdaptor ColorAdaptor( const Component* array ) : array( array ) {} - Component Red() const { return array[0]; } - Component Green() const { return array[1]; } - Component Blue() const { return array[2]; } - Component Alpha() const { return array[3]; } + Component Red() const { return array[ 0 ]; } + Component Green() const { return array[ 1 ]; } + Component Blue() const { return array[ 2 ]; } + Component Alpha() const { return array[ 3 ]; } private: const Component* array; @@ -163,7 +163,7 @@ class BasicColor // Initialize from the components CONSTEXPR_FUNCTION BasicColor( component_type r, component_type g, component_type b, component_type a = component_max ) NOEXCEPT - : red( r ), green( g ), blue( b ), alpha( a ) + : data_{ r, g, b, a } {} // Default constructor, all components set to zero @@ -175,21 +175,21 @@ class BasicColor BasicColor& operator=( BasicColor&& ) NOEXCEPT = default; template> - BasicColor( const T& adaptor ) : - red ( ConvertComponent( adaptor.Red() ) ), - green( ConvertComponent( adaptor.Green() ) ), - blue ( ConvertComponent( adaptor.Blue() ) ), - alpha( ConvertComponent( adaptor.Alpha() ) ) + BasicColor( const T& adaptor ) : data_{ + ConvertComponent( adaptor.Red() ), + ConvertComponent( adaptor.Green() ), + ConvertComponent( adaptor.Blue() ), + ConvertComponent( adaptor.Alpha() ) } {} template> BasicColor& operator=( const T& adaptor ) { - red = ConvertComponent( adaptor.Red() ); - green = ConvertComponent( adaptor.Green() ); - blue = ConvertComponent( adaptor.Blue() ); - alpha = ConvertComponent( adaptor.Alpha() ); + SetRed( ConvertComponent( adaptor.Red() ) ); + SetGreen( ConvertComponent( adaptor.Green() ) ); + SetBlue( ConvertComponent( adaptor.Blue() ) ); + SetAlpha( ConvertComponent( adaptor.Alpha() ) ); return *this; } @@ -197,12 +197,12 @@ class BasicColor // Converts to an array CONSTEXPR_FUNCTION const component_type* ToArray() const NOEXCEPT { - return &red; + return data_; } CONSTEXPR_FUNCTION_RELAXED component_type* ToArray() NOEXCEPT { - return &red; + return data_; } void ToArray( component_type* output ) const @@ -213,47 +213,47 @@ class BasicColor // Size of the memory location returned by ToArray() in bytes CONSTEXPR_FUNCTION std::size_t ArrayBytes() const NOEXCEPT { - return 4 * Traits::component_size; + return sizeof(data_); } CONSTEXPR_FUNCTION component_type Red() const NOEXCEPT { - return red; + return data_[ 0 ]; } CONSTEXPR_FUNCTION component_type Green() const NOEXCEPT { - return green; + return data_[ 1 ]; } CONSTEXPR_FUNCTION component_type Blue() const NOEXCEPT { - return blue; + return data_[ 2 ]; } CONSTEXPR_FUNCTION component_type Alpha() const NOEXCEPT { - return alpha; + return data_[ 3 ]; } CONSTEXPR_FUNCTION_RELAXED void SetRed( component_type v ) NOEXCEPT { - red = v; + data_[ 0 ] = v; } CONSTEXPR_FUNCTION_RELAXED void SetGreen( component_type v ) NOEXCEPT { - green = v; + data_[ 1 ] = v; } CONSTEXPR_FUNCTION_RELAXED void SetBlue( component_type v ) NOEXCEPT { - blue = v; + data_[ 2 ] = v; } CONSTEXPR_FUNCTION_RELAXED void SetAlpha( component_type v ) NOEXCEPT { - alpha = v; + data_[ 3 ] = v; } CONSTEXPR_FUNCTION_RELAXED BasicColor& operator*=( float factor ) NOEXCEPT @@ -262,18 +262,19 @@ class BasicColor return *this; } + // FIXME: multiplying both rgb AND alpha by something doesn't seem like an operation anyone would want CONSTEXPR_FUNCTION BasicColor operator*( float factor ) const NOEXCEPT { - return BasicColor( red * factor, green * factor, blue * factor, alpha * factor ); + return BasicColor( Red() * factor, Green() * factor, Blue() * factor, Alpha() * factor ); } // Fits the component values from 0 to component_max CONSTEXPR_FUNCTION_RELAXED void Clamp() { - red = Math::Clamp( red, component_type(), component_max ); - green = Math::Clamp( green, component_type(), component_max ); - blue = Math::Clamp( blue, component_type(), component_max ); - alpha = Math::Clamp( alpha, component_type(), component_max ); + SetRed( Math::Clamp( Red(), component_type(), component_max ) ); + SetGreen( Math::Clamp( Green(), component_type(), component_max ) ); + SetBlue( Math::Clamp( Blue(), component_type(), component_max ) ); + SetAlpha( Math::Clamp( Alpha(), component_type(), component_max ) ); } private: @@ -299,8 +300,7 @@ class BasicColor return from; } - component_type red = 0, green = 0, blue = 0, alpha = 0; - + component_type data_[4]{}; }; using Color = BasicColor; diff --git a/src/common/cm/cm_load.cpp b/src/common/cm/cm_load.cpp index ce22c9626f..546775e55c 100644 --- a/src/common/cm/cm_load.cpp +++ b/src/common/cm/cm_load.cpp @@ -840,7 +840,7 @@ CM_ClearMap void CM_ClearMap() { CM_FreeAll(); - memset( &cm, 0, sizeof( cm ) ); + ResetStruct( cm ); } /* From 6959367cf8437463a5d2c16138c563f486163105 Mon Sep 17 00:00:00 2001 From: slipher Date: Fri, 31 May 2024 16:59:26 -0500 Subject: [PATCH 7/7] Use memset less --- src/common/cm/cm_patch.cpp | 4 ++-- src/common/cm/cm_trace.cpp | 3 +-- src/common/cm/cm_trisoup.cpp | 2 +- src/engine/client/cl_avi.cpp | 2 +- src/engine/client/cl_input.cpp | 6 ++---- src/engine/client/cl_main.cpp | 5 ++--- src/engine/client/cl_parse.cpp | 3 +-- src/engine/client/cl_serverlist.cpp | 8 +++----- src/engine/client/cl_serverstatus.cpp | 4 ++-- src/engine/framework/Rcon.cpp | 6 ++---- src/engine/framework/VirtualMachine.cpp | 6 ++---- src/engine/null/null_renderer.cpp | 2 +- src/engine/qcommon/huffman.cpp | 10 ++++------ src/engine/qcommon/msg.cpp | 6 +++--- src/engine/qcommon/net_chan.cpp | 4 ++-- src/engine/renderer/tr_backend.cpp | 4 ++-- src/engine/renderer/tr_bsp.cpp | 10 +++------- src/engine/renderer/tr_cmds.cpp | 8 ++++---- src/engine/renderer/tr_curve.cpp | 2 +- src/engine/renderer/tr_font.cpp | 6 +++--- src/engine/renderer/tr_image.cpp | 2 +- src/engine/renderer/tr_image_ktx.cpp | 3 +-- src/engine/renderer/tr_init.cpp | 2 +- src/engine/renderer/tr_light.cpp | 4 +--- src/engine/renderer/tr_main.cpp | 4 ++-- src/engine/renderer/tr_model_iqm.cpp | 3 +-- src/engine/renderer/tr_model_md3.cpp | 3 +-- src/engine/renderer/tr_model_md5.cpp | 3 +-- src/engine/renderer/tr_model_skel.cpp | 3 +-- src/engine/renderer/tr_scene.cpp | 5 ++--- src/engine/renderer/tr_shader.cpp | 2 +- src/engine/renderer/tr_vbo.cpp | 12 +++++------- src/engine/server/sv_client.cpp | 9 ++++----- src/engine/server/sv_init.cpp | 2 +- src/engine/sys/sdl_glimp.cpp | 4 ++-- src/engine/sys/sdl_input.cpp | 2 +- 36 files changed, 68 insertions(+), 96 deletions(-) diff --git a/src/common/cm/cm_patch.cpp b/src/common/cm/cm_patch.cpp index 012293a2f7..3bdc9823db 100644 --- a/src/common/cm/cm_patch.cpp +++ b/src/common/cm/cm_patch.cpp @@ -668,7 +668,7 @@ static void CM_SurfaceCollideFromGrid( cGrid_t *grid, cSurfaceCollide_t *sc ) } facet = &facets[ numFacets ]; - memset( facet, 0, sizeof( *facet ) ); + *facet = {}; if ( gridPlanes[ i ][ j ][ 0 ] == gridPlanes[ i ][ j ][ 1 ] ) { @@ -724,7 +724,7 @@ static void CM_SurfaceCollideFromGrid( cGrid_t *grid, cSurfaceCollide_t *sc ) } facet = &facets[ numFacets ]; - memset( facet, 0, sizeof( *facet ) ); + *facet = {}; facet->surfacePlane = gridPlanes[ i ][ j ][ 1 ]; facet->numBorders = 3; diff --git a/src/common/cm/cm_trace.cpp b/src/common/cm/cm_trace.cpp index a020fa512a..46678fe613 100644 --- a/src/common/cm/cm_trace.cpp +++ b/src/common/cm/cm_trace.cpp @@ -1846,7 +1846,6 @@ static void CM_Trace( trace_t *results, const vec3_t start, const vec3_t end, co int skipmask, traceType_t type, const sphere_t *sphere ) { int i; - traceWork_t tw; vec3_t offset; cmodel_t *cmod; @@ -1857,7 +1856,7 @@ static void CM_Trace( trace_t *results, const vec3_t start, const vec3_t end, co c_traces++; // for statistics, may be zeroed // fill in a default trace - memset( &tw, 0, sizeof( tw ) ); + traceWork_t tw{}; tw.trace.fraction = 1; // assume it goes the entire distance until shown otherwise VectorCopy( origin, tw.modelOrigin ); tw.type = type; diff --git a/src/common/cm/cm_trisoup.cpp b/src/common/cm/cm_trisoup.cpp index fcbd9dc35b..f751237ccd 100644 --- a/src/common/cm/cm_trisoup.cpp +++ b/src/common/cm/cm_trisoup.cpp @@ -210,7 +210,7 @@ static void CM_SurfaceCollideFromTriangleSoup( cTriangleSoup_t *triSoup, cSurfac for ( i = 0; i < triSoup->numTriangles; i++ ) { facet = &facets[ numFacets ]; - memset( facet, 0, sizeof( *facet ) ); + *facet = {}; p1 = triSoup->points[ i ][ 0 ]; p2 = triSoup->points[ i ][ 1 ]; diff --git a/src/engine/client/cl_avi.cpp b/src/engine/client/cl_avi.cpp index 685380783d..17566a6ddc 100644 --- a/src/engine/client/cl_avi.cpp +++ b/src/engine/client/cl_avi.cpp @@ -331,7 +331,7 @@ bool CL_OpenAVIForWriting( const char *fileName ) return false; } - memset( &afd, 0, sizeof( aviFileData_t ) ); + afd = {}; // Don't start if a framerate has not been chosen if ( cl_aviFrameRate->integer <= 0 ) diff --git a/src/engine/client/cl_input.cpp b/src/engine/client/cl_input.cpp index bf32f9069d..a3f9804c70 100644 --- a/src/engine/client/cl_input.cpp +++ b/src/engine/client/cl_input.cpp @@ -696,7 +696,6 @@ CL_CreateCmd */ usercmd_t CL_CreateCmd() { - usercmd_t cmd; vec3_t oldAngles; VectorCopy( cl.viewangles, oldAngles ); @@ -704,7 +703,7 @@ usercmd_t CL_CreateCmd() // keyboard angle adjustment CL_AdjustAngles(); - memset( &cmd, 0, sizeof( cmd ) ); + usercmd_t cmd{}; CL_CmdButtons( &cmd ); @@ -872,7 +871,6 @@ void CL_WritePacket() byte data[ MAX_MSGLEN ]; int j; usercmd_t *cmd, *oldcmd; - usercmd_t nullcmd; int packetNum; int oldPacketNum; int count; @@ -883,7 +881,7 @@ void CL_WritePacket() return; } - memset( &nullcmd, 0, sizeof( nullcmd ) ); + usercmd_t nullcmd{}; oldcmd = &nullcmd; MSG_Init( &buf, data, sizeof( data ) ); diff --git a/src/engine/client/cl_main.cpp b/src/engine/client/cl_main.cpp index 9a98915385..6cd176e3ea 100644 --- a/src/engine/client/cl_main.cpp +++ b/src/engine/client/cl_main.cpp @@ -427,8 +427,7 @@ void CL_Record(std::string demo_name) } // baselines - entityState_t nullstate; - memset( &nullstate, 0, sizeof( nullstate ) ); + entityState_t nullstate{}; for ( int i = 0; i < MAX_GENTITIES; i++ ) { @@ -2292,7 +2291,7 @@ void CL_ShutdownRef() } re.Shutdown( true ); - memset( &re, 0, sizeof( re ) ); + re = {}; } //=========================================================================================== diff --git a/src/engine/client/cl_parse.cpp b/src/engine/client/cl_parse.cpp index 156997fbbb..abb8b40a3c 100644 --- a/src/engine/client/cl_parse.cpp +++ b/src/engine/client/cl_parse.cpp @@ -397,7 +397,6 @@ void CL_ParseGamestate( msg_t *msg ) int i; entityState_t *es; int newnum; - entityState_t nullstate; int cmd; Con_Close(); @@ -441,7 +440,7 @@ void CL_ParseGamestate( msg_t *msg ) Sys::Drop( "Baseline number out of range: %i", newnum ); } - memset( &nullstate, 0, sizeof( nullstate ) ); + entityState_t nullstate{}; es = &cl.entityBaselines[ newnum ]; MSG_ReadDeltaEntity( msg, &nullstate, es, newnum ); } diff --git a/src/engine/client/cl_serverlist.cpp b/src/engine/client/cl_serverlist.cpp index 97da3daa0e..65edeade2a 100644 --- a/src/engine/client/cl_serverlist.cpp +++ b/src/engine/client/cl_serverlist.cpp @@ -677,7 +677,6 @@ void CL_LocalServers_f() { const char *message; int i, j; - netadr_t to; serverInfoLog.Verbose( "Scanning for servers on the local network…" ); @@ -688,11 +687,11 @@ void CL_LocalServers_f() for ( i = 0; i < MAX_OTHER_SERVERS; i++ ) { bool b = cls.localServers[ i ].visible; - memset( &cls.localServers[ i ], 0, sizeof( cls.localServers[ i ] ) ); + cls.localServers[ i ] = {}; cls.localServers[ i ].visible = b; } - memset( &to, 0, sizeof( to ) ); + netadr_t to{}; // The 'xxx' in the message is a challenge that will be echoed back // by the server. We don't care about that here, but master servers @@ -954,7 +953,6 @@ CL_Ping_f */ void CL_Ping_f() { - netadr_t to; ping_t *pingptr; const char *server; int argc; @@ -990,7 +988,7 @@ void CL_Ping_f() server = Cmd_Argv( 2 ); } - memset( &to, 0, sizeof( netadr_t ) ); + netadr_t to{}; if ( !NET_StringToAdr( server, &to, family ) ) { diff --git a/src/engine/client/cl_serverstatus.cpp b/src/engine/client/cl_serverstatus.cpp index 101f8ee424..0a5766ac87 100644 --- a/src/engine/client/cl_serverstatus.cpp +++ b/src/engine/client/cl_serverstatus.cpp @@ -285,7 +285,7 @@ CL_ServerStatus_f */ void CL_ServerStatus_f() { - netadr_t to, *toptr = nullptr; + netadr_t *toptr = nullptr; const char *server; serverStatus_t *serverStatus; int argc; @@ -307,7 +307,7 @@ void CL_ServerStatus_f() if ( !toptr ) { - memset( &to, 0, sizeof( netadr_t ) ); + netadr_t to{}; if ( argc == 2 ) { diff --git a/src/engine/framework/Rcon.cpp b/src/engine/framework/Rcon.cpp index c18e32c785..f250b5cb0e 100644 --- a/src/engine/framework/Rcon.cpp +++ b/src/engine/framework/Rcon.cpp @@ -47,10 +47,8 @@ Message::Message( const netadr_t& remote, std::string command, {} Message::Message( std::string error_message ) - : secure(Secure::Invalid), error(std::move(error_message)) -{ - memset(&remote, 0, sizeof(remote)); -} + : secure(Secure::Invalid), remote{}, error(std::move(error_message)) +{} bool Message::Valid(std::string *invalid_reason) const diff --git a/src/engine/framework/VirtualMachine.cpp b/src/engine/framework/VirtualMachine.cpp index 6e08dd3a30..ca127424dd 100644 --- a/src/engine/framework/VirtualMachine.cpp +++ b/src/engine/framework/VirtualMachine.cpp @@ -136,15 +136,13 @@ static std::pair InternalLoadModule(std::paircursize - offset; buffer = mbuf->data + offset; @@ -488,7 +487,7 @@ void Huff_Decompress( msg_t *mbuf, int offset ) return; } - memset( &huff, 0, sizeof( huff_t ) ); + huff_t huff{}; // Initialize the tree & list with the NYT node huff.tree = huff.lhead = huff.ltail = huff.loc[ NYT ] = & ( huff.nodeList[ huff.blocNode++ ] ); huff.tree->symbol = NYT; @@ -545,7 +544,6 @@ void Huff_Compress( msg_t *mbuf, int offset ) int i, ch, size; byte seq[ 65536 ]; byte *buffer; - huff_t huff; size = mbuf->cursize - offset; buffer = mbuf->data + +offset; @@ -555,7 +553,7 @@ void Huff_Compress( msg_t *mbuf, int offset ) return; } - memset( &huff, 0, sizeof( huff_t ) ); + huff_t huff{}; // Add the NYT (not yet transmitted) node into the tree/list */ huff.tree = huff.lhead = huff.loc[ NYT ] = & ( huff.nodeList[ huff.blocNode++ ] ); huff.tree->symbol = NYT; @@ -584,8 +582,8 @@ void Huff_Compress( msg_t *mbuf, int offset ) void Huff_Init( huffman_t *huff ) { - memset( &huff->compressor, 0, sizeof( huff_t ) ); - memset( &huff->decompressor, 0, sizeof( huff_t ) ); + ResetStruct( huff->compressor ); + ResetStruct( huff->decompressor ); // Initialize the tree & list with the NYT node huff->decompressor.tree = huff->decompressor.lhead = huff->decompressor.ltail = huff->decompressor.loc[ NYT ] = diff --git a/src/engine/qcommon/msg.cpp b/src/engine/qcommon/msg.cpp index 2f92bb2a22..c2a8308607 100644 --- a/src/engine/qcommon/msg.cpp +++ b/src/engine/qcommon/msg.cpp @@ -57,7 +57,7 @@ void MSG_Init( msg_t *buf, byte *data, int length ) MSG_initHuffman(); } - memset( buf, 0, sizeof( *buf ) ); + *buf = {}; buf->data = data; buf->maxsize = length; } @@ -69,7 +69,7 @@ void MSG_InitOOB( msg_t *buf, byte *data, int length ) MSG_initHuffman(); } - memset( buf, 0, sizeof( *buf ) ); + *buf = {}; buf->data = data; buf->maxsize = length; buf->oob = true; @@ -1088,7 +1088,7 @@ void MSG_ReadDeltaEntity( msg_t *msg, const entityState_t *from, entityState_t * // check for a remove if ( MSG_ReadBits( msg, 1 ) == 1 ) { - memset( to, 0, sizeof( *to ) ); + *to = {}; to->number = MAX_GENTITIES - 1; if ( cl_shownet && ( cl_shownet->integer >= 2 || cl_shownet->integer == -1 ) ) diff --git a/src/engine/qcommon/net_chan.cpp b/src/engine/qcommon/net_chan.cpp index 918de29f78..ea534a2675 100644 --- a/src/engine/qcommon/net_chan.cpp +++ b/src/engine/qcommon/net_chan.cpp @@ -104,7 +104,7 @@ called to open a channel to a remote system */ void Netchan_Setup( netsrc_t sock, netchan_t *chan, const netadr_t& adr, int qport ) { - memset( chan, 0, sizeof( *chan ) ); + ResetStruct( *chan ); chan->sock = sock; chan->remoteAddress = adr; @@ -476,7 +476,7 @@ bool NET_GetLoopPacket( netsrc_t sock, netadr_t *net_from, msg_t *net_mes memcpy( net_message->data, loop->msgs[ i ].data, loop->msgs[ i ].datalen ); net_message->cursize = loop->msgs[ i ].datalen; - memset( net_from, 0, sizeof( *net_from ) ); + *net_from = {}; net_from->type = netadrtype_t::NA_LOOPBACK; return true; } diff --git a/src/engine/renderer/tr_backend.cpp b/src/engine/renderer/tr_backend.cpp index ccca11bf23..92ede239f2 100644 --- a/src/engine/renderer/tr_backend.cpp +++ b/src/engine/renderer/tr_backend.cpp @@ -2269,7 +2269,7 @@ static void RB_RenderInteractionsShadowMapped() else { // set up the transformation matrix - memset( &backEnd.orientation, 0, sizeof( backEnd.orientation ) ); + backEnd.orientation = {}; backEnd.orientation.axis[ 0 ][ 0 ] = 1; backEnd.orientation.axis[ 1 ][ 1 ] = 1; @@ -2448,7 +2448,7 @@ static void RB_RenderInteractionsShadowMapped() else { // set up the transformation matrix - memset( &backEnd.orientation, 0, sizeof( backEnd.orientation ) ); + backEnd.orientation = {}; backEnd.orientation.axis[ 0 ][ 0 ] = 1; backEnd.orientation.axis[ 1 ][ 1 ] = 1; diff --git a/src/engine/renderer/tr_bsp.cpp b/src/engine/renderer/tr_bsp.cpp index b3711a8073..aa0cfd7e18 100644 --- a/src/engine/renderer/tr_bsp.cpp +++ b/src/engine/renderer/tr_bsp.cpp @@ -3381,7 +3381,7 @@ static void R_CreateWorldVBO() } vboSurf = ( srfVBOMesh_t * ) ri.Hunk_Alloc( sizeof( *vboSurf ), ha_pref::h_low ); - memset( vboSurf, 0, sizeof( *vboSurf ) ); + *vboSurf = {}; vboSurf->surfaceType = surfaceType_t::SF_VBO_MESH; vboSurf->numIndexes = surfIndexes; @@ -3649,12 +3649,9 @@ static void R_LoadNodesAndLeafs( lump_t *nodeLump, lump_t *leafLump ) dleaf_t *inLeaf; bspNode_t *out; int numNodes, numLeafs; - vboData_t data; Log::Debug("...loading nodes and leaves" ); - memset( &data, 0, sizeof( data ) ); - in = ( dnode_t * ) ( void * )( fileBase + nodeLump->fileofs ); if ( nodeLump->filelen % sizeof( dnode_t ) || leafLump->filelen % sizeof( dleaf_t ) ) @@ -6513,7 +6510,6 @@ void R_BuildCubeMaps() { int i; int ii, jj; - refdef_t rf; bool flipx; bool flipy; int x, y, xy, xy2; @@ -6535,7 +6531,7 @@ void R_BuildCubeMaps() startTime = ri.Milliseconds(); - memset( &rf, 0, sizeof( refdef_t ) ); + refdef_t rf{}; for ( i = 0; i < 6; i++ ) { @@ -6910,7 +6906,7 @@ void RE_LoadWorldMap( const char *name ) tr.worldDeluxeMapping = false; tr.worldHDR_RGBE = false; - memset( &s_worldData, 0, sizeof( s_worldData ) ); + s_worldData = {}; Q_strncpyz( s_worldData.name, name, sizeof( s_worldData.name ) ); Q_strncpyz( s_worldData.baseName, COM_SkipPath( s_worldData.name ), sizeof( s_worldData.name ) ); diff --git a/src/engine/renderer/tr_cmds.cpp b/src/engine/renderer/tr_cmds.cpp index 4217be798b..1db76fd5e0 100644 --- a/src/engine/renderer/tr_cmds.cpp +++ b/src/engine/renderer/tr_cmds.cpp @@ -35,8 +35,8 @@ void R_PerformanceCounters() if ( !r_speeds->integer ) { // clear the counters even if we aren't printing - memset( &tr.pc, 0, sizeof( tr.pc ) ); - memset( &backEnd.pc, 0, sizeof( backEnd.pc ) ); + tr.pc = {}; + backEnd.pc = {}; return; } @@ -117,8 +117,8 @@ void R_PerformanceCounters() tr.pc.c_decalSurfacesCreated ); } - memset( &tr.pc, 0, sizeof( tr.pc ) ); - memset( &backEnd.pc, 0, sizeof( backEnd.pc ) ); + tr.pc = {}; + backEnd.pc = {}; } /* diff --git a/src/engine/renderer/tr_curve.cpp b/src/engine/renderer/tr_curve.cpp index af3405514e..2d53d824e4 100644 --- a/src/engine/renderer/tr_curve.cpp +++ b/src/engine/renderer/tr_curve.cpp @@ -440,7 +440,7 @@ static srfGridMesh_t *R_CreateSurfaceGridMesh( int width, int height, else { grid = (srfGridMesh_t*) ri.Hunk_Alloc( size, ha_pref::h_low ); - memset( grid, 0, size ); + *grid = {}; grid->widthLodError = (float*) ri.Hunk_Alloc( width * 4, ha_pref::h_low ); std::copy_n( errorTable[ 0 ], width, grid->widthLodError ); diff --git a/src/engine/renderer/tr_font.cpp b/src/engine/renderer/tr_font.cpp index 30d2995d35..8c657fc02d 100644 --- a/src/engine/renderer/tr_font.cpp +++ b/src/engine/renderer/tr_font.cpp @@ -174,7 +174,7 @@ static glyphInfo_t *RE_ConstructGlyphInfo( unsigned char *imageOut, int *xOut, i float scaledWidth, scaledHeight; FT_Bitmap *bitmap = nullptr; - memset( &glyph, 0, sizeof( glyphInfo_t ) ); + glyph = {}; // make sure everything is here if ( face != nullptr ) @@ -636,7 +636,7 @@ fontInfo_t* RE_RegisterFont( const char *fontName, int pointSize ) } fontInfo_t* font = ®isteredFont[ fontNo ]; - memset( font, 0, sizeof( fontInfo_t ) ); + ResetStruct( *font ); len = ri.FS_ReadFile( fileName, nullptr ); @@ -776,7 +776,7 @@ void RE_UnregisterFont_Internal( fontHandle_t handle ) } } - memset( ®isteredFont[ handle ], 0, sizeof( fontInfo_t ) ); + ResetStruct( registeredFont[ handle ] ); } void RE_UnregisterFont( fontInfo_t *font ) diff --git a/src/engine/renderer/tr_image.cpp b/src/engine/renderer/tr_image.cpp index 077b42e100..05e494d025 100644 --- a/src/engine/renderer/tr_image.cpp +++ b/src/engine/renderer/tr_image.cpp @@ -1298,7 +1298,7 @@ image_t *R_AllocImage( const char *name, bool linkIntoHashTable ) } image = (image_t*) ri.Hunk_Alloc( sizeof( image_t ), ha_pref::h_low ); - memset( image, 0, sizeof( image_t ) ); + *image = {}; glGenTextures( 1, &image->texnum ); diff --git a/src/engine/renderer/tr_image_ktx.cpp b/src/engine/renderer/tr_image_ktx.cpp index a34f3fff37..372949ee11 100644 --- a/src/engine/renderer/tr_image_ktx.cpp +++ b/src/engine/renderer/tr_image_ktx.cpp @@ -768,8 +768,7 @@ void LoadKTX( const char *name, byte **pic, int *width, int *height, void SaveImageKTX( const char *path, image_t *img ) { - KTX_header_t hdr; - memset( &hdr, 0, sizeof(hdr) ); + KTX_header_t hdr{}; memcpy( &hdr.identifier, KTX_identifier, sizeof( KTX_identifier ) ); hdr.endianness = KTX_endianness; diff --git a/src/engine/renderer/tr_init.cpp b/src/engine/renderer/tr_init.cpp index 933e57974f..cd010496ce 100644 --- a/src/engine/renderer/tr_init.cpp +++ b/src/engine/renderer/tr_init.cpp @@ -1569,7 +1569,7 @@ ScreenshotCmd screenshotPNGRegistration("screenshotPNG", ssFormat_t::SSF_PNG, "p Log::Debug("GetRefAPI()" ); - memset( &re, 0, sizeof( re ) ); + re = {}; if ( apiVersion != REF_API_VERSION ) { diff --git a/src/engine/renderer/tr_light.cpp b/src/engine/renderer/tr_light.cpp index 7a642f6550..3278f33dd7 100644 --- a/src/engine/renderer/tr_light.cpp +++ b/src/engine/renderer/tr_light.cpp @@ -687,8 +687,6 @@ void R_SetupLightFrustum( trRefLight_t *light ) if ( light->isStatic ) { - vboData_t data; - R_SyncRenderThread(); tess.multiDrawPrimitives = 0; @@ -698,7 +696,7 @@ void R_SetupLightFrustum( trRefLight_t *light ) Tess_MapVBOs(true); R_TessLight( light ); - memset( &data, 0, sizeof( data ) ); + vboData_t data{}; data.xyz = ( vec3_t * ) ri.Hunk_AllocateTempMemory( tess.numVertexes * sizeof( *data.xyz ) ); for (unsigned i = 0; i < tess.numVertexes; i++ ) diff --git a/src/engine/renderer/tr_main.cpp b/src/engine/renderer/tr_main.cpp index 3b538ec3d9..b7aa5b736c 100644 --- a/src/engine/renderer/tr_main.cpp +++ b/src/engine/renderer/tr_main.cpp @@ -695,7 +695,7 @@ void R_RotateEntityForLight( const trRefEntity_t *ent, const trRefLight_t *light if ( ent->e.reType != refEntityType_t::RT_MODEL ) { - memset( orientation , 0, sizeof( * orientation ) ); + *orientation = {}; orientation ->axis[ 0 ][ 0 ] = 1; orientation ->axis[ 1 ][ 1 ] = 1; @@ -785,7 +785,7 @@ void R_RotateForViewer() { matrix_t transformMatrix; - memset( &tr.orientation, 0, sizeof( tr.orientation ) ); + tr.orientation = {}; tr.orientation.axis[ 0 ][ 0 ] = 1; tr.orientation.axis[ 1 ][ 1 ] = 1; tr.orientation.axis[ 2 ][ 2 ] = 1; diff --git a/src/engine/renderer/tr_model_iqm.cpp b/src/engine/renderer/tr_model_iqm.cpp index 1949e5df78..e937fe8cba 100644 --- a/src/engine/renderer/tr_model_iqm.cpp +++ b/src/engine/renderer/tr_model_iqm.cpp @@ -458,7 +458,6 @@ bool R_LoadIQModel( model_t *mod, const void *buffer, int filesize, IQModel_t *IQModel; IQAnim_t *IQAnim; srfIQModel_t *surface; - vboData_t vboData; float *weightbuf; int *indexbuf; i16vec4_t *qtangentbuf; @@ -805,7 +804,7 @@ bool R_LoadIQModel( model_t *mod, const void *buffer, int filesize, qtangentbuf[ i ] ); } - memset( &vboData, 0, sizeof( vboData ) ); + vboData_t vboData{}; vboData.xyz = (vec3_t *)IQModel->positions; vboData.qtangent = qtangentbuf; diff --git a/src/engine/renderer/tr_model_md3.cpp b/src/engine/renderer/tr_model_md3.cpp index 8a10c2fb4f..dd98ef21c3 100644 --- a/src/engine/renderer/tr_model_md3.cpp +++ b/src/engine/renderer/tr_model_md3.cpp @@ -244,7 +244,6 @@ bool R_LoadMD3( model_t *mod, int lod, const void *buffer, const char *modName ) // create VBO surfaces from md3 surfaces { srfVBOMDVMesh_t *vboSurf; - vboData_t data; glIndex_t *indexes; int f; @@ -255,7 +254,7 @@ bool R_LoadMD3( model_t *mod, int lod, const void *buffer, const char *modName ) for ( i = 0, surf = mdvModel->surfaces; i < mdvModel->numSurfaces; i++, surf++ ) { //allocate temp memory for vertex data - memset( &data, 0, sizeof( data ) ); + vboData_t data{}; data.xyz = ( vec3_t * ) ri.Hunk_AllocateTempMemory( sizeof( *data.xyz ) * mdvModel->numFrames * surf->numVerts ); data.qtangent = ( i16vec4_t * ) ri.Hunk_AllocateTempMemory( sizeof( i16vec4_t ) * mdvModel->numFrames * surf->numVerts ); data.numFrames = mdvModel->numFrames; diff --git a/src/engine/renderer/tr_model_md5.cpp b/src/engine/renderer/tr_model_md5.cpp index bba9ba0958..22cf3e09b9 100644 --- a/src/engine/renderer/tr_model_md5.cpp +++ b/src/engine/renderer/tr_model_md5.cpp @@ -103,7 +103,6 @@ bool R_LoadMD5( model_t *mod, const char *buffer, const char *modName ) matrix_t boneMat; int numBoneReferences; - int boneReferences[ MAX_BONES ]; buf_p = ( char * ) buffer; @@ -605,7 +604,7 @@ bool R_LoadMD5( model_t *mod, const char *buffer, const char *modName ) while ( numRemaining ) { numBoneReferences = 0; - memset( boneReferences, 0, sizeof( boneReferences ) ); + int boneReferences[ MAX_BONES ]{}; vboTriangles.resize( 0 ); diff --git a/src/engine/renderer/tr_model_skel.cpp b/src/engine/renderer/tr_model_skel.cpp index 86a60ba0e1..1267e41e8f 100644 --- a/src/engine/renderer/tr_model_skel.cpp +++ b/src/engine/renderer/tr_model_skel.cpp @@ -99,7 +99,6 @@ void R_AddSurfaceToVBOSurfacesList( int j; int vertexesNum; - vboData_t data; int indexesNum; glIndex_t *indexes; @@ -120,7 +119,7 @@ void R_AddSurfaceToVBOSurfacesList( vboSurf->numIndexes = indexesNum; vboSurf->numVerts = vertexesNum; - memset( &data, 0, sizeof( data ) ); + vboData_t data{}; data.xyz = ( vec3_t * ) ri.Hunk_AllocateTempMemory( sizeof( *data.xyz ) * vertexesNum ); data.qtangent = ( i16vec4_t * ) ri.Hunk_AllocateTempMemory( sizeof( i16vec4_t ) * vertexesNum ); diff --git a/src/engine/renderer/tr_scene.cpp b/src/engine/renderer/tr_scene.cpp index 951cc720c9..f64ec6d748 100644 --- a/src/engine/renderer/tr_scene.cpp +++ b/src/engine/renderer/tr_scene.cpp @@ -473,7 +473,6 @@ to handle mirrors, */ void RE_RenderScene( const refdef_t *fd ) { - viewParms_t parms; int startTime; if ( !tr.registered ) @@ -584,7 +583,7 @@ void RE_RenderScene( const refdef_t *fd ) // The refdef takes 0-at-the-top y coordinates, so // convert to GL's 0-at-the-bottom space // - memset( &parms, 0, sizeof( parms ) ); + viewParms_t parms{}; if ( tr.refdef.pixelTarget == nullptr ) { @@ -709,7 +708,7 @@ qhandle_t RE_RegisterVisTest() } ASSERT ( !test->registered ); - memset( test, 0, sizeof( *test ) ); + *test = {}; test->registered = true; tr.numVisTests++; diff --git a/src/engine/renderer/tr_shader.cpp b/src/engine/renderer/tr_shader.cpp index 86815fdfc7..22fc4bb1e6 100644 --- a/src/engine/renderer/tr_shader.cpp +++ b/src/engine/renderer/tr_shader.cpp @@ -6951,7 +6951,7 @@ static void ScanAndLoadShaderFiles() bool alreadyCreated; // zeroes shader table, booleans can be assumed as false - memset( &table, 0, sizeof( table ) ); + table = {}; token = COM_ParseExt2( &p, true ); diff --git a/src/engine/renderer/tr_vbo.cpp b/src/engine/renderer/tr_vbo.cpp index 0ff34b113c..c30108d7b2 100644 --- a/src/engine/renderer/tr_vbo.cpp +++ b/src/engine/renderer/tr_vbo.cpp @@ -520,7 +520,7 @@ VBO_t *R_CreateDynamicVBO( const char *name, int numVertexes, uint32_t stateBits R_SyncRenderThread(); vbo = (VBO_t*) ri.Hunk_Alloc( sizeof( *vbo ), ha_pref::h_low ); - memset( vbo, 0, sizeof( *vbo ) ); + *vbo = {}; tr.vbos.push_back( vbo ); @@ -571,7 +571,7 @@ VBO_t *R_CreateStaticVBO( const char *name, vboData_t data, vboLayout_t layout ) R_SyncRenderThread(); VBO_t *vbo = (VBO_t*) ri.Hunk_Alloc( sizeof( *vbo ), ha_pref::h_low ); - memset( vbo, 0, sizeof( *vbo ) ); + *vbo = {}; tr.vbos.push_back( vbo ); @@ -635,7 +635,7 @@ VBO_t *R_CreateStaticVBO2( const char *name, int numVertexes, shaderVertex_t *ve R_SyncRenderThread(); vbo = ( VBO_t * ) ri.Hunk_Alloc( sizeof( *vbo ), ha_pref::h_low ); - memset( vbo, 0, sizeof( *vbo ) ); + *vbo = {}; tr.vbos.push_back( vbo ); @@ -965,7 +965,6 @@ static void R_InitUnitCubeVBO() { vec3_t mins = { -1, -1, -1 }; vec3_t maxs = { 1, 1, 1 }; - vboData_t data; R_SyncRenderThread(); @@ -977,7 +976,7 @@ static void R_InitUnitCubeVBO() Tess_AddCube( vec3_origin, mins, maxs, Color::White ); - memset( &data, 0, sizeof( data ) ); + vboData_t data{}; data.xyz = ( vec3_t * ) ri.Hunk_AllocateTempMemory( tess.numVertexes * sizeof( *data.xyz ) ); data.numVerts = tess.numVertexes; @@ -1020,12 +1019,11 @@ static void R_InitTileVBO() R_SyncRenderThread(); int x, y, w, h; - vboData_t data; w = tr.depthtile2RenderImage->width; h = tr.depthtile2RenderImage->height; - memset( &data, 0, sizeof( data ) ); + vboData_t data{}; data.numVerts = w * h; data.xyz = ( vec3_t * ) ri.Hunk_AllocateTempMemory( data.numVerts * sizeof( *data.xyz ) ); diff --git a/src/engine/server/sv_client.cpp b/src/engine/server/sv_client.cpp index 113e0755e4..2a3decf248 100644 --- a/src/engine/server/sv_client.cpp +++ b/src/engine/server/sv_client.cpp @@ -190,7 +190,7 @@ void SV_DirectConnect( const netadr_t& from, const Cmd::Args& args ) // build a new connection // accept the new client // this is the only place a client_t is ever initialized - memset( new_client, 0, sizeof( client_t ) ); + ResetStruct( *new_client ); int clientNum = new_client - svs.clients; Log::Notice( "Client %i connecting", clientNum ); @@ -336,7 +336,7 @@ the wrong gamestate. void SV_SendClientGameState( client_t *client ) { int start; - entityState_t *base, nullstate; + entityState_t *base; msg_t msg; byte msgBuffer[ MAX_MSGLEN ]; @@ -377,7 +377,7 @@ void SV_SendClientGameState( client_t *client ) } // write the baselines - memset( &nullstate, 0, sizeof( nullstate ) ); + entityState_t nullstate{}; for ( start = 0; start < MAX_GENTITIES; start++ ) { @@ -1279,7 +1279,6 @@ static void SV_UserMove( client_t *cl, msg_t *msg, bool delta ) { int i; int cmdCount; - usercmd_t nullcmd; usercmd_t cmds[ MAX_PACKET_USERCMDS ]; usercmd_t *cmd, *oldcmd; @@ -1306,7 +1305,7 @@ static void SV_UserMove( client_t *cl, msg_t *msg, bool delta ) return; } - memset( &nullcmd, 0, sizeof( nullcmd ) ); + usercmd_t nullcmd{}; oldcmd = &nullcmd; for ( i = 0; i < cmdCount; i++ ) diff --git a/src/engine/server/sv_init.cpp b/src/engine/server/sv_init.cpp index eef7511895..3240048909 100644 --- a/src/engine/server/sv_init.cpp +++ b/src/engine/server/sv_init.cpp @@ -407,7 +407,7 @@ void SV_ClearServer() } } - memset( &sv, 0, sizeof( sv ) ); + ResetStruct( sv ); } /* diff --git a/src/engine/sys/sdl_glimp.cpp b/src/engine/sys/sdl_glimp.cpp index 243744ff4f..d2aaf0daf1 100644 --- a/src/engine/sys/sdl_glimp.cpp +++ b/src/engine/sys/sdl_glimp.cpp @@ -372,8 +372,8 @@ void GLimp_Shutdown() SDL_QuitSubSystem( SDL_INIT_VIDEO ); - memset( &glConfig, 0, sizeof( glConfig ) ); - memset( &glState, 0, sizeof( glState ) ); + ResetStruct( glConfig ); + ResetStruct( glState ); } static void GLimp_Minimize() diff --git a/src/engine/sys/sdl_input.cpp b/src/engine/sys/sdl_input.cpp index b1fb2c432a..9e0f4385d3 100644 --- a/src/engine/sys/sdl_input.cpp +++ b/src/engine/sys/sdl_input.cpp @@ -574,7 +574,7 @@ static void IN_InitJoystick() } stick = nullptr; - memset( &stick_state, '\0', sizeof( stick_state ) ); + stick_state = {}; if ( !in_joystick->integer ) {