Public bug reported:

On Noble 24.04, with default build-essential and gdb, printing the value
of a std::basic_string with a custom allocator class
(std::basic_string::<char, char_traits<char>, CUSTOM_ALLOCATOR_CLASS>)
causes a floating point exception in GDB.

Compile this program with debugging information, break on the main
function's line that does the console output to cout, and issue the
command 'p obj' to witness the crash.  This happens on a clean
ubuntu:noble docker image:

==============================
#include <iostream>
#include <string>

template <class T>
class Allocator
{
public:
        typedef T                                                               
                                                value_type;
        typedef value_type *                                                    
                                pointer;
        typedef value_type &                                                    
                                reference;
        typedef const value_type *                                              
                                const_pointer;
        typedef const value_type &                                              
                                const_reference;

        typedef size_t                                                          
                                        size_type;
        typedef ptrdiff_t                                                       
                                        difference_type;

        template <class T1>
        class rebind
        {
        public:

                typedef Allocator<T1> other;
        };

        pointer address(reference i_Val) const
        {       
                return (&i_Val);
        }

        const_pointer address(const_reference i_Val) const
        {
                return (&i_Val);
        }

        Allocator() 
        {       
        }

        Allocator(const Allocator<T>&)
        {
        }

        template<class T1>
        Allocator(const Allocator<T1>&) 
        {
        }

        template<class T1>
        Allocator<T>& operator=(const Allocator<T1>&)
        {
                return (*this);
        }

        void deallocate(pointer i_Ptr, size_type)
        {
                ::free(i_Ptr);
        }
        
        void deallocate(pointer i_Ptr, const std::nothrow_t &/*nothrow*/) 
        {
                ::free(i_Ptr);
        }

        pointer allocate(size_type i_Count)
        {
                pointer retVal;
                
                retVal = static_cast<pointer>(malloc(i_Count * sizeof(T)));
                
                if (retVal == nullptr)
                        throw std::bad_alloc();
                
                return retVal;
        }
        
        pointer allocate(size_type i_Count, const void *)
        {       
                return allocate(i_Count);
        }
        
        template<typename _Up, typename... _Args>
        void construct(_Up* i_Ptr, _Args&&... i_Arguments)
        {
                ::new(const_cast<void *>(reinterpret_cast<const void 
*>(i_Ptr))) _Up(std::forward<_Args>(i_Arguments)...);
        }
        
        template<typename _Up>
        void destroy(_Up* i_Ptr)
        {
                i_Ptr->~_Up();
        }
        
        size_t max_size() const 
        {       
                size_t count = static_cast<size_t>(-1) / sizeof (T);
                return (0 < count ? count : 1);
        }
};

// GDB crashes when trying to print 'str' in the main function on the cout line
// when using Allocator.
using String=std::basic_string<char, std::char_traits<char>, Allocator<char>>;

int main(int argc, char *argv[])
{
    String str("Hello, World!");
    std::cout << str << std::endl;
    return 0;
}

==================================

This message appears in gdb:


198         std::cout << str << std::endl;
(gdb) p str


Fatal signal: Floating point exception
----- Backtrace -----
0x55f68d755bc6 ???
0x55f68d878ecd ???
0x7f9a6ce0631f ???
        ./signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0
0x55f68dae8ca8 ???
0x55f68db86029 ???
0x55f68d9eda57 ???
0x55f68d87fea1 ???
0x55f68db82d5f ???
0x55f68d9b407e ???
0x55f68d9b4379 ???
0x55f68d78e464 ???
0x55f68daf8727 ???
0x55f68d879967 ???
0x55f68d87b143 ???
0x55f68d87a332 ???
0x7f9a6e0779e4 ???
0x55f68d87a495 ???
0x55f68d87a663 ???
0x55f68db3ba5c ???
0x55f68dd06975 ???
0x55f68dd074f7 ???
0x55f68d955ea9 ???
0x55f68d958f04 ???
0x55f68d69fdab ???
0x7f9a6cdeb1c9 __libc_start_call_main
        ../sysdeps/nptl/libc_start_call_main.h:58
0x7f9a6cdeb28a __libc_start_main_impl
        ../csu/libc-start.c:360
0x55f68d6ae1f4 ???
0xffffffffffffffff ???
---------------------
A fatal error internal to GDB has been detected, further
debugging is not possible.  GDB will now terminate.

This is a bug, please report it.  For instructions, see:
<https://www.gnu.org/software/gdb/bugs/>.

Floating point exception (core dumped)

ProblemType: Bug
DistroRelease: Ubuntu 24.04
Package: gdb 15.0.50.20240403-0ubuntu1
ProcVersionSignature: Ubuntu 5.15.0-126.136-generic 5.15.167
Uname: Linux 5.15.0-126-generic x86_64
ApportVersion: 2.28.1-0ubuntu3.1
Architecture: amd64
CasperMD5CheckResult: unknown
CloudBuildName: ubuntu-oci:minimized
CloudSerial: 20241015
Date: Wed Nov 27 12:58:44 2024
ProcEnviron:
 PATH=(custom, no user)
 TERM=xterm
SourcePackage: gdb
UpgradeStatus: No upgrade log present (probably fresh install)
mtime.conffile..etc.apport.crashdb.conf: 2024-11-27T12:53:43.637016

** Affects: gdb (Ubuntu)
     Importance: Undecided
         Status: New


** Tags: amd64 apport-bug cloud-image gdb noble

-- 
You received this bug notification because you are a member of Ubuntu
Touch seeded packages, which is subscribed to gdb in Ubuntu.
https://bugs.launchpad.net/bugs/2089788

Title:
  GDB crash on simple C++ program debugging

