https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118475

            Bug ID: 118475
           Summary: [15 regression] dosbox-staging-0.82.0 miscompiled?
                    (fails dos_files, shell_cmds tests)
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sjames at gcc dot gnu.org
  Target Milestone: ---

Filing this as we're in stage4 and I'd like to keep track of wrong-code issues
even if I don't have them rundown yet.

dosbox-staging-0.82.0 fails tests since late December but it's not yet clear
why. Two tests crash (dos_files, shell_cmds).

There are a few symptoms:
1) Failures with -O2 (dos_files, shell_cmds)
1a) Heap corruption with glibc's malloc aborting on invalid free, or
1b) Crash in libstdc++

```
Thread 1 "dos_files" received signal SIGSEGV, Segmentation fault.
0x0000000000796076 in __gnu_cxx::__exchange_and_add (__mem=0x7ffff729527c
<__GI___libc_free+396>, __val=-1) at
/usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/ext/atomicity.h:68
68        { return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
(gdb) bt
#0  0x0000000000796076 in __gnu_cxx::__exchange_and_add (__mem=0x7ffff729527c
<__GI___libc_free+396>, __val=-1) at
/usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/ext/atomicity.h:68
#1  __gnu_cxx::__exchange_and_add_dispatch (__mem=0x7ffff729527c
<__GI___libc_free+396>, __val=-1) at
/usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/ext/atomicity.h:103
#2  std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release
(this=0x7ffff7295274 <__GI___libc_free+388>)
    at
/usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/shared_ptr_base.h:350
#3  std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count
(this=<optimized out>) at
/usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/shared_ptr_base.h:1070
#4  std::__shared_ptr<MixerChannel, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr
(this=<optimized out>) at
/usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/shared_ptr_base.h:1532
#5  std::__shared_ptr<MixerChannel, (__gnu_cxx::_Lock_policy)2>::operator=
(this=0xeee630 <sb+3504>, __r=...)
    at
/usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/shared_ptr_base.h:1628
#6  std::shared_ptr<MixerChannel>::operator= (this=0xeee630 <sb+3504>, __r=...)
at /usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/shared_ptr.h:439
#7  SBLASTER::SBLASTER (this=<optimized out>, conf=0x2da8790) at
../dosbox-staging-0.82.0/src/hardware/sblaster.cpp:3296
#8  0x000000000078fc01 in std::make_unique<SBLASTER, Section*&> () at
/usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/unique_ptr.h:1077
#9  init_sblaster (sec=0x2da8790) at
../dosbox-staging-0.82.0/src/hardware/sblaster.cpp:3514
#10 0x0000000000544565 in Section::ExecuteInit (this=0x2da8790,
init_all=init_all@entry=true) at
../dosbox-staging-0.82.0/src/misc/setup.cpp:1360
#11 0x0000000000506515 in DOSBoxTestFixture::SetUp (this=<optimized out>) at
../dosbox-staging-0.82.0/tests/dosbox_test_fixture.h:59
#12 0x00007ffff7f698c2 in ?? () from /usr/lib64/libgtest.so.1.15.2
#13 0x00007ffff7f6f9d6 in ?? () from /usr/lib64/libgtest.so.1.15.2
#14 0x00007ffff7f453ea in testing::TestInfo::Run() () from
/usr/lib64/libgtest.so.1.15.2
#15 0x00007ffff7f7082b in ?? () from /usr/lib64/libgtest.so.1.15.2
#16 0x00007ffff7f66888 in testing::internal::UnitTestImpl::RunAllTests() ()
from /usr/lib64/libgtest.so.1.15.2
#17 0x00007ffff7f59437 in testing::UnitTest::Run() () from
/usr/lib64/libgtest.so.1.15.2
#18 0x00007ffff7f77abe in main () from /usr/lib64/libgmock_main.so.1.15.2
#19 0x00007ffff7203547 in __libc_start_call_main
(main=main@entry=0x7ffff7f77a80 <main>, argc=argc@entry=1,
argv=argv@entry=0x7fffffffe1f8) at ../sysdeps/nptl/libc_start_call_main.h:58
#20 0x00007ffff72035f7 in __libc_start_main_impl (main=0x7ffff7f77a80 <main>,
argc=1, argv=0x7fffffffe1f8, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>,
    stack_end=0x7fffffffe1e8) at ../csu/libc-start.c:360
#21 0x00000000004f6681 in _start ()
```

