• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  // RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete,unix.Malloc -std=c++11 -fblocks -verify %s
2  // RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete,alpha.cplusplus.NewDeleteLeaks,unix.Malloc -std=c++11 -DLEAKS -fblocks -verify %s
3  #include "Inputs/system-header-simulator-cxx.h"
4  
5  #ifndef LEAKS
6  // expected-no-diagnostics
7  #endif
8  
9  
10  void *allocator(std::size_t size);
11  
operator new[](std::size_t size)12  void *operator new[](std::size_t size) throw() { return allocator(size); }
operator new(std::size_t size)13  void *operator new(std::size_t size) throw() { return allocator(size); }
operator new(std::size_t size,std::nothrow_t & nothrow)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  
testNewMethod()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;
28  }
29  #ifdef LEAKS
30  // expected-warning@-2{{Potential leak of memory pointed to by 'c3'}}
31  #endif
32  
testOpNewArray()33  void testOpNewArray() {
34    void *p = operator new[](0); // call is inlined, no warn
35  }
36  
testNewExprArray()37  void testNewExprArray() {
38    int *p = new int[0];
39  }
40  #ifdef LEAKS
41  // expected-warning@-2{{Potential leak of memory pointed to by 'p'}}
42  #endif
43  
44  
45  //----- Custom non-placement operators
testOpNew()46  void testOpNew() {
47    void *p = operator new(0); // call is inlined, no warn
48  }
49  
testNewExpr()50  void testNewExpr() {
51    int *p = new int;
52  }
53  #ifdef LEAKS
54  // expected-warning@-2{{Potential leak of memory pointed to by 'p'}}
55  #endif
56  
57  
58  //----- Custom NoThrow placement operators
testOpNewNoThrow()59  void testOpNewNoThrow() {
60    void *p = operator new(0, std::nothrow);
61  }
62  #ifdef LEAKS
63  // expected-warning@-2{{Potential leak of memory pointed to by 'p'}}
64  #endif
65  
testNewExprNoThrow()66  void testNewExprNoThrow() {
67    int *p = new(std::nothrow) int;
68  }
69  #ifdef LEAKS
70  // expected-warning@-2{{Potential leak of memory pointed to by 'p'}}
71  #endif
72  
73  //----- Custom placement operators
testOpNewPlacement()74  void testOpNewPlacement() {
75    void *p = operator new(0, 0.1); // no warn
76  }
77  
testNewExprPlacement()78  void testNewExprPlacement() {
79    int *p = new(0.1) int; // no warn
80  }
81