Status in gdb package in Ubuntu:
  New

Bug description:
  On Noble 24.04, with default build-essential and gdb, printing the
  value of a std::basic_string with a custom allocator class
  (std::basic_string::<char, char_traits<char>, CUSTOM_ALLOCATOR_CLASS>)
  causes a floating point exception in GDB.

  Compile this program with debugging information, break on the main
  function's line that does the console output to cout, and issue the
  command 'p obj' to witness the crash.  This happens on a clean
  ubuntu:noble docker image:

  ==============================
  #include <iostream>
  #include <string>

  template <class T>
  class Allocator
  {
  public:
        typedef T                                                               
                                                value_type;
        typedef value_type *                                                    
                                pointer;
        typedef value_type &                                                    
                                reference;
        typedef const value_type *                                              
                                const_pointer;
        typedef const value_type &                                              
                                const_reference;

        typedef size_t                                                          
                                        size_type;
        typedef ptrdiff_t                                                       
                                        difference_type;

        template <class T1>
        class rebind
        {
        public:

                typedef Allocator<T1> other;
        };

        pointer address(reference i_Val) const
        {       
                return (&i_Val);
        }

        const_pointer address(const_reference i_Val) const
        {
                return (&i_Val);
        }

        Allocator() 
        {       
        }

        Allocator(const Allocator<T>&)
        {
        }

        template<class T1>
        Allocator(const Allocator<T1>&) 
        {
        }

        template<class T1>
        Allocator<T>& operator=(const Allocator<T1>&)
        {
                return (*this);
        }

        void deallocate(pointer i_Ptr, size_type)
        {
                ::free(i_Ptr);
        }
        
        void deallocate(pointer i_Ptr, const std::nothrow_t &/*nothrow*/) 
        {
                ::free(i_Ptr);
        }

        pointer allocate(size_type i_Count)
        {
                pointer retVal;
                
                retVal = static_cast<pointer>(malloc(i_Count * sizeof(T)));
                
                if (retVal == nullptr)
                        throw std::bad_alloc();
                
                return retVal;
        }
        
        pointer allocate(size_type i_Count, const void *)
        {       
                return allocate(i_Count);
        }
        
        template<typename _Up, typename... _Args>
        void construct(_Up* i_Ptr, _Args&&... i_Arguments)
        {
                ::new(const_cast<void *>(reinterpret_cast<const void 
*>(i_Ptr))) _Up(std::forward<_Args>(i_Arguments)...);
        }
        
        template<typename _Up>
        void destroy(_Up* i_Ptr)
        {
                i_Ptr->~_Up();
        }
        
        size_t max_size() const 
        {       
                size_t count = static_cast<size_t>(-1) / sizeof (T);
                return (0 < count ? count : 1);
        }
  };

  // GDB crashes when trying to print 'str' in the main function on the cout 
line
  // when using Allocator.
  using String=std::basic_string<char, std::char_traits<char>, Allocator<char>>;

  int main(int argc, char *argv[])
  {
      String str("Hello, World!");
      std::cout << str << std::endl;
      return 0;
  }

  ==================================

  This message appears in gdb:

  
  198         std::cout << str << std::endl;
  (gdb) p str

  
  Fatal signal: Floating point exception
  ----- Backtrace -----
  0x55f68d755bc6 ???
  0x55f68d878ecd ???
  0x7f9a6ce0631f ???
          ./signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0
  0x55f68dae8ca8 ???
  0x55f68db86029 ???
  0x55f68d9eda57 ???
  0x55f68d87fea1 ???
  0x55f68db82d5f ???
  0x55f68d9b407e ???
  0x55f68d9b4379 ???
  0x55f68d78e464 ???
  0x55f68daf8727 ???
  0x55f68d879967 ???
  0x55f68d87b143 ???
  0x55f68d87a332 ???
  0x7f9a6e0779e4 ???
  0x55f68d87a495 ???
  0x55f68d87a663 ???
  0x55f68db3ba5c ???
  0x55f68dd06975 ???
  0x55f68dd074f7 ???
  0x55f68d955ea9 ???
  0x55f68d958f04 ???
  0x55f68d69fdab ???
  0x7f9a6cdeb1c9 __libc_start_call_main
          ../sysdeps/nptl/libc_start_call_main.h:58
  0x7f9a6cdeb28a __libc_start_main_impl
          ../csu/libc-start.c:360
  0x55f68d6ae1f4 ???
  0xffffffffffffffff ???
  ---------------------
  A fatal error internal to GDB has been detected, further
  debugging is not possible.  GDB will now terminate.

  This is a bug, please report it.  For instructions, see:
  <https://www.gnu.org/software/gdb/bugs/>.

  Floating point exception (core dumped)

  ProblemType: Bug
  DistroRelease: Ubuntu 24.04
  Package: gdb 15.0.50.20240403-0ubuntu1
  ProcVersionSignature: Ubuntu 5.15.0-126.136-generic 5.15.167
  Uname: Linux 5.15.0-126-generic x86_64
  ApportVersion: 2.28.1-0ubuntu3.1
  Architecture: amd64
  CasperMD5CheckResult: unknown
  CloudBuildName: ubuntu-oci:minimized
  CloudSerial: 20241015
  Date: Wed Nov 27 12:58:44 2024
  ProcEnviron:
   PATH=(custom, no user)
   TERM=xterm
  SourcePackage: gdb
  UpgradeStatus: No upgrade log present (probably fresh install)
  mtime.conffile..etc.apport.crashdb.conf: 2024-11-27T12:53:43.637016

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/gdb/+bug/2089788/+subscriptions


-- 
Mailing list: https://launchpad.net/~touch-packages
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~touch-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to