NewDelete-custom.cpp revision 3d11708c491a96198ebfee49079ae458ed90eaf8
1// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.cplusplus.NewDelete,unix.Malloc -analyzer-store region -std=c++11 -fblocks -verify %s 2#include "Inputs/system-header-simulator-cxx.h" 3 4void *allocator(std::size_t size); 5 6void *operator new[](std::size_t size) throw() { return allocator(size); } 7void *operator new(std::size_t size) throw() { return allocator(size); } 8void *operator new(std::size_t size, std::nothrow_t& nothrow) throw() { return allocator(size); } 9void *operator new(std::size_t, double d); 10 11class C { 12public: 13 void *operator new(std::size_t); 14}; 15 16void testNewMethod() { 17 void *p1 = C::operator new(0); // no warn 18 19 C *p2 = new C; // no warn 20 21 C *c3 = ::new C; 22} // expected-warning{{Memory is never released; potential leak}} 23 24void testOpNewArray() { 25 void *p = operator new[](0); // call is inlined, no warn 26} 27 28void testNewExprArray() { 29 int *p = new int[0]; 30} // expected-warning{{Memory is never released; potential leak}} 31 32//----- Custom non-placement operators 33void testOpNew() { 34 void *p = operator new(0); // call is inlined, no warn 35} 36 37void testNewExpr() { 38 int *p = new int; 39} // expected-warning{{Memory is never released; potential leak}} 40 41//----- Custom NoThrow placement operators 42void testOpNewNoThrow() { 43 void *p = operator new(0, std::nothrow); 44} // expected-warning{{Memory is never released; potential leak}} 45 46void testNewExprNoThrow() { 47 int *p = new(std::nothrow) int; 48} // expected-warning{{Memory is never released; potential leak}} 49 50//----- Custom placement operators 51void testOpNewPlacement() { 52 void *p = operator new(0, 0.1); // no warn 53} 54 55void testNewExprPlacement() { 56 int *p = new(0.1) int; // no warn 57} 58