From 85f513387164ff06369fb1cf28c3bd54f1d047c2 Mon Sep 17 00:00:00 2001 From: Chong Kai Xiong Date: Sat, 25 Feb 2023 02:29:03 +0800 Subject: [PATCH 1/3] Plugins (gforce): Fix GCC 'may be used uninitialized' warnings. --- .../actor/gforce/Common/GeneralTools/XStrList.cpp | 11 +++++------ .../plugins/actor/gforce/Common/UI/LineXX.cpp | 2 +- .../plugins/actor/gforce/Common/io/CEgIStream.cpp | 4 ++-- .../plugins/actor/gforce/GForceCommon/GF_Palette.cpp | 8 +++++--- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/XStrList.cpp b/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/XStrList.cpp index 4d924c995..6db45bb0d 100644 --- a/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/XStrList.cpp +++ b/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/XStrList.cpp @@ -95,13 +95,12 @@ long XStrList::Add( const UtilStr& inStr ) { long XStrList::FetchBestMatch( const UtilStr& inStr ) { - long best, bestScore, score, i; - UtilStr* str; - - best = 0; + long bestScore = 0; + long best = 0; + UtilStr* str; - for ( i = 1; mStrings.Fetch( i, (void**) &str ); i++ ) { - score = str -> LCSMatchScore( inStr ); + for ( long i = 1; mStrings.Fetch( i, (void**) &str ); i++ ) { + long score = str -> LCSMatchScore( inStr ); if ( score > bestScore || i == 1 ) { best = i; bestScore = score; diff --git a/libvisual-plugins/plugins/actor/gforce/Common/UI/LineXX.cpp b/libvisual-plugins/plugins/actor/gforce/Common/UI/LineXX.cpp index 363ac313a..6eb5792ed 100644 --- a/libvisual-plugins/plugins/actor/gforce/Common/UI/LineXX.cpp +++ b/libvisual-plugins/plugins/actor/gforce/Common/UI/LineXX.cpp @@ -137,7 +137,7 @@ halfW = ( tw ) >> 1; if ( tw < 12 ) { - const char* c_shape; + const char* c_shape = nullptr; __circ( tw, c_shape ) for ( j = 0; j < tw; j++ ) { c_x = c_shape[ j ]; diff --git a/libvisual-plugins/plugins/actor/gforce/Common/io/CEgIStream.cpp b/libvisual-plugins/plugins/actor/gforce/Common/io/CEgIStream.cpp index e8ac37d18..f4c3b4035 100644 --- a/libvisual-plugins/plugins/actor/gforce/Common/io/CEgIStream.cpp +++ b/libvisual-plugins/plugins/actor/gforce/Common/io/CEgIStream.cpp @@ -50,7 +50,7 @@ short int CEgIStream::GetShort() { unsigned char CEgIStream::GetByte() { - unsigned char c; + unsigned char c = 0; if ( mIsTied ) { if ( mPos != 0 ) { @@ -74,7 +74,7 @@ unsigned char CEgIStream::GetByte() { unsigned char CEgIStream::PeekByte() { - unsigned char c; + unsigned char c = 0; if ( mIsTied ) { if ( mPos != 0 ) diff --git a/libvisual-plugins/plugins/actor/gforce/GForceCommon/GF_Palette.cpp b/libvisual-plugins/plugins/actor/gforce/GForceCommon/GF_Palette.cpp index 3ae1acc02..130b6baeb 100644 --- a/libvisual-plugins/plugins/actor/gforce/GForceCommon/GF_Palette.cpp +++ b/libvisual-plugins/plugins/actor/gforce/GForceCommon/GF_Palette.cpp @@ -40,8 +40,10 @@ void GF_Palette::Assign( const ArgList& inArgs ) { void GF_Palette::Evaluate( PixPalEntry outPalette[ 256 ] ) { - int i; - float H, S, V, inc = 1.0 / 255.0; + float H = 0.0; + float S = 0.0; + float V = 0.0; + float inc = 1.0 / 255.0; *mIntensity = 0; @@ -50,7 +52,7 @@ void GF_Palette::Evaluate( PixPalEntry outPalette[ 256 ] ) { if ( ! mS_I_Dep ) S = mS.Evaluate(); if ( ! mV_I_Dep ) V = mV.Evaluate(); - for ( i = 0; i < 256; i++, *mIntensity += inc ) { + for ( int i = 0; i < 256; i++, *mIntensity += inc ) { // Don't reevaluate vars that are indep of i if ( mH_I_Dep ) H = mH.Evaluate(); From b6d8b4c296238e47894d9e9b8497a151ab5129af Mon Sep 17 00:00:00 2001 From: Chong Kai Xiong Date: Mon, 27 Jan 2025 04:38:40 +0800 Subject: [PATCH 2/3] Plugins (gforce): Fix type-punning errors. --- .../plugins/actor/gforce/CMakeLists.txt | 2 +- .../Common/GeneralTools/Headers/XFloatList.h | 20 ++++++++++++++++--- .../gforce/Common/GeneralTools/XFloatList.cpp | 6 +++--- .../actor/gforce/Common/io/CEgIStream.cpp | 20 +++++++++++++++---- .../gforce/Common/math/ExprVirtualMachine.cpp | 12 ++++++++--- 5 files changed, 46 insertions(+), 14 deletions(-) diff --git a/libvisual-plugins/plugins/actor/gforce/CMakeLists.txt b/libvisual-plugins/plugins/actor/gforce/CMakeLists.txt index d3e97f05c..e10edda7d 100644 --- a/libvisual-plugins/plugins/actor/gforce/CMakeLists.txt +++ b/libvisual-plugins/plugins/actor/gforce/CMakeLists.txt @@ -2,7 +2,7 @@ SET(GFORCE_SOURCE_DIR ${PROJECT_SOURCE_DIR}/plugins/actor/gforce) SET(GFORCE_DATA_DIR ${LV_PLUGIN_DATA_DIR}/actor/actor_gforce) SET(GFORCE_COMPILE_DEFS UNIX_X _REENTRANT) -SET(GFORCE_COMPILE_OPTIONS -fno-strict-aliasing -Wno-unknown-warning-option -Wno-sometimes-uninitialized) +SET(GFORCE_COMPILE_OPTIONS -Werror) # Required on GCC but not Clang for some reason. IF(NOT MINGW) diff --git a/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/Headers/XFloatList.h b/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/Headers/XFloatList.h index c78f08bdc..a84a9e6bf 100644 --- a/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/Headers/XFloatList.h +++ b/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/Headers/XFloatList.h @@ -4,9 +4,23 @@ // by Andrew O'Meara #include "XPtrList.h" +#include class XLongList; +inline float void_ptr_to_float(const void* value) +{ + float result; + memcpy( &result, &value, sizeof( result ) ); + return result; +} + +inline void* float_to_void_ptr(float value) +{ + void* result = 0; + memcpy( &result, &value, sizeof( value ) ); + return result; +} class XFloatList { @@ -14,11 +28,11 @@ class XFloatList { XFloatList( ListOrderingT inOrdering = cOrderNotImportant ); // See XPtrList.h for ListOrderingT choices // See XPtrList.h for description of functions. - virtual long Add( float inNum ) { return mList.Add( *((void**) &inNum) ); } + virtual long Add( float inNum ) { return mList.Add( float_to_void_ptr( inNum ) ); } virtual void Add( const XFloatList& inList ) { mList.Add( inList.mList ); } virtual bool RemoveElement( long inIndex ) { return mList.RemoveElement( inIndex ); } virtual void RemoveAll() { mList.RemoveAll(); } - virtual float Fetch( long inIndex ) { long t = (long) mList.Fetch( inIndex ); return *((float*) &t);} + virtual float Fetch( long inIndex ) { return void_ptr_to_float( mList.Fetch( inIndex ) ); } virtual bool Fetch( long inIndex, float* ioPtrDest ) const { return mList.Fetch( inIndex, (void**)ioPtrDest ); } virtual long Count() const { return mList.Count(); } @@ -36,7 +50,7 @@ class XFloatList { // Smoothes all the floats in this list void GaussSmooth( float inSigma ); - float operator[] ( const long inIndex ) { long t = (long) mList.Fetch( inIndex ); return *((float*) &t); } + float operator[] ( const long inIndex ) { return void_ptr_to_float(mList.Fetch( inIndex )); } // Generic utility fcn to gauss-smooth a 1D curve. static void GaussSmooth( float inSigma, long inN, float inSrceDest[] ); diff --git a/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/XFloatList.cpp b/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/XFloatList.cpp index 0751dfb73..a4be95d00 100644 --- a/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/XFloatList.cpp +++ b/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/XFloatList.cpp @@ -64,7 +64,7 @@ void XFloatList::FindMeans( long inNumMeans, float outMeans[], float inSigmaScal // If this a local max. (Note: this could/should be improved for neighbors that are equal) if ( ( cen > left && cen >= right ) ) { - sepCandidates.Put( i, *((void**) &cen) ); + sepCandidates.Put( i, float_to_void_ptr( cen ) ); } } @@ -284,7 +284,7 @@ void XFloatList::Rank( XLongList& outRank, long inNumToRank ) const { int XFloatList::sQSFloatComparitor( const void* inA, const void* inB ) { - float diff = *((float*) inB) - *((float*) inA); + float diff = void_ptr_to_float(inB) - void_ptr_to_float(inA); if ( diff > 0.0 ) return 1; else if ( diff < 0.0 ) @@ -296,7 +296,7 @@ int XFloatList::sQSFloatComparitor( const void* inA, const void* inB ) { int XFloatList::sFloatComparitor( const void* inA, const void* inB ) { - float diff = *((float*) &inB) - *((float*) &inA); + float diff = void_ptr_to_float(inA) - void_ptr_to_float(inB); if ( diff > 0.0 ) return 1; else if ( diff < 0.0 ) diff --git a/libvisual-plugins/plugins/actor/gforce/Common/io/CEgIStream.cpp b/libvisual-plugins/plugins/actor/gforce/Common/io/CEgIStream.cpp index f4c3b4035..9dcb7c69a 100644 --- a/libvisual-plugins/plugins/actor/gforce/Common/io/CEgIStream.cpp +++ b/libvisual-plugins/plugins/actor/gforce/Common/io/CEgIStream.cpp @@ -1,6 +1,6 @@ #include "CEgIStream.h" - -//#include +#include +#include UtilStr CEgIStream::sTemp; @@ -32,8 +32,20 @@ long CEgIStream::GetLong() { float CEgIStream::GetFloat() { - long v = GetLong(); - return *( (float*) &v ); + uint32_t c, n = GetByte(); + + c = GetByte(); + n = n | ( c << 8 ); + + c = GetByte(); + n = n | ( c << 16 ); + + c = GetByte(); + n = n | ( c << 24 ); + + float result; + memcpy(&result, &n, sizeof(result)); + return result; } diff --git a/libvisual-plugins/plugins/actor/gforce/Common/math/ExprVirtualMachine.cpp b/libvisual-plugins/plugins/actor/gforce/Common/math/ExprVirtualMachine.cpp index 48487a260..d14c720f5 100644 --- a/libvisual-plugins/plugins/actor/gforce/Common/math/ExprVirtualMachine.cpp +++ b/libvisual-plugins/plugins/actor/gforce/Common/math/ExprVirtualMachine.cpp @@ -21,7 +21,7 @@ #include #include #include - +#include #define __addInst( opcode, data16 ) long op = (opcode) | (data16); \ mProgram.Append( &op, sizeof(long) ); @@ -85,8 +85,8 @@ ExprUserFcn ExprVirtualMachine::sZeroFcn = { 0, { 0 } }; case cABS: r = fabs( r ); break; \ case cSIN: r = sin( r ); break; \ case cCOS: r = cos( r ); break; \ - case cSEED: i = *((long*) &r); \ - size = i % 31; \ + case cSEED: i = pun_float_to_int32( r ); \ + size = i % 31; \ srand( ( i << size ) | ( i >> ( 32 - size ) ) ); break; \ case cTAN: r = tan( r ); break; \ case cSGN: r = ( r >= 0 ) ? 1 : -1; break; \ @@ -114,6 +114,12 @@ ExprUserFcn ExprVirtualMachine::sZeroFcn = { 0, { 0 } }; case '%': { long tt = r2; r1 = (tt != 0) ? (( (long) r1 ) % tt) : 0.0; break; } \ } +int32_t pun_float_to_int32(float x) { + int32_t result = 0; + memcpy( &result, &x, sizeof( result ) ); + return result; +} + ExprVirtualMachine::ExprVirtualMachine() { mPCStart = 0; mPCEnd = 0; From c11eaca8222a9787374b1f1f9951ec9944cb976f Mon Sep 17 00:00:00 2001 From: Chong Kai Xiong Date: Wed, 29 Jan 2025 21:46:18 +0800 Subject: [PATCH 3/3] Plugins (Build): Build G-Force plugin only if floats are 32-bit. --- libvisual-plugins/CMakeLists.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libvisual-plugins/CMakeLists.txt b/libvisual-plugins/CMakeLists.txt index e963fca73..ab7c78990 100644 --- a/libvisual-plugins/CMakeLists.txt +++ b/libvisual-plugins/CMakeLists.txt @@ -76,6 +76,8 @@ CHECK_FUNCTION_EXISTS(mmap HAVE_MMAP) CHECK_FUNCTION_EXISTS(mremap HAVE_MREMAP) #AC_FUNC_MMAP +INCLUDE(CheckTypeSize) + # Assembly #AM_PROG_AS @@ -215,6 +217,14 @@ IF(ENABLE_GOOM2K4) ENDIF() ENDIF() +IF(ENABLE_GFORCE) + CHECK_TYPE_SIZE(float CXX_FLOAT_SIZE LANGUAGE CXX) + IF(NOT CXX_FLOAT_SIZE EQUAL 4) + MESSAGE(WARNING "G-Force requires 32-bit floats.") + SET(ENABLE_GFORCE no) + ENDIF() +ENDIF() + IF(ENABLE_GSTREAMER) PKG_CHECK_MODULES(GSTREAMER gstreamer-1.0>=${GST_REQUIRED_VERSION} IMPORTED_TARGET) IF(NOT GSTREAMER_FOUND)