Valgrind complains about uninitialised variables:
```
==903347== Conditional jump or move depends on uninitialised value(s)
==903347==    at 0x794D60: ~__shared_count (shared_ptr_base.h:1069)
==903347==    by 0x794D60: ~__shared_ptr (shared_ptr_base.h:1532)
==903347==    by 0x794D60: operator= (shared_ptr_base.h:1628)
==903347==    by 0x794D60: operator= (shared_ptr.h:439)
==903347==    by 0x794D60: SBLASTER::SBLASTER(Section*) (sblaster.cpp:3296)
==903347==    by 0x78FC00: make_unique<SBLASTER, Section*&> (unique_ptr.h:1077)
==903347==    by 0x78FC00: init_sblaster(Section*) (sblaster.cpp:3514)
==903347==    by 0x544564: Section::ExecuteInit(bool) (setup.cpp:1360)
==903347==    by 0x506514: DOSBoxTestFixture::SetUp()
(dosbox_test_fixture.h:59)
==903347==    by 0x49348C1: ??? (in /usr/lib64/libgtest.so.1.15.2)
==903347==    by 0x493A9D5: ??? (in /usr/lib64/libgtest.so.1.15.2)
==903347==    by 0x49103E9: testing::TestInfo::Run() (in
/usr/lib64/libgtest.so.1.15.2)
==903347==    by 0x493B82A: ??? (in /usr/lib64/libgtest.so.1.15.2)
==903347==    by 0x4931887: testing::internal::UnitTestImpl::RunAllTests() (in
/usr/lib64/libgtest.so.1.15.2)
==903347==    by 0x4924436: testing::UnitTest::Run() (in
/usr/lib64/libgtest.so.1.15.2)
==903347==    by 0x48B2ABD: main (in /usr/lib64/libgmock_main.so.1.15.2)
==903347==
2025-01-14 09:44:09.839 (   2.217s) [         65097C0]          
sblaster.cpp:420   INFO| SB16: Modern DAC output filter enabled
==903347== Conditional jump or move depends on uninitialised value(s)
==903347==    at 0x78DB4A: dsp_change_mode (sblaster.cpp:1241)
==903347==    by 0x78DB4A: dsp_reset() (sblaster.cpp:1412)
==903347==    by 0x795573: SBLASTER::SBLASTER(Section*) (sblaster.cpp:3335)
==903347==    by 0x78FC00: make_unique<SBLASTER, Section*&> (unique_ptr.h:1077)
==903347==    by 0x78FC00: init_sblaster(Section*) (sblaster.cpp:3514)
==903347==    by 0x544564: Section::ExecuteInit(bool) (setup.cpp:1360)
==903347==    by 0x506514: DOSBoxTestFixture::SetUp()
(dosbox_test_fixture.h:59)
==903347==    by 0x49348C1: ??? (in /usr/lib64/libgtest.so.1.15.2)
==903347==    by 0x493A9D5: ??? (in /usr/lib64/libgtest.so.1.15.2)
==903347==    by 0x49103E9: testing::TestInfo::Run() (in
/usr/lib64/libgtest.so.1.15.2)
==903347==    by 0x493B82A: ??? (in /usr/lib64/libgtest.so.1.15.2)
==903347==    by 0x4931887: testing::internal::UnitTestImpl::RunAllTests() (in
/usr/lib64/libgtest.so.1.15.2)
==903347==    by 0x4924436: testing::UnitTest::Run() (in
/usr/lib64/libgtest.so.1.15.2)
==903347==    by 0x48B2ABD: main (in /usr/lib64/libgmock_main.so.1.15.2)
==903347==
[...]
==903347== Conditional jump or move depends on uninitialised value(s)
==903347==    at 0x79241A: ~__shared_count (shared_ptr_base.h:1069)
==903347==    by 0x79241A: ~__shared_ptr (shared_ptr_base.h:1532)
==903347==    by 0x79241A: ~shared_ptr (shared_ptr.h:175)
==903347==    by 0x79241A: SbInfo::~SbInfo() (sblaster.cpp:110)
==903347==    by 0x52DEBAD: __run_exit_handlers (exit.c:118)
==903347==    by 0x52DEC7B: exit (exit.c:148)
==903347==    by 0x52BF54D: (below main) (libc_start_call_main.h:74)
```

