DaemonEngine / Daemon

The Dæmon game engine. With some bits of ioq3 and XreaL.
https://unvanquished.net
BSD 3-Clause "New" or "Revised" License
300 stars 60 forks source link

SIGBUS when in tr_model_iqm.cpp when loading iqm model on armhf #736

Open illwieckz opened 1 year ago

illwieckz commented 1 year ago

I don't get the error with Debug build but I get it with both Release and RelWithDebInfo builds, here is a backtrace:

Thread 1 "daemon" received signal SIGBUS, Bus error.
LoadIQMFile (len_names=<synthetic pointer>, mod_name=<optimized out>, filesize=0, buffer=0x1b4f2a8) at Unvanquished/daemon/src/engine/renderer/tr_model_iqm.cpp:281
281         *len_names += strlen( ( char* )IQMPtr( header, header->ofs_text
(gdb) thread apply all backtrace

Thread 7 (Thread 0xc95ff180 (LWP 2313) "daemon"):
#0  futex_abstimed_wait_cancelable (private=0, abstime=0x0, clockid=0, expected=1, futex_word=0x171d864) at ../sysdeps/nptl/futex-internal.h:323
#1  do_futex_wait (sem=sem@entry=0x171d864, abstime=0x0, clockid=0) at sem_waitcommon.c:117
#2  0xf7775c90 in __new_sem_wait_slow (sem=0x171d864, abstime=0x0, clockid=0) at sem_waitcommon.c:285
#3  0xf7b5339e in ?? () from /lib/arm-linux-gnueabihf/libopenal.so.1
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 6 (Thread 0xc99ff180 (LWP 2312) "daemon"):
#0  futex_wait_cancelable (private=0, expected=0, futex_word=0x16855a8) at ../sysdeps/nptl/futex-internal.h:186
#1  __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0xb04, cond=0x1685580) at pthread_cond_wait.c:508
#2  __pthread_cond_wait (cond=0x1685580, mutex=0xb04) at pthread_cond_wait.c:638
#3  0xf73d3864 in pa_threaded_mainloop_wait () from /lib/arm-linux-gnueabihf/libpulse.so.0
#4  0xf7b4dc7a in ?? () from /lib/arm-linux-gnueabihf/libopenal.so.1
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 5 (Thread 0xca331180 (LWP 2311) "threaded-ml"):
#0  __GI___poll (timeout=1197, nfds=3, fds=0xc9a06c58) at ../sysdeps/unix/sysv/linux/poll.c:29
#1  __GI___poll (fds=0xc9a06c58, nfds=3, timeout=1197) at ../sysdeps/unix/sysv/linux/poll.c:26
#2  0xf73d2f90 in ?? () from /lib/arm-linux-gnueabihf/libpulse.so.0
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 3 (Thread 0xf55f0180 (LWP 2309) "daemon"):
#0  0xf77770d4 in __libc_accept (fd=4, addr=addr@entry=..., len=len@entry=0x0) at ../sysdeps/unix/sysv/linux/accept.c:26
#1  0x0054d7de in Sys::ReadSingletonSocket () at Unvanquished/daemon/src/engine/framework/System.cpp:245
#2  0xf78514da in ?? () from /lib/arm-linux-gnueabihf/libstdc++.so.6
#3  0xf776a310 in start_thread (arg=0xf55f0180) at pthread_create.c:477
#4  0xf76ebda8 in ?? () at ../sysdeps/unix/sysv/linux/arm/clone.S:73 from /lib/arm-linux-gnueabihf/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 2 (Thread 0xf62c0180 (LWP 2308) "daemon"):
#0  0xf76acaec in __GI___clock_nanosleep_time64 (clock_id=clock_id@entry=0, flags=flags@entry=0, req=0xf62bf9f8, req@entry=0xf62bf9f0, rem=0xf62bfa08, rem@entry=0xf62bfa00) at ../sysdeps/unix/sysv/linux/clock_nanosleep.c:52
#1  0xf76acbe0 in __GI___clock_nanosleep (clock_id=clock_id@entry=0, flags=flags@entry=0, req=req@entry=0xf62bfa3c, rem=rem@entry=0xf62bfa3c) at ../sysdeps/unix/sysv/linux/clock_nanosleep.c:92
#2  0xf76b3390 in __GI___nanosleep (requested_time=requested_time@entry=0xf62bfa3c, remaining=remaining@entry=0xf62bfa3c) at nanosleep.c:27
#3  0xf76b327c in __sleep (seconds=0, seconds@entry=1000000) at ../sysdeps/posix/sleep.c:55
#4  0x0054d560 in Sys::SignalThread () at Unvanquished/daemon/src/engine/framework/System.cpp:388
#5  0xf78514da in ?? () from /lib/arm-linux-gnueabihf/libstdc++.so.6
#6  0xf776a310 in start_thread (arg=0xf62c0180) at pthread_create.c:477
#7  0xf76ebda8 in ?? () at ../sysdeps/unix/sysv/linux/arm/clone.S:73 from /lib/arm-linux-gnueabihf/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 1 (Thread 0xf62c4080 (LWP 2305) "daemon"):
#0  LoadIQMFile (len_names=<synthetic pointer>, mod_name=<optimized out>, filesize=0, buffer=0x1b4f2a8) at Unvanquished/daemon/src/engine/renderer/tr_model_iqm.cpp:281
#1  R_LoadIQModel (mod=mod@entry=0xd7491420, buffer=0x1b4f2a8, filesize=filesize@entry=3844, mod_name=<optimized out>) at Unvanquished/daemon/src/engine/renderer/tr_model_iqm.cpp:464
#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  LoadIQMFile (len_names=<synthetic pointer>, mod_name=<optimized out>, filesize=0, buffer=0x1b4f2a8)
 at Unvanquished/daemon/src/engine/renderer/tr_model_iqm.cpp:281
illwieckz commented 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
illwieckz commented 1 year ago

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;
illwieckz commented 1 year ago

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.

illwieckz commented 1 year ago

If I build RelWithDebInfo with -Og or -O0 or -O1 instead of -02 it works:

Flag Status
-Og ✔️
-O0 ✔️
-O1 ✔️
-O2 ❌️
-O3 ❌️
-Os ❌️
illwieckz commented 1 year ago

If I only compile src/engine/renderer/tr_model_iqm.cpp with -O1 it works.

illwieckz commented 1 year ago

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.

necessarily-equal commented 1 year ago

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