Open illwieckz opened 1 year ago
I modified tr_model_iqm.cpp
this way:
diff --git a/src/engine/renderer/tr_model_iqm.cpp b/src/engine/renderer/tr_model_iqm.cpp
index f2a461eb..0c9d3565 100644
--- a/src/engine/renderer/tr_model_iqm.cpp
+++ b/src/engine/renderer/tr_model_iqm.cpp
@@ -84,6 +84,8 @@ static bool LoadIQMFile( void *buffer, unsigned filesize, const char *mod_name,
iqmBounds_t *bounds;
iqmAnim_t *anim;
+ Log::Debug( "R_LoadIQModel: loading %s file", mod_name );
+
if( filesize < sizeof(iqmHeader_t) ) {
Log::Warn("R_LoadIQModel: file size of %s is too small.",
mod_name );
@@ -278,8 +280,10 @@ static bool LoadIQMFile( void *buffer, unsigned filesize, const char *mod_name,
mod_name );
return false;
}
- *len_names += strlen( ( char* )IQMPtr( header, header->ofs_text
- + mesh->name ) ) + 1;
+
+ int offset = header->ofs_text + mesh->name;
+ char* names = ( char* )IQMPtr( header, offset );
+ *len_names += strlen( names ) + 1;
}
// check and swap joints
But now I get the SIGBUS
earlier:
Debug: R_LoadIQMModel: loading models/missiles/lockblob/lockblob.iqm file
]
Thread 1 "daemon" received signal SIGBUS, Bus error.
0x004e2dde in LoadIQMFile (len_names=<synthetic pointer>, mod_name=<optimized out>, filesize=0, buffer=0x1bd4970) at Unvanquished/daemon/src/engine/renderer/tr_model_iqm.cpp:267
267 LL( mesh->material );
(gdb) thread apply all backtrace
Thread 1 (Thread 0xf62c4080 (LWP 2706) "daemon"):
#0 0x004e2dde in LoadIQMFile (len_names=<synthetic pointer>, mod_name=<optimized out>, filesize=0, buffer=0x1bd4970) at Unvanquished/daemon/src/engine/renderer/tr_model_iqm.cpp:267
#1 R_LoadIQModel (mod=mod@entry=0xd7491420, buffer=0x1bd4970, filesize=filesize@entry=3844, mod_name=<optimized out>) at Unvanquished/daemon/src/engine/renderer/tr_model_iqm.cpp:469
#2 0x004e1ac6 in RE_RegisterModel (name=<optimized out>) at Unvanquished/daemon/src/engine/renderer/tr_model.cpp:159
#3 0x00450624 in operator() (handle=@0xfffde670: 0, name="models/missiles/lockblob/lockblob.iqm", __closure=<optimized out>) at Unvanquished/daemon/src/engine/client/cl_cgame.cpp:1236
#4 Util::apply_impl<CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::<lambda(const string&, int&)>, std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, int&>, 0, 1> (tuple=..., func=...) at Unvanquished/daemon/src/common/Util.h:125
#5 Util::apply<CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::<lambda(const string&, int&)>, std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, int&> > (tuple=..., func=...) at Unvanquished/daemon/src/common/Util.h:130
#6 IPC::detail::HandleMsg<CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::<lambda(const string&, int&)>, IPC::Message<IPC::Id<0, 33>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, IPC::Reply<int> >(IPC::Channel &, Util::Reader, struct {...} &&, IPC::SyncMessage<IPC::Message<IPC::Id<0, 33>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, IPC::Reply<int> >) (channel=..., reader=..., func=...) at Unvanquished/daemon/src/common/IPC/Channel.h:217
#7 0x00457904 in IPC::HandleMsg<IPC::SyncMessage<IPC::Message<IPC::Id<0, 33>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, IPC::Reply<int> >, CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::<lambda(const string&, int&)> > (func=..., reader=..., channel=...) at Unvanquished/daemon/src/common/IPC/Channel.h:239
#8 CGameVM::QVMSyscall (this=<optimized out>, syscallNum=<optimized out>, reader=..., channel=...) at Unvanquished/daemon/src/engine/client/cl_cgame.cpp:1235
#9 0x00457f18 in CGameVM::Syscall (this=this@entry=0x6882d8 <cgvm>, id=id@entry=33, reader=..., channel=...) at Unvanquished/daemon/src/engine/client/cl_cgame.cpp:1091
#10 0x00455cbe in VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)1>, int, int, glconfig_t, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u> >, IPC::Reply<> >, int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&>(int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&)::{lambda(unsigned int, Util::Reader)#1}::operator()(unsigned int, Util::Reader) (reader=..., id=33, this=<optimized out>) at Unvanquished/daemon/src/engine/framework/VirtualMachine.h:142
#11 IPC::detail::SendMsg<VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)1>, int, int, glconfig_t, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u> >, IPC::Reply<> >, int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&>(int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&)::{lambda(unsigned int, Util::Reader)#1}&, IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)1>, int, int, glconfig_t, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u> >, IPC::Reply<>, int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&>(IPC::Channel&, VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)1>, int, int, glconfig_t, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u> >, IPC::Reply<> >, int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&>(int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&)::{lambda(unsigned int, Util::Reader)#1}&, IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)1>, int, int, glconfig_t, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u> >, IPC::Reply<> >, int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&) (messageHandler=..., channel=...) at Unvanquished/daemon/src/common/IPC/Channel.h:174
#12 IPC::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)1>, int, int, glconfig_t, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u> >, IPC::Reply<> >, VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)1>, int, int, glconfig_t, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u> >, IPC::Reply<> >, int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&>(int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&)::{lambda(unsigned int, Util::Reader)#1}, int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&>(IPC::Channel&, VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)1>, int, int, glconfig_t, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u> >, IPC::Reply<> >, int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&>(int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&)::{lambda(unsigned int, Util::Reader)#1}&&, int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&) (messageHandler=..., channel=...) at Unvanquished/daemon/src/common/IPC/Channel.h:234
#13 VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)1>, int, int, glconfig_t, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u> >, IPC::Reply<> >, int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&>(int&, int&, glconfig_t&, std::array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 1024u>&) (this=0x6882d8 <cgvm>) at Unvanquished/daemon/src/engine/framework/VirtualMachine.h:140
#14 CGameVM::CGameInit (this=0x6882d8 <cgvm>, serverMessageNum=<optimized out>, clientNum=<optimized out>) at Unvanquished/daemon/src/engine/client/cl_cgame.cpp:1015
#15 0x0045644c in CL_InitCGame () at Unvanquished/daemon/src/engine/client/cl_cgame.cpp:665
#16 0x0045e01a in CL_DownloadsComplete () at Unvanquished/daemon/src/engine/client/cl_download.cpp:109
#17 0x0046c488 in CL_ParseGamestate (msg=msg@entry=0xfffdef14) at Unvanquished/daemon/src/engine/client/cl_parse.cpp:463
#18 0x0046c652 in CL_ParseServerMessage (msg=msg@entry=0xfffdef14) at Unvanquished/daemon/src/engine/client/cl_parse.cpp:573
#19 0x004685f8 in CL_PacketEvent (from=..., msg=msg@entry=0xfffdef14) at Unvanquished/daemon/src/engine/client/cl_main.cpp:2416
#20 0x00421c6c in Com_EventLoop () at Unvanquished/daemon/src/engine/qcommon/common.cpp:433
#21 0x004223a0 in Com_Frame () at Unvanquished/daemon/src/engine/qcommon/common.cpp:1017
#22 0x0041cc0a in main (argc=<optimized out>, argv=<optimized out>) at Unvanquished/daemon/src/engine/framework/System.cpp:753
#0 0x004e2dde in LoadIQMFile (len_names=<synthetic pointer>, mod_name=<optimized out>, filesize=0, buffer=0x1bd4970)
at Unvanquished/daemon/src/engine/renderer/tr_model_iqm.cpp:267
I just modified the file again, just editing the Debug message to also print the detected endianess… and now it crashes in the code I previously split into multiple lines:
Debug: R_LoadIQM: loading models/missiles/lockblob/lockblob.iqm file, 1234
]
Thread 1 "daemon" received signal SIGBUS, Bus error.
LoadIQMFile (len_names=<synthetic pointer>, mod_name=<optimized out>, filesize=25542105, buffer=0x185bd10)
at Unvanquished/daemon/src/engine/renderer/tr_model_iqm.cpp:284
284 int offset = header->ofs_text + mesh->name;
Given the main differences among the builds are:
CMAKE_CXX_FLAGS_RELEASE: -O3 -DNDEBUG
CMAKE_CXX_FLAGS_RELWITHDEBINFO: -O2 -g -DNDEBUG
CMAKE_CXX_FLAGS_DEBUG: -g
I wonder if we hit a compiler optimization bug.
Edit: We also have USE_DEBUG_OPTIMIZE
that sets -Og
when it's a Debug
build.
If I build RelWithDebInfo
with -Og
or -O0
or -O1
instead of -02
it works:
Flag | Status |
---|---|
-Og |
✔️ |
-O0 |
✔️ |
-O1 |
✔️ |
-O2 |
❌️ |
-O3 |
❌️ |
-Os |
❌️ |
If I only compile src/engine/renderer/tr_model_iqm.cpp
with -O1
it works.
Worked around in #739 by enforcing -O1
when compiling src/engine/renderer/tr_model_iqm.cpp
on Linux armhf non-Debug
build.
We may still want to track down the undefined behavior that is probably hiding there and blowing-up up the things on 32-bit arm.
I wonder if this would be enough to solve this problem properly: https://github.com/DaemonEngine/Daemon/compare/master...necessarily-equal:Daemon:prevent-undefined-behavior
I don't get the error with
Debug
build but I get it with bothRelease
andRelWithDebInfo
builds, here is a backtrace: