From 77dabef7c7c9dbf26fa379dcf73afd62664f6367 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnther=20Brammer?= Date: Sat, 9 May 2009 03:29:28 +0200 Subject: [PATCH] Fix crash when building with g++ 4.3 or newer This adds a true copy constructor to StdBuf and StdStrBuf. Unfortunately, this constructor is sometimes prefered to the move constructor when it wasn't with older compilers, always referencing the original instead of copying makes the engine crash, and omitting the copy constructor just creates an implicit one which also causes crashes. --- README.linux.txt | 4 +++- README.windows.txt | 32 +++++++++++------------------- autotools/reftotemp.m4 | 2 +- engine/src/C4Console.cpp | 3 +++ engine/src/C4NetIO.cpp | 2 +- engine/src/C4PlayerInfo.cpp | 2 +- engine/src/C4Record.cpp | 6 +++--- engine/src/C4StartupOptionsDlg.cpp | 2 +- standard/inc/Standard.h | 12 +++++++---- standard/inc/StdBuf.h | 11 ++++++++++ 10 files changed, 44 insertions(+), 32 deletions(-) diff --git a/README.linux.txt b/README.linux.txt index 2d051be1c..861143751 100644 --- a/README.linux.txt +++ b/README.linux.txt @@ -3,7 +3,7 @@ Requirements To build on Linux you need the following packages (Debian names given): -make gcc-4.1 g++-4.1 +make gcc g++ automake autoconf libc6-dev libx11-dev libxxf86vm-dev libxpm-dev libglew1.5-dev libgl1-mesa-dev libpng12-dev libssl-dev libsdl1.2-dev libsdl-mixer1.2-dev libssl-dev @@ -20,6 +20,8 @@ To build from tarball, run this: ./configure 'CXX=g++-4.1' && make +Alternatively, you can use 'CXX=g++ -std=gnu++0x' if you have g++ version 4.3 or newer. + If you want a debug build, pass --enable-debug to configure, for the developer mode --with-gtk. Other options are listed by ./configure --help. diff --git a/README.windows.txt b/README.windows.txt index f6645231c..86be90726 100644 --- a/README.windows.txt +++ b/README.windows.txt @@ -19,8 +19,6 @@ You can build on Windows using either: plus MSYS (or any other shell that can run configure and make) plus DXSDK 9 (if you want DirectX support) this is currently only tested by crosscompiling from Linux. - only g++-4.1 and older can compile clonk, g++-4.2 and newer are incompatible. - NoNetwork ========= @@ -39,37 +37,31 @@ To build using MinGW, you need from http://www.mingw.org/: With MinGW-*.exe, install from the "current" distribution the MinGW base tools and g++, the C++ compiler. Then install msys. -If you want to edit the build files (for example for a new source file), you -need the MSYS DTK, Autoconf 2.6x and Automake 1.10.x. You might need to build -the last two from source. +You also need the MSYS DTK, Autoconf 2.6x and Automake 1.10.x. You might need +to build the last two from source. If you want DirectX support, get a DirectX 9 SDK from Microsoft. Copy the -contents of it's include dir to the include dir of your MinGW installation, +contents of its include dir to the include dir of your MinGW installation, and pass --with-directx to configure below. Open a shell (the MSYS one under windows), cd to this directory, and execute: - ./configure && make + autoreconf -i && ./configure && make -If you want a debugbuild, pass --enable-debug to configure. Other options are -listed by configure --help. +To use g++ version 4.3 or newer, you need to pass 'CXX=g++ -std=gnu++0x' +to configure. g++ version 4.2 is not able to compile Clonk. -If you get an error like "directx/dxfile.h:240: stray '\32' in program", then -delete that char from that file (Whyever someone would want an ASCII 32 in a -header is beyond me). Some editors (SciTE for example) display such unusual -characters instead of representing them with space. +To compile a debugbuild, pass --enable-debug to configure. Other options are +listed by ./configure --help. On subsequent build runs, you only have to execute make. -If you want to edit the build files, pass --enable-maintainer-mode to configure. -When you do that, make will automatically update the build system. - If you want to separate the source directory and the output files, you can call configure from another directory. You can call configure by it's relative path, but using the full path helps gdb find the source files. Example: - mkdir build - cd build - /path/to/clonksource/configure --with-directx CXXFLAGS='-Os' - make + mkdir build + cd build + /path/to/clonksource/configure --with-directx CXXFLAGS='-Os' + make diff --git a/autotools/reftotemp.m4 b/autotools/reftotemp.m4 index e645a40f0..3825e5b84 100644 --- a/autotools/reftotemp.m4 +++ b/autotools/reftotemp.m4 @@ -8,7 +8,7 @@ AC_DEFUN([AX_PROG_CXX_REFTOTEMP], struct Foo { operator Foo & () { return *this; } }; -#ifdef __GXX_EXPERIMENTAL_CXX0X__ +#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) void frobnicate(Foo &&) { } #else void frobnicate(Foo &) { } diff --git a/engine/src/C4Console.cpp b/engine/src/C4Console.cpp index e3d9ec07c..3395c52fc 100644 --- a/engine/src/C4Console.cpp +++ b/engine/src/C4Console.cpp @@ -93,6 +93,9 @@ namespace { class ImplicitStrBuf: public StdStrBuf { public: ImplicitStrBuf(StdStrBuf RREF Buf2): StdStrBuf(Buf2, false) { } + ImplicitStrBuf(const StdStrBuf & Buf2): StdStrBuf(Buf2) { } + ImplicitStrBuf(ImplicitStrBuf RREF Buf2): StdStrBuf(Buf2) { } + ImplicitStrBuf(const ImplicitStrBuf & Buf2): StdStrBuf(Buf2) { } operator const char *() const { return getData(); } }; diff --git a/engine/src/C4NetIO.cpp b/engine/src/C4NetIO.cpp index 1581513bc..6ec0bba42 100644 --- a/engine/src/C4NetIO.cpp +++ b/engine/src/C4NetIO.cpp @@ -2145,7 +2145,7 @@ void C4NetIOUDP::OnPacket(const C4NetIOPacket &Packet, C4NetIO *pNetIO) // ping? answer without creating a connection if((Packet.getStatus() & 0x7F) == IPID_Ping) { - PacketHdr PingPacket = { IPID_Ping | (Packet.getStatus() & 0x80), 0 }; + PacketHdr PingPacket = { int8_t(IPID_Ping | (Packet.getStatus() & 0x80)), 0 }; SendDirect(C4NetIOPacket(&PingPacket, sizeof(PingPacket), false, Packet.getAddr())); return; } diff --git a/engine/src/C4PlayerInfo.cpp b/engine/src/C4PlayerInfo.cpp index 6837fbe38..6fd43b8a9 100644 --- a/engine/src/C4PlayerInfo.cpp +++ b/engine/src/C4PlayerInfo.cpp @@ -1709,7 +1709,7 @@ bool C4PlayerInfoList::SetAsRestoreInfos(C4PlayerInfoList &rFromPlayers, bool fS for (int ch = 128; ch < 256; ++ch) { const char* hexChars = "0123456789abcdef"; - char old[] = { ch, 0 }; + char old[] = { char(ch), 0 }; char safe[] = { '%', 'x', 'x', 0 }; safe[1] = hexChars[ch / 16]; safe[2] = hexChars[ch % 16]; diff --git a/engine/src/C4Record.cpp b/engine/src/C4Record.cpp index f4c6d6b1f..df5c0284f 100644 --- a/engine/src/C4Record.cpp +++ b/engine/src/C4Record.cpp @@ -253,10 +253,10 @@ bool C4Record::Rec(int iFrame, const StdBuf &sBuf, C4RecordChunkType eType) while(iFrame > iLastFrame + 0xff) Rec(iLastFrame + 0xff, StdBuf(), RCT_Frame); // get frame difference - uint32_t iFrameDiff = Max(0, iFrame - iLastFrame); + uint8_t iFrameDiff = Max(0, iFrame - iLastFrame); iLastFrame += iFrameDiff; - // create head - C4RecordChunkHead Head = { iFrameDiff, eType }; + // create head + C4RecordChunkHead Head = { iFrameDiff, uint8_t(eType) }; // pack CtrlRec.Write(&Head, sizeof(Head)); CtrlRec.Write(sBuf.getData(), sBuf.getSize()); diff --git a/engine/src/C4StartupOptionsDlg.cpp b/engine/src/C4StartupOptionsDlg.cpp index 65bbca546..b310bec48 100644 --- a/engine/src/C4StartupOptionsDlg.cpp +++ b/engine/src/C4StartupOptionsDlg.cpp @@ -38,7 +38,7 @@ void C4StartupOptionsDlg::SmallButton::DrawElement(C4TargetFacet &cgo) // draw the button CStdFont &rUseFont = C4Startup::Get()->Graphics.BookFont; // get text pos - int32_t x0 = cgo.TargetX + rcBounds.x, y0 = cgo.TargetY + rcBounds.y, x1 = cgo.TargetX + rcBounds.x + rcBounds.Wdt, y1 = cgo.TargetY + rcBounds.y + rcBounds.Hgt; + float x0 = cgo.TargetX + rcBounds.x, y0 = cgo.TargetY + rcBounds.y, x1 = cgo.TargetX + rcBounds.x + rcBounds.Wdt, y1 = cgo.TargetY + rcBounds.y + rcBounds.Hgt; int32_t iTextHgt = rUseFont.GetLineHeight(); // draw frame uint32_t dwClrHigh = C4StartupBtnBorderColor1, dwClrLow = C4StartupBtnBorderColor2; diff --git a/standard/inc/Standard.h b/standard/inc/Standard.h index 9a6ec5a91..34b87b762 100644 --- a/standard/inc/Standard.h +++ b/standard/inc/Standard.h @@ -81,20 +81,24 @@ typedef __int32 intptr_t; #error Could not find integer datatypes! #endif -#if defined(__GNUC__) && ((__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)) -// Temporary-To-Reference-Fix -#define ALLOW_TEMP_TO_REF(ClassName) operator ClassName & () { return *this; } +#if defined(__GNUC__) // Allow checks for correct printf-usage #define GNUC_FORMAT_ATTRIBUTE __attribute__ ((format (printf, 1, 2))) #define GNUC_FORMAT_ATTRIBUTE_O __attribute__ ((format (printf, 2, 3))) #define GNUC_ALWAYS_INLINE inline __attribute__ ((always_inline)) #else -#define ALLOW_TEMP_TO_REF(ClassName) #define GNUC_FORMAT_ATTRIBUTE #define GNUC_FORMAT_ATTRIBUTE_O #define GNUC_ALWAYS_INLINE inline #endif +// Temporary-To-Reference-Fix +#if defined(__GNUC__) && ((__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)) +#define ALLOW_TEMP_TO_REF(ClassName) operator ClassName & () { return *this; } +#else +#define ALLOW_TEMP_TO_REF(ClassName) +#endif + #if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) // Another temporary-to-reference-fix: this time using C++0x's rvalue references #define RREF && diff --git a/standard/inc/StdBuf.h b/standard/inc/StdBuf.h index b8d667f9c..310897ef9 100644 --- a/standard/inc/StdBuf.h +++ b/standard/inc/StdBuf.h @@ -53,6 +53,14 @@ public: else Ref(Buf2); } + StdBuf(const StdBuf & Buf2, bool fCopy = true) + : fRef(true), pData(NULL), iSize(0) + { + if(fCopy) + Copy(Buf2); + else + Ref(Buf2); + } // Set by constant data. Copies data if desired. StdBuf(const void *pData, size_t iSize, bool fCopy = false) @@ -377,6 +385,9 @@ public: StdStrBuf(StdStrBuf RREF Buf2, bool fCopy = false) : StdBuf(Buf2, fCopy) { } + StdStrBuf(const StdStrBuf & Buf2, bool fCopy = true) + : StdBuf(Buf2, fCopy) + { } // Set by constant data. References data by default, copies if specified. explicit StdStrBuf(const char *pData, bool fCopy = false)