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 4 void *allocator(std::size_t size); 5 6 void *operator new[](std::size_t size) throw() { return allocator(size); } 7 void *operator new(std::size_t size) throw() { return allocator(size); } 8 void *operator new(std::size_t size, std::nothrow_t& nothrow) throw() { return allocator(size); } 9 void *operator new(std::size_t, double d); 10 11 class C { 12 public: 13 void *operator new(std::size_t); 14 }; 15 16 void 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 24 void testOpNewArray() { 25 void *p = operator new[](0); // call is inlined, no warn 26 } 27 28 void testNewExprArray() { 29 int *p = new int[0]; 30 } // expected-warning{{Memory is never released; potential leak}} 31 32 //----- Custom non-placement operators 33 void testOpNew() { 34 void *p = operator new(0); // call is inlined, no warn 35 } 36 37 void testNewExpr() { 38 int *p = new int; 39 } // expected-warning{{Memory is never released; potential leak}} 40 41 //----- Custom NoThrow placement operators 42 void testOpNewNoThrow() { 43 void *p = operator new(0, std::nothrow); 44 } // expected-warning{{Memory is never released; potential leak}} 45 46 void testNewExprNoThrow() { 47 int *p = new(std::nothrow) int; 48 } // expected-warning{{Memory is never released; potential leak}} 49 50 //----- Custom placement operators 51 void testOpNewPlacement() { 52 void *p = operator new(0, 0.1); // no warn 53 } 54 55 void testNewExprPlacement() { 56 int *p = new(0.1) int; // no warn 57 } 58