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

            Bug ID: 68047
           Summary: diagnose placement new with misaligned buffer
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

Related to bug 67942 and bug 36159, using C++ placement new to construct an
object in a inappropriately aligned buffer is undefined and can lead to crashes
as shown in the test case below.  When the placement new expression is being
used with a plain character buffer that isn't guaranteed to be aligned on the
same boundary as the object being constructed, GCC could and arguably should
issue a diagnostic suggesting to align the buffer as necessary.  Since
depending on the alignment, there may be decent chance that the character
buffer just happens to be aligned or the misaligned access is tolerated on the
target hardware, the warning should probably be explicitly requested (i.e., not
be included in -Wall).

This bug tracks the proposed implementation of this diagnostic.

$ cat t.cpp && g++ -Wall -Wextra -Wpedantic -O2 -g t.cpp && gdb -batch -q -ex
'r' -ex 'bt' -ex 'disas' ./a.out
typedef __typeof__ (sizeof 0) size_t;

void* operator new (size_t, void *p) { return p; }
void* operator new[] (size_t, void *p) { return p; }

typedef int v4si __attribute__ ((vector_size (16)));

struct S { v4si v; };

S __attribute__ ((weak)) foo (S *p, v4si x)
{
    p->v = x;
    return *p;
}

S __attribute__ ((weak)) f (v4si x)
{
    char a [sizeof (S) * 2];

    S *p = new (a + 1) S ();

    return foo (p, x);
}

int main  ()
{
    v4si x = { 1, 2, 3, 4 };

    f (x);
}


Program received signal SIGSEGV, Segmentation fault.
foo(S*, int __vector(4)) (p=p@entry=0x7fffffffded1, x=...) at t.cpp:12
12          p->v = x;
#0  foo(S*, int __vector(4)) (p=p@entry=0x7fffffffded1, x=...) at t.cpp:12
#1  0x0000000000400667 in f(int __vector(4)) (x=...) at t.cpp:22
#2  0x00000000004004c1 in main () at t.cpp:29
Dump of assembler code for function foo(S*, int __vector(4)):
=> 0x0000000000400640 <+0>:     movaps %xmm0,(%rdi)
   0x0000000000400643 <+3>:     retq   
End of assembler dump.
$

Reply via email to