// RUN: %clang_analyze_cc1 -std=c++11 %s \ // RUN: -analyzer-checker=core \ // RUN: -analyzer-checker=cplusplus.NewDelete \ // RUN: -analyzer-checker=alpha.cplusplus.PlacementNew \ // RUN: -analyzer-output=text -verify \ // RUN: -triple x86_64-unknown-linux-gnu #include "Inputs/system-header-simulator-cxx.h" void f() { short s; // expected-note {{'s' declared without an initial value}} long *lp = ::new (&s) long; // expected-warning{{Storage provided to placement new is only 2 bytes, whereas the allocated type requires 8 bytes}} expected-note 3 {{}} (void)lp; } namespace testArrayNew { void f() { short s; // expected-note {{'s' declared without an initial value}} char *buf = ::new (&s) char[8]; // expected-warning{{Storage provided to placement new is only 2 bytes, whereas the allocated type requires 8 bytes}} expected-note 3 {{}} (void)buf; } } // namespace testArrayNew namespace testBufferInOtherFun { void f(void *place) { long *lp = ::new (place) long; // expected-warning{{Storage provided to placement new is only 2 bytes, whereas the allocated type requires 8 bytes}} expected-note 1 {{}} (void)lp; } void g() { short buf; // expected-note {{'buf' declared without an initial value}} f(&buf); // expected-note 2 {{}} } } // namespace testBufferInOtherFun namespace testArrayBuffer { void f(void *place) { long *lp = ::new (place) long; // expected-warning{{Storage provided to placement new is only 2 bytes, whereas the allocated type requires 8 bytes}} expected-note 1 {{}} (void)lp; } void g() { char buf[2]; // expected-note {{'buf' initialized here}} f(&buf); // expected-note 2 {{}} } } // namespace testArrayBuffer namespace testGlobalPtrAsPlace { void *gptr = nullptr; short gs; void f() { gptr = &gs; // expected-note {{Value assigned to 'gptr'}} } void g() { f(); // expected-note 2 {{}} long *lp = ::new (gptr) long; // expected-warning{{Storage provided to placement new is only 2 bytes, whereas the allocated type requires 8 bytes}} expected-note 1 {{}} (void)lp; } } // namespace testGlobalPtrAsPlace namespace testRvalue { short gs; void *f() { return &gs; } void g() { long *lp = ::new (f()) long; // expected-warning{{Storage provided to placement new is only 2 bytes, whereas the allocated type requires 8 bytes}} expected-note 1 {{}} (void)lp; } } // namespace testRvalue namespace testNoWarning { void *f(); void g() { long *lp = ::new (f()) long; (void)lp; } } // namespace testNoWarning namespace testPtrToArrayAsPlace { void f() { //char *st = new char [8]; char buf[3]; // expected-note {{'buf' initialized here}} void *st = buf; // expected-note {{'st' initialized here}} long *lp = ::new (st) long; // expected-warning{{Storage provided to placement new is only 3 bytes, whereas the allocated type requires 8 bytes}} expected-note 1 {{}} (void)lp; } } // namespace testPtrToArrayAsPlace namespace testPtrToArrayWithOffsetAsPlace { void f() { int buf[3]; // expected-note {{'buf' initialized here}} long *lp = ::new (buf + 2) long; // expected-warning{{Storage provided to placement new is only 4 bytes, whereas the allocated type requires 8 bytes}} expected-note 1 {{}} (void)lp; } } // namespace testPtrToArrayWithOffsetAsPlace namespace testHeapAllocatedBuffer { void g2() { char *buf = new char[2]; // expected-note {{'buf' initialized here}} long *lp = ::new (buf) long; // expected-warning{{Storage provided to placement new is only 2 bytes, whereas the allocated type requires 8 bytes}} expected-note 1 {{}} (void)lp; } } // namespace testHeapAllocatedBuffer namespace testMultiDimensionalArray { void f() { char buf[2][3]; // expected-note {{'buf' initialized here}} long *lp = ::new (buf) long; // expected-warning{{Storage provided to placement new is only 6 bytes, whereas the allocated type requires 8 bytes}} expected-note 1 {{}} (void)lp; } } // namespace testMultiDimensionalArray namespace testMultiDimensionalArray2 { void f() { char buf[2][3]; // expected-note {{'buf' initialized here}} long *lp = ::new (buf + 1) long; // expected-warning{{Storage provided to placement new is only 3 bytes, whereas the allocated type requires 8 bytes}} expected-note 1 {{}} (void)lp; } } // namespace testMultiDimensionalArray2 namespace testMultiDimensionalArray3 { void f() { char buf[2][3]; // expected-note {{'buf' initialized here}} long *lp = ::new (&buf[1][1]) long; // expected-warning{{Storage provided to placement new is only 2 bytes, whereas the allocated type requires 8 bytes}} expected-note 1 {{}} (void)lp; } } // namespace testMultiDimensionalArray3 namespace testHierarchy { struct Base { char a[2]; }; struct Derived : Base { char x[2]; int y; }; void f() { Base b; // expected-note {{'b' initialized here}} Derived *dp = ::new (&b) Derived; // expected-warning{{Storage provided to placement new is only 2 bytes, whereas the allocated type requires 8 bytes}} expected-note 1 {{}} (void)dp; } } // namespace testHierarchy