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

            Bug ID: 77330
           Summary: __float128 segfaults on 32-bit x86 due to 8-byte
                    malloc alignment
           Product: gcc
           Version: 6.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mikulas at artax dot karlin.mff.cuni.cz
  Target Milestone: ---
              Host: x86_64-pc-linux-gnu
            Target: x86_64-pc-linux-gnu
             Build: x86_64-pc-linux-gnu

On 32-bit x86 system, glibc malloc aligns allocated memory to 8 bytes. The type
__float128 has 16-byte alignment (__alignof__(__float128) return 16), however
this alignment can't be guaranteed because of 8-byte malloc alignment.

GCC uses aligned SSE instructions when accessing the __float128 type, these
instructions cause a crash when accessing heap memory that is aligned only to 8
bytes.

This program will crash if compiled with "gcc -m32 -march=athlon64" (with or
without optimization).

#include <stdio.h>
#include <stdlib.h>

struct s {
        __float128 f1;
};

int main(void)
{
        struct s *p = malloc(sizeof(struct s));
        printf("%p\n", p);
        p->f1 = 1.234;
        return 0;
}

The misgenerated code is this:
0804842b <main>:
 804842b:       55                      push   %ebp
 804842c:       89 e5                   mov    %esp,%ebp
 804842e:       83 e4 f0                and    $0xfffffff0,%esp
 8048431:       83 ec 20                sub    $0x20,%esp
 8048434:       c7 04 24 10 00 00 00    movl   $0x10,(%esp)
 804843b:       e8 a0 fe ff ff          call   80482e0 <malloc@plt>
 8048440:       89 44 24 1c             mov    %eax,0x1c(%esp)
 8048444:       8b 44 24 1c             mov    0x1c(%esp),%eax
 8048448:       89 44 24 04             mov    %eax,0x4(%esp)
 804844c:       c7 04 24 10 85 04 08    movl   $0x8048510,(%esp)
 8048453:       e8 78 fe ff ff          call   80482d0 <printf@plt>
 8048458:       8b 44 24 1c             mov    0x1c(%esp),%eax
 804845c:       66 0f 6f 05 20 85 04    movdqa 0x8048520,%xmm0
 8048463:       08
 8048464:       0f 29 00                movaps %xmm0,(%eax)
 8048467:       b8 00 00 00 00          mov    $0x0,%eax
 804846c:       c9                      leave
 804846d:       c3                      ret

Reply via email to