diff options
Diffstat (limited to 'clang/test/Analysis/placement-new.cpp')
-rw-r--r-- | clang/test/Analysis/placement-new.cpp | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/clang/test/Analysis/placement-new.cpp b/clang/test/Analysis/placement-new.cpp new file mode 100644 index 00000000000..dfd057b2fa2 --- /dev/null +++ b/clang/test/Analysis/placement-new.cpp @@ -0,0 +1,141 @@ +// RUN: %clang_analyze_cc1 -std=c++11 %s \ +// RUN: -analyzer-checker=core \ +// RUN: -analyzer-checker=cplusplus.NewDelete \ +// RUN: -analyzer-checker=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 |