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

            Bug ID: 88374
           Summary: crash when stepping into for loop where iterators are
                    created and compared with gdb
           Product: gcc
           Version: 8.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bob.steagall.cpp at gmail dot com
  Target Milestone: ---

Created attachment 45161
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=45161&action=edit
preprocessed source file to demonstrate problem

Consider the following code:

========================
#include <atomic>
#include <vector>

struct TS
{
    std::atomic<void*> mPtr;
};

int main()
{
    std::vector<TS> test(10);
    volatile int    i = 0;

    for (auto iter = test.begin();  iter != test.end();  ++iter)
    {
        ++i;
    }
    return 0;
}
========================

GDB 7.11 and 8.2 both crash when repeatedly stepping into the for loop on line
14 when compiled with gcc 8.2 and -std=c++17.

The problem appears to be related to the combination of std::atomic<T> as an
element type AND the compilation flag -std=c++17.

If I change the flag to -std=c++14, gdb does not crash, and I can step thru the
iterator instantiations and comparisons as expected.  Also, if I change the
pointer type to void*, the crash does not occur, and stepping works correctly.  

I'm not sure if this is a GDB problem or a g++ codegen problem (or both?), so
I'm filing this report with both products.

Thanks,
--Bob

========================
To reproduce:

$ g++ -std=c++17 -Wall -Wextra -g -O0 test_dbg.cpp -o test_dbg
$ gdb test_dbg

inside of gdb:

(gdb) b 12
(gdb) r
(gdb) s
(gdb) s
(gdb) s
(gdb) s
(gdb) s
(gdb) s
 { gdb crashes with segv }


The following is a transcript from such a session:

Reading symbols from test_dbg...done.
(gdb) b 12
Breakpoint 1 at 0x400738: file test_dbg.cpp, line 12.
(gdb) r
Starting program: /space/tmp/test_dbg

Breakpoint 1, main () at test_dbg.cpp:12
(gdb) s
(gdb) s
std::vector<TS, std::allocator<TS> >::begin (this=0x7fffffffd7a0)
    at /usr/local/gcc/8.2.0/include/c++/8.2.0/bits/stl_vector.h:699
(gdb) s
__gnu_cxx::__normal_iterator<TS*, std::vector<TS, std::allocator<TS> >
>::__normal_iterator (
    this=0x7fffffffd778, __i=@0x7fffffffd7a0: 0x614c20)
    at /usr/local/gcc/8.2.0/include/c++/8.2.0/bits/stl_iterator.h:781
(gdb) s
std::vector<TS, std::allocator<TS> >::end (this=0x7fffffffd7a0)
    at /usr/local/gcc/8.2.0/include/c++/8.2.0/bits/stl_vector.h:717
(gdb) s
__gnu_cxx::__normal_iterator<TS*, std::vector<TS, std::allocator<TS> >
>::__normal_iterator (
    this=0x7fffffffd778, __i=@0x7fffffffd7a8: 0x614c70)
    at /usr/local/gcc/8.2.0/include/c++/8.2.0/bits/stl_iterator.h:781
(gdb) s
Segmentation fault (core dumped)

=============================
Here are the tool specs:

$ gdb -v
GNU gdb (GDB) 8.2
Copyright (C) 2018 Free Software Foundation, Inc. ...


$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.5 LTS
Release:        16.04
Codename:       xenia


$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/local/gcc/8.2.0/libexec/gcc/x86_64-kewb-linux-gnu/8.2.0/lto-wrapper
Target: x86_64-kewb-linux-gnu
Configured with: /space/zbuild/gcc-builder/gcc-8.2.0/configure -v
--with-pkgversion='KEWB Computing Build' --prefix=/usr/local/gcc/8.2.0
--program-suffix= --enable-tls --enable-shared --enable-threads=posix
--enable-__cxa_atexit --enable-clocale=gnu --enable-languages=c,c++
--enable-lto --enable-bootstrap --disable-nls --disable-multilib
--disable-install-libiberty --disable-werror --with-system-zlib
Thread model: posix
gcc version 8.2.0 (KEWB Computing Build) 