2) Failures with e.g. -Og where I get a crash on teardown
```
Thread 1 "shell_cmds" received signal SIGSEGV, Segmentation fault.
std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<unsigned
short const, std::function<void(unsigned short, unsigned int, io_width_t)> >,
false> > >::_M_deallocate_nodes (this=this@entry=0x2752878
<io_write_handlers+56>, __n=0xff00000002d87390) at
/usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/hashtable_policy.h:1609
1609              __n = __n->_M_next();
(gdb) bt
#0 
std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<unsigned
short const, std::function<void(unsigned short, unsigned int, io_width_t)> >,
false> > >::_M_deallocate_nodes (this=this@entry=0x2752878
<io_write_handlers+56>, __n=0xff00000002d87390) at
/usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/hashtable_policy.h:1609
#1  0x000000000076ca9d in std::_Hashtable<unsigned short, std::pair<unsigned
short const, std::function<void(unsigned short, unsigned int, io_width_t)> >,
std::allocator<std::pair<unsigned short const, std::function<void(unsigned
short, unsigned int, io_width_t)> > >, std::__detail::_Select1st,
std::equal_to<unsigned short>, std::hash<unsigned short>,
std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash,
std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false,
false, true> >::clear (
    this=this@entry=0x2752878 <io_write_handlers+56>) at
/usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/hashtable.h:2672
#2  0x000000000076cb14 in std::unordered_map<unsigned short,
std::function<void(unsigned short, unsigned int, io_width_t)>,
std::hash<unsigned short>, std::equal_to<unsigned short>,
std::allocator<std::pair<unsigned short const, std::function<void(unsigned
short, unsigned int, io_width_t)> > > >::clear (this=<optimized out>)
    at
/usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/unordered_map.h:799
#3  IO::~IO (this=0x2da6760) at ../src/hardware/iohandler.cpp:398
#4  0x000000000076cb3b in IO::~IO (this=0x2da6760) at
../src/hardware/iohandler.cpp:402
#5  0x000000000076c8d7 in IO_Destroy () at ../src/hardware/iohandler.cpp:408
#6  0x00000000005b2cd4 in Section::ExecuteDestroy (this=0x2db3170,
destroyall=destroyall@entry=true) at ../src/misc/setup.cpp:1398
#7  0x0000000000571cf8 in DOSBoxTestFixture::TearDown (this=0x2df2ea0) at
../tests/dosbox_test_fixture.h:67
#8  0x00007ffff7f488c2 in ?? () from /usr/lib64/libgtest.so.1.15.2
#9  0x00007ffff7f243ea in testing::TestInfo::Run() () from
/usr/lib64/libgtest.so.1.15.2
#10 0x00007ffff7f4f82b in ?? () from /usr/lib64/libgtest.so.1.15.2
#11 0x00007ffff7f45888 in testing::internal::UnitTestImpl::RunAllTests() ()
from /usr/lib64/libgtest.so.1.15.2
#12 0x00007ffff7f38437 in testing::UnitTest::Run() () from
/usr/lib64/libgtest.so.1.15.2
#13 0x00007ffff7f77abe in main () from /usr/lib64/libgmock_main.so.1.15.2
#14 0x00007ffff7203547 in __libc_start_call_main
(main=main@entry=0x7ffff7f77a80 <main>, argc=argc@entry=1,
argv=argv@entry=0x7fffffffd768) at ../sysdeps/nptl/libc_start_call_main.h:58
#15 0x00007ffff72035f7 in __libc_start_main_impl (main=0x7ffff7f77a80 <main>,
argc=1, argv=0x7fffffffd768, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>,
    stack_end=0x7fffffffd758) at ../csu/libc-start.c:360
#16 0x000000000055a7e1 in _start ()
```

I am focusing on 1) for now.

Reply via email to