Jordan Rose | e449edc | 2013-04-05 17:55:07 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete,unix.Malloc -std=c++11 -fblocks -verify %s |
Stephen Hines | 176edba | 2014-12-01 14:53:08 -0800 | [diff] [blame] | 2 | // RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete,cplusplus.NewDeleteLeaks,unix.Malloc -std=c++11 -DLEAKS -fblocks -verify %s |
Anton Yartsev | 6974628 | 2013-03-28 16:10:38 +0000 | [diff] [blame] | 3 | #include "Inputs/system-header-simulator-cxx.h" |
| 4 | |
Jordan Rose | e85deb3 | 2013-04-05 17:55:00 +0000 | [diff] [blame] | 5 | #ifndef LEAKS |
| 6 | // expected-no-diagnostics |
| 7 | #endif |
| 8 | |
| 9 | |
Anton Yartsev | 6974628 | 2013-03-28 16:10:38 +0000 | [diff] [blame] | 10 | void *allocator(std::size_t size); |
| 11 | |
| 12 | void *operator new[](std::size_t size) throw() { return allocator(size); } |
| 13 | void *operator new(std::size_t size) throw() { return allocator(size); } |
| 14 | void *operator new(std::size_t size, std::nothrow_t& nothrow) throw() { return allocator(size); } |
| 15 | void *operator new(std::size_t, double d); |
| 16 | |
| 17 | class C { |
| 18 | public: |
| 19 | void *operator new(std::size_t); |
| 20 | }; |
| 21 | |
| 22 | void testNewMethod() { |
| 23 | void *p1 = C::operator new(0); // no warn |
| 24 | |
| 25 | C *p2 = new C; // no warn |
| 26 | |
| 27 | C *c3 = ::new C; |
Jordan Rose | e85deb3 | 2013-04-05 17:55:00 +0000 | [diff] [blame] | 28 | } |
| 29 | #ifdef LEAKS |
Anna Zaks | 68eb4c2 | 2013-04-06 00:41:36 +0000 | [diff] [blame] | 30 | // expected-warning@-2{{Potential leak of memory pointed to by 'c3'}} |
Jordan Rose | e85deb3 | 2013-04-05 17:55:00 +0000 | [diff] [blame] | 31 | #endif |
Anton Yartsev | 6974628 | 2013-03-28 16:10:38 +0000 | [diff] [blame] | 32 | |
| 33 | void testOpNewArray() { |
Anton Yartsev | 8e452e7 | 2013-03-30 00:50:37 +0000 | [diff] [blame] | 34 | void *p = operator new[](0); // call is inlined, no warn |
| 35 | } |
Anton Yartsev | 6974628 | 2013-03-28 16:10:38 +0000 | [diff] [blame] | 36 | |
| 37 | void testNewExprArray() { |
| 38 | int *p = new int[0]; |
Jordan Rose | e85deb3 | 2013-04-05 17:55:00 +0000 | [diff] [blame] | 39 | } |
| 40 | #ifdef LEAKS |
Anna Zaks | 68eb4c2 | 2013-04-06 00:41:36 +0000 | [diff] [blame] | 41 | // expected-warning@-2{{Potential leak of memory pointed to by 'p'}} |
Jordan Rose | e85deb3 | 2013-04-05 17:55:00 +0000 | [diff] [blame] | 42 | #endif |
| 43 | |
Anton Yartsev | 6974628 | 2013-03-28 16:10:38 +0000 | [diff] [blame] | 44 | |
| 45 | //----- Custom non-placement operators |
| 46 | void testOpNew() { |
Anton Yartsev | 8e452e7 | 2013-03-30 00:50:37 +0000 | [diff] [blame] | 47 | void *p = operator new(0); // call is inlined, no warn |
| 48 | } |
Anton Yartsev | 6974628 | 2013-03-28 16:10:38 +0000 | [diff] [blame] | 49 | |
| 50 | void testNewExpr() { |
| 51 | int *p = new int; |
Jordan Rose | e85deb3 | 2013-04-05 17:55:00 +0000 | [diff] [blame] | 52 | } |
| 53 | #ifdef LEAKS |
Anna Zaks | 68eb4c2 | 2013-04-06 00:41:36 +0000 | [diff] [blame] | 54 | // expected-warning@-2{{Potential leak of memory pointed to by 'p'}} |
Jordan Rose | e85deb3 | 2013-04-05 17:55:00 +0000 | [diff] [blame] | 55 | #endif |
| 56 | |
Anton Yartsev | 6974628 | 2013-03-28 16:10:38 +0000 | [diff] [blame] | 57 | |
| 58 | //----- Custom NoThrow placement operators |
| 59 | void testOpNewNoThrow() { |
| 60 | void *p = operator new(0, std::nothrow); |
Jordan Rose | e85deb3 | 2013-04-05 17:55:00 +0000 | [diff] [blame] | 61 | } |
| 62 | #ifdef LEAKS |
Anna Zaks | 68eb4c2 | 2013-04-06 00:41:36 +0000 | [diff] [blame] | 63 | // expected-warning@-2{{Potential leak of memory pointed to by 'p'}} |
Jordan Rose | e85deb3 | 2013-04-05 17:55:00 +0000 | [diff] [blame] | 64 | #endif |
Anton Yartsev | 6974628 | 2013-03-28 16:10:38 +0000 | [diff] [blame] | 65 | |
| 66 | void testNewExprNoThrow() { |
| 67 | int *p = new(std::nothrow) int; |
Jordan Rose | e85deb3 | 2013-04-05 17:55:00 +0000 | [diff] [blame] | 68 | } |
| 69 | #ifdef LEAKS |
Anna Zaks | 68eb4c2 | 2013-04-06 00:41:36 +0000 | [diff] [blame] | 70 | // expected-warning@-2{{Potential leak of memory pointed to by 'p'}} |
Jordan Rose | e85deb3 | 2013-04-05 17:55:00 +0000 | [diff] [blame] | 71 | #endif |
Anton Yartsev | 6974628 | 2013-03-28 16:10:38 +0000 | [diff] [blame] | 72 | |
| 73 | //----- Custom placement operators |
| 74 | void testOpNewPlacement() { |
| 75 | void *p = operator new(0, 0.1); // no warn |
| 76 | } |
| 77 | |
| 78 | void testNewExprPlacement() { |
| 79 | int *p = new(0.1) int; // no warn |
| 80 | } |