$ g++ -v -save-temps -std=c++17 -Wall -Wextra -g -O0 test_dbg.cpp -o test_dbg
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/local/gcc/8.2.0/libexec/gcc/x86_64-kewb-linux-gnu/8.2.0/lto-wrapper
Target: x86_64-kewb-linux-gnu
Configured with: /space/zbuild/gcc-builder/gcc-8.2.0/configure -v
--with-pkgversion='KEWB Computing Build' --prefix=/usr/local/gcc/8.2.0
--program-suffix= --enable-tls --enable-shared --enable-threads=posix
--enable-__cxa_atexit --enable-clocale=gnu --enable-languages=c,c++
--enable-lto --enable-bootstrap --disable-nls --disable-multilib
--disable-install-libiberty --disable-werror --with-system-zlib
Thread model: posix
gcc version 8.2.0 (KEWB Computing Build) 
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-std=c++17' '-Wall' '-Wextra' '-g'
'-O0' '-o' 'test_dbg' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/local/gcc/8.2.0/libexec/gcc/x86_64-kewb-linux-gnu/8.2.0/cc1plus -E -quiet
-v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE test_dbg.cpp -mtune=generic
-march=x86-64 -std=c++17 -Wall -Wextra -g -fworking-directory -O0
-fpch-preprocess -o test_dbg.ii
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory
"/usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/8.2.0/../../../../x86_64-kewb-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:

/usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/8.2.0/../../../../include/c++/8.2.0

/usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/8.2.0/../../../../include/c++/8.2.0/x86_64-kewb-linux-gnu

/usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/8.2.0/../../../../include/c++/8.2.0/backward
 /usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/8.2.0/include
 /usr/local/include
 /usr/local/gcc/8.2.0/include
 /usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/8.2.0/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-std=c++17' '-Wall' '-Wextra' '-g'
'-O0' '-o' 'test_dbg' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/local/gcc/8.2.0/libexec/gcc/x86_64-kewb-linux-gnu/8.2.0/cc1plus
-fpreprocessed test_dbg.ii -quiet -dumpbase test_dbg.cpp -mtune=generic
-march=x86-64 -auxbase test_dbg -g -O0 -Wall -Wextra -std=c++17 -version -o
test_dbg.s
GNU C++17 (KEWB Computing Build) version 8.2.0 (x86_64-kewb-linux-gnu)
        compiled by GNU C version 8.2.0, GMP version 5.1.3, MPFR version 3.1.4,
MPC version 1.0.3, isl version none
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU C++17 (KEWB Computing Build) version 8.2.0 (x86_64-kewb-linux-gnu)
        compiled by GNU C version 8.2.0, GMP version 5.1.3, MPFR version 3.1.4,
MPC version 1.0.3, isl version none
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: c0184c602d8f8aa7dc79a356eb27fd8e
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-std=c++17' '-Wall' '-Wextra' '-g'
'-O0' '-o' 'test_dbg' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/local/gcc/8.2.0/libexec/gcc/x86_64-kewb-linux-gnu/8.2.0/as -v --64 -o
test_dbg.o test_dbg.s
GNU assembler version 2.30 (x86_64-kewb-linux-gnu) using BFD version (GNU
Binutils) 2.30
COMPILER_PATH=/usr/local/gcc/8.2.0/libexec/gcc/x86_64-kewb-linux-gnu/8.2.0/:/usr/local/gcc/8.2.0/libexec/gcc/x86_64-kewb-linux-gnu/8.2.0/:/usr/local/gcc/8.2.0/libexec/gcc/x86_64-kewb-linux-gnu/:/usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/8.2.0/:/usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/
LIBRARY_PATH=/usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/8.2.0/:/usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/8.2.0/../../../../lib64/:/lib/x86_64-linux-gnu/:/lib/../lib64/:/usr/lib/x86_64-linux-gnu/:/usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/8.2.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-std=c++17' '-Wall' '-Wextra' '-g'
'-O0' '-o' 'test_dbg' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/local/gcc/8.2.0/libexec/gcc/x86_64-kewb-linux-gnu/8.2.0/collect2 -plugin
/usr/local/gcc/8.2.0/libexec/gcc/x86_64-kewb-linux-gnu/8.2.0/liblto_plugin.so
-plugin-opt=/usr/local/gcc/8.2.0/libexec/gcc/x86_64-kewb-linux-gnu/8.2.0/lto-wrapper
-plugin-opt=-fresolution=test_dbg.res -plugin-opt=-pass-through=-lgcc_s
-plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc
-plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc
--eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o
test_dbg /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o
/usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/8.2.0/crtbegin.o
-L/usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/8.2.0
-L/usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/8.2.0/../../../../lib64
-L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu
-L/usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/8.2.0/../../.. test_dbg.o
-lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
/usr/local/gcc/8.2.0/lib/gcc/x86_64-kewb-linux-gnu/8.2.0/crtend.o
/usr/lib/x86_64-linux-gnu/crtn.o
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-std=c++17' '-Wall' '-Wextra' '-g'
'-O0' '-o' 'test_dbg' '-shared-libgcc' '-mtune=generic' '-march=x86-64'

(builds cleanly)

Reply via email to