[Scummvm-tracker] [ScummVM :: Bugs] #16397: HPL1: Penumbra crashes on a new game
ScummVM :: Bugs
trac at scummvm.org
Tue Dec 16 15:21:47 UTC 2025
#16397: HPL1: Penumbra crashes on a new game
------------------------+---------------------------------
Reporter: shamazmazum | Owner: (none)
Type: defect | Status: new
Priority: normal | Component: Engine: HPL1
Version: | Resolution:
Keywords: | Game: Penumbra: Overture
------------------------+---------------------------------
Description changed by shamazmazum:
Old description:
> Due to violation of strict aliasing rule, Penumbra: Overture crashes if
> scummvm is build with -O2 (maybe also -O) with clang 19
>
> My environment:
>
> * FreeBSD 15.0
> * clang 19.1.7 (default version in FreeBSD)
>
> How I build
>
> {{{
> $ setenv CXXFLAGS "-O2 -g -fno-strict-aliasing"
> $ ./configure --disable-alsa --disable-nasm --disable-seq-midi --disable-
> tremor --disable-fluidlite --prefix=/home/vasily/test/scummvm3
> $ gmake -j8
> $ gmake install
> }}}
>
> Then I start the game, skip a cutscene and the game crashes:
>
> {{{
> (lldb) target create bin/scummvm --core scummvm.core
> [8578/16640] Manually indexing DWARF: scummvm...
> Core file '/home/vasily/test/scummvm3/scummvm.core' (x86_64) was loaded.
> (lldb) bt
> * thread #1, name = 'scummvm', stop reason = signal SIGBUS
> * frame #0: 0x00000000035e9848
> scummvm`NewtonCreateBody(newtonWorld=0x000004705eae4880,
> collisionPtr=0x000004705eacf300, matrixPtr=0x00000000011362a8) at
> Newton.cpp:4489:11
> frame #1: 0x00000000035307c3
> scummvm`hpl::cPhysicsBodyNewton::cPhysicsBodyNewton(this=0x000004705dfec300,
> asName=<unavailable>, apWorld=0x000004705d431400,
> apShape=0x000004705b4a2900) at PhysicsBodyNewton.cpp:58:17
> frame #2: 0x000000000352e9c2
> scummvm`hpl::cPhysicsWorldNewton::CreateBody(this=0x000004705d431400,
> asName=0x000004705b4991a8, apShape=0x000004705b4a2900) at
> PhysicsWorldNewton.cpp:322:30
> frame #3: 0x00000000034fcd0c
> scummvm`hpl::cMeshLoaderCollada::CreateStaticMeshEntity(this=0x000004705d01dbc0,
> apNode=0x000004705b499180, apWorld=0x000004705b4a1200,
> apGeom=0x000004705eea3300, abInRoomGroup=true,
> avColladaMaterials=<unavailable>, avColladaTextures=0x0000000826b14c50,
> avColladaImages=0x0000000826b14c40) at MeshLoaderCollada.cpp:1417:53
> frame #4: 0x00000000034f5c4d
> scummvm`hpl::cMeshLoaderCollada::AddSectorChildren(this=0x000004705d01dbc0,
> apNode=0x000004705b499180, asSector=<unavailable>,
> apWorld=0x000004705b4a1200, avColladaGeometries=0x0000000826b14c70,
> avColladaLights=0x0000000826b14c80,
> avColladaMaterials=0x0000000826b14c60,
> avColladaTextures=0x0000000826b14c50, avColladaImages=0x0000000826b14c40)
> at MeshLoaderCollada.cpp:2177:29
> frame #5: 0x00000000034f5631
> scummvm`hpl::cMeshLoaderCollada::LoadWorld(this=0x000004705d01dbc0,
> asFile=<unavailable>, apScene=<unavailable>, aFlags=<unavailable>) at
> MeshLoaderCollada.cpp:171:6
> frame #6: 0x0000000003491b9a
> scummvm`hpl::cMeshLoaderHandler::LoadWorld(this=0x000004705d010e90,
> asFile=0x0000000826b14ea0, aFlags=0) at MeshLoaderHandler.cpp:115:20
> frame #7: 0x00000000034d6872
> scummvm`hpl::cScene::LoadWorld3D(this=0x000004705cf5b500,
> asFile=0x000004705ca13110, abLoadScript=true, aFlags=0) at
> Scene.cpp:367:58
> frame #8: 0x00000000035b68b7
> scummvm`cMapHandler::Load(this=0x000004705ca14800,
> asFile=0x000004705ca13110, asStartPos=0x000004705ca13138) at
> MapHandler.cpp:416:22
> frame #9: 0x0000000003593177
> scummvm`cIntroStory::Exit(this=0x000004705d455c00) at
> IntroStory.cpp:505:24
> frame #10: 0x000000000357cf4c
> scummvm`cButtonHandler::Update(this=0x000004705d473870,
> afTimeStep=<unavailable>) at ButtonHandler.cpp:301:26
> frame #11: 0x00000000034dad34
> scummvm`hpl::cUpdater::Update(this=0x000004705b3e96f0,
> afTimeStep=<unavailable>) at Updater.cpp:180:10
> frame #12: 0x000000000342bbcd
> scummvm`hpl::cGame::Run(this=0x00000470582fe300) at Game.cpp:340:15
> frame #13: 0x00000000034257fd
> scummvm`Hpl1::Hpl1Engine::run(this=0x000004705ca1bc00) at hpl1.cpp:76:13
> frame #14: 0x0000000001f49e7e
> scummvm`runGame(enginePlugin=0x0000047057acec20,
> system=0x0000047057a296f0, game=0x0000000826b167f0,
> meDescriptor=0x00000470582bf600) at main.cpp:317:33
> frame #15: 0x0000000001f480f0 scummvm`scummvm_main(argc=1,
> argv=0x0000000826b178d0) at main.cpp:803:13
> frame #16: 0x0000000001f4448e scummvm`main(argc=1,
> argv=0x0000000826b178d0) at posix-main.cpp:44:12
> frame #17: 0x000000083e94337f libc.so.7`__libc_start1(argc=1,
> argv=0x0000000826b178d0, env=0x0000000826b178e0, cleanup=<unavailable>,
> mainX=(scummvm`main at posix-main.cpp:30)) at libc_start1.c:180:7
> frame #18: 0x0000000001f22534 scummvm`_start at crt1_s.S:80
> (lldb) frame select 0
> frame #0: 0x00000000035e9848
> scummvm`NewtonCreateBody(newtonWorld=0x000004705eae4880,
> collisionPtr=0x000004705eacf300, matrixPtr=0x00000000011362a8) at
> Newton.cpp:4489:11
> 4486 SaveCollision(collisionPtr);
> 4487 #endif
> 4488
> -> 4489 dgMatrix matrix(*((const dgMatrix *)matrixPtr));
> 4490 #ifdef _DEBUG
> 4491 // matrix.m_front = matrix.m_front.Scale (dgRsqrt
> (matrix.m_front % matrix.m_front));
> 4492 // matrix.m_right = matrix.m_front * matrix.m_up;
> }}}
>
> For some reason clang ignores -fno-strict-aliasing
>
> When porting Amnesia: The Dark Descent I found the same bug which was
> solved by writing a helper function:
>
> {{{
> static dgMatrix array2matrix(const dFloat *array) {
> dgVector row1(array[0], array[1], array[2], array[3]);
> dgVector row2(array[4], array[5], array[6], array[7]);
> dgVector row3(array[8], array[9], array[10], array[11]);
> dgVector row4(array[12], array[13], array[14], array[15]);
> dgMatrix mat(row1, row2, row3, row4);
>
> return mat;
> }
> }}}
>
> and using this function where unsafe casts were used (in addition to
> -fno-strict-aliasing)
>
> I can try to make a similar patch for Penumbra unless you have better
> ideas.
New description:
Due to violation of strict aliasing rule Penumbra: Overture crashes if
scummvm is build with -O2 (maybe also -O) with clang 19
My environment:
* FreeBSD 15.0
* clang 19.1.7 (default version in FreeBSD)
How I build
{{{
$ setenv CXXFLAGS "-O2 -g -fno-strict-aliasing"
$ ./configure --disable-alsa --disable-nasm --disable-seq-midi --disable-
tremor --disable-fluidlite --prefix=/home/vasily/test/scummvm3
$ gmake -j8
$ gmake install
}}}
Then I start the game, skip a cutscene and the game crashes:
{{{
(lldb) target create bin/scummvm --core scummvm.core
[8578/16640] Manually indexing DWARF: scummvm...
Core file '/home/vasily/test/scummvm3/scummvm.core' (x86_64) was loaded.
(lldb) bt
* thread #1, name = 'scummvm', stop reason = signal SIGBUS
* frame #0: 0x00000000035e9848
scummvm`NewtonCreateBody(newtonWorld=0x000004705eae4880,
collisionPtr=0x000004705eacf300, matrixPtr=0x00000000011362a8) at
Newton.cpp:4489:11
frame #1: 0x00000000035307c3
scummvm`hpl::cPhysicsBodyNewton::cPhysicsBodyNewton(this=0x000004705dfec300,
asName=<unavailable>, apWorld=0x000004705d431400,
apShape=0x000004705b4a2900) at PhysicsBodyNewton.cpp:58:17
frame #2: 0x000000000352e9c2
scummvm`hpl::cPhysicsWorldNewton::CreateBody(this=0x000004705d431400,
asName=0x000004705b4991a8, apShape=0x000004705b4a2900) at
PhysicsWorldNewton.cpp:322:30
frame #3: 0x00000000034fcd0c
scummvm`hpl::cMeshLoaderCollada::CreateStaticMeshEntity(this=0x000004705d01dbc0,
apNode=0x000004705b499180, apWorld=0x000004705b4a1200,
apGeom=0x000004705eea3300, abInRoomGroup=true,
avColladaMaterials=<unavailable>, avColladaTextures=0x0000000826b14c50,
avColladaImages=0x0000000826b14c40) at MeshLoaderCollada.cpp:1417:53
frame #4: 0x00000000034f5c4d
scummvm`hpl::cMeshLoaderCollada::AddSectorChildren(this=0x000004705d01dbc0,
apNode=0x000004705b499180, asSector=<unavailable>,
apWorld=0x000004705b4a1200, avColladaGeometries=0x0000000826b14c70,
avColladaLights=0x0000000826b14c80, avColladaMaterials=0x0000000826b14c60,
avColladaTextures=0x0000000826b14c50, avColladaImages=0x0000000826b14c40)
at MeshLoaderCollada.cpp:2177:29
frame #5: 0x00000000034f5631
scummvm`hpl::cMeshLoaderCollada::LoadWorld(this=0x000004705d01dbc0,
asFile=<unavailable>, apScene=<unavailable>, aFlags=<unavailable>) at
MeshLoaderCollada.cpp:171:6
frame #6: 0x0000000003491b9a
scummvm`hpl::cMeshLoaderHandler::LoadWorld(this=0x000004705d010e90,
asFile=0x0000000826b14ea0, aFlags=0) at MeshLoaderHandler.cpp:115:20
frame #7: 0x00000000034d6872
scummvm`hpl::cScene::LoadWorld3D(this=0x000004705cf5b500,
asFile=0x000004705ca13110, abLoadScript=true, aFlags=0) at
Scene.cpp:367:58
frame #8: 0x00000000035b68b7
scummvm`cMapHandler::Load(this=0x000004705ca14800,
asFile=0x000004705ca13110, asStartPos=0x000004705ca13138) at
MapHandler.cpp:416:22
frame #9: 0x0000000003593177
scummvm`cIntroStory::Exit(this=0x000004705d455c00) at
IntroStory.cpp:505:24
frame #10: 0x000000000357cf4c
scummvm`cButtonHandler::Update(this=0x000004705d473870,
afTimeStep=<unavailable>) at ButtonHandler.cpp:301:26
frame #11: 0x00000000034dad34
scummvm`hpl::cUpdater::Update(this=0x000004705b3e96f0,
afTimeStep=<unavailable>) at Updater.cpp:180:10
frame #12: 0x000000000342bbcd
scummvm`hpl::cGame::Run(this=0x00000470582fe300) at Game.cpp:340:15
frame #13: 0x00000000034257fd
scummvm`Hpl1::Hpl1Engine::run(this=0x000004705ca1bc00) at hpl1.cpp:76:13
frame #14: 0x0000000001f49e7e
scummvm`runGame(enginePlugin=0x0000047057acec20,
system=0x0000047057a296f0, game=0x0000000826b167f0,
meDescriptor=0x00000470582bf600) at main.cpp:317:33
frame #15: 0x0000000001f480f0 scummvm`scummvm_main(argc=1,
argv=0x0000000826b178d0) at main.cpp:803:13
frame #16: 0x0000000001f4448e scummvm`main(argc=1,
argv=0x0000000826b178d0) at posix-main.cpp:44:12
frame #17: 0x000000083e94337f libc.so.7`__libc_start1(argc=1,
argv=0x0000000826b178d0, env=0x0000000826b178e0, cleanup=<unavailable>,
mainX=(scummvm`main at posix-main.cpp:30)) at libc_start1.c:180:7
frame #18: 0x0000000001f22534 scummvm`_start at crt1_s.S:80
(lldb) frame select 0
frame #0: 0x00000000035e9848
scummvm`NewtonCreateBody(newtonWorld=0x000004705eae4880,
collisionPtr=0x000004705eacf300, matrixPtr=0x00000000011362a8) at
Newton.cpp:4489:11
4486 SaveCollision(collisionPtr);
4487 #endif
4488
-> 4489 dgMatrix matrix(*((const dgMatrix *)matrixPtr));
4490 #ifdef _DEBUG
4491 // matrix.m_front = matrix.m_front.Scale (dgRsqrt
(matrix.m_front % matrix.m_front));
4492 // matrix.m_right = matrix.m_front * matrix.m_up;
}}}
For some reason clang ignores -fno-strict-aliasing
When porting Amnesia: The Dark Descent I found the same bug which was
solved by writing a helper function:
{{{
static dgMatrix array2matrix(const dFloat *array) {
dgVector row1(array[0], array[1], array[2], array[3]);
dgVector row2(array[4], array[5], array[6], array[7]);
dgVector row3(array[8], array[9], array[10], array[11]);
dgVector row4(array[12], array[13], array[14], array[15]);
dgMatrix mat(row1, row2, row3, row4);
return mat;
}
}}}
and using this function where unsafe casts were used (in addition to -fno-
strict-aliasing)
I can try to make a similar patch for Penumbra unless you have better
ideas.
--
--
Ticket URL: <https://bugs.scummvm.org/ticket/16397#comment:1>
ScummVM :: Bugs <https://bugs.scummvm.org>
ScummVM
More information about the Scummvm-tracker
mailing list