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

Eric Botcazou <ebotcazou at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ebotcazou at gcc dot gnu.org

--- Comment #15 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
This seems totally broken on x86-64 too, see valgrind:

eric@polaris:~> valgrind ./unlimited_polymorphic_30 
==42237== Memcheck, a memory error detector
==42237== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==42237== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==42237== Command: ./unlimited_polymorphic_30
==42237== 
==42237== Conditional jump or move depends on uninitialised value(s)
==42237==    at 0x4013C7: MAIN__ (in /home/eric/unlimited_polymorphic_30)
==42237==    by 0x4023E6: main (in /home/eric/unlimited_polymorphic_30)
==42237== 
==42237== Invalid write of size 8
==42237==    at 0x40142B: MAIN__ (in /home/eric/unlimited_polymorphic_30)
==42237==    by 0x4023E6: main (in /home/eric/unlimited_polymorphic_30)
==42237==  Address 0x5768ac0 is 0 bytes inside a block of size 6 alloc'd
==42237==    at 0x4C2A0B0: malloc (in
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==42237==    by 0x401333: MAIN__ (in /home/eric/unlimited_polymorphic_30)
==42237==    by 0x4023E6: main (in /home/eric/unlimited_polymorphic_30)
==42237== 
==42237== Conditional jump or move depends on uninitialised value(s)
==42237==    at 0x401465: MAIN__ (in /home/eric/unlimited_polymorphic_30)
==42237==    by 0x4023E6: main (in /home/eric/unlimited_polymorphic_30)
==42237== 
==42237== Invalid read of size 8
==42237==    at 0x4013C1: MAIN__ (in /home/eric/unlimited_polymorphic_30)
==42237==    by 0x4023E6: main (in /home/eric/unlimited_polymorphic_30)
==42237==  Address 0x5768ac3 is 3 bytes inside a block of size 6 alloc'd
==42237==    at 0x4C2A0B0: malloc (in
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==42237==    by 0x401333: MAIN__ (in /home/eric/unlimited_polymorphic_30)
==42237==    by 0x4023E6: main (in /home/eric/unlimited_polymorphic_30)
==42237== 
==42237== Conditional jump or move depends on uninitialised value(s)
==42237==    at 0x401A6D: MAIN__ (in /home/eric/unlimited_polymorphic_30)
==42237==    by 0x4023E6: main (in /home/eric/unlimited_polymorphic_30)
==42237== 
==42237== Invalid read of size 8
==42237==    at 0x401A67: MAIN__ (in /home/eric/unlimited_polymorphic_30)
==42237==    by 0x4023E6: main (in /home/eric/unlimited_polymorphic_30)
==42237==  Address 0x5768ac4 is 4 bytes inside a block of size 6 alloc'd
==42237==    at 0x4C2A0B0: malloc (in
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==42237==    by 0x401333: MAIN__ (in /home/eric/unlimited_polymorphic_30)
==42237==    by 0x4023E6: main (in /home/eric/unlimited_polymorphic_30)
==42237== 
==42237== Invalid write of size 4
==42237==    at 0x4011DC: __copy_INTEGER_4_.3853 (in
/home/eric/unlimited_polymorphic_30)
==42237==    by 0x401B54: MAIN__ (in /home/eric/unlimited_polymorphic_30)
==42237==    by 0x4023E6: main (in /home/eric/unlimited_polymorphic_30)
==42237==  Address 0x5768ac4 is 4 bytes inside a block of size 6 alloc'd
==42237==    at 0x4C2A0B0: malloc (in
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==42237==    by 0x401333: MAIN__ (in /home/eric/unlimited_polymorphic_30)
==42237==    by 0x4023E6: main (in /home/eric/unlimited_polymorphic_30)
==42237== 
==42237== Conditional jump or move depends on uninitialised value(s)
==42237==    at 0x4022FC: foo.3898 (in /home/eric/unlimited_polymorphic_30)
==42237==    by 0x401B73: MAIN__ (in /home/eric/unlimited_polymorphic_30)
==42237==    by 0x4023E6: main (in /home/eric/unlimited_polymorphic_30)
==42237== 
==42237== Conditional jump or move depends on uninitialised value(s)
==42237==    at 0x4022FC: foo.3898 (in /home/eric/unlimited_polymorphic_30)
==42237==    by 0x401F42: MAIN__ (in /home/eric/unlimited_polymorphic_30)
==42237==    by 0x4023E6: main (in /home/eric/unlimited_polymorphic_30)

In particular:

x.v._data.data = (void * restrict) __builtin_malloc (6);

       D.1053 = (void *[0:] * restrict) x.v._data.data;

                *((void * *) D.1053 + (sizetype) (((S.8 + D.1059) + D.1054) *
(x.v._vptr->_size * MAX_EXPR <x.v._len, 1>))) = __builtin_malloc (MAX_EXPR
<(unsigned long) x.v._vptr->_size, 1>);

The second call to __builtin_malloc overwrites part of the address returned by
the first call (or yields SIGBUS on the SPARC).  There might be some confusion
about pointer arithmetics in the GENERIC code.

Reply via email to