false-positive-suppression.cpp revision 6022c4e17c0d2ad9c43ef6bc830d394b670a4705
1// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config suppress-null-return-paths=false -verify %s 2// RUN: %clang_cc1 -analyze -analyzer-checker=core -verify -DSUPPRESSED=1 %s 3 4namespace rdar12676053 { 5 // Delta-reduced from a preprocessed file. 6 template<class T> 7 class RefCount { 8 T *ref; 9 public: 10 T *operator->() const { 11 return ref ? ref : 0; 12 } 13 }; 14 15 class string {}; 16 17 class ParserInputState { 18 public: 19 string filename; 20 }; 21 22 class Parser { 23 void setFilename(const string& f) { 24 inputState->filename = f; 25#ifndef SUPPRESSED 26// expected-warning@-2 {{Called C++ object pointer is null}} 27#endif 28 } 29 protected: 30 RefCount<ParserInputState> inputState; 31 }; 32} 33 34 35// This is the standard placement new. 36inline void* operator new(__typeof__(sizeof(int)), void* __p) throw() 37{ 38 return __p; 39} 40 41extern bool coin(); 42 43namespace References { 44 class Map { 45 int *&getNewBox(); 46 int *firstBox; 47 48 public: 49 int *&getValue(int key) { 50 if (coin()) { 51 return firstBox; 52 } else { 53 int *&newBox = getNewBox(); 54 newBox = 0; 55 return newBox; 56 } 57 } 58 59 int *&getValueIndirectly(int key) { 60 int *&valueBox = getValue(key); 61 return valueBox; 62 } 63 }; 64 65 void testMap(Map &m, int i) { 66 *m.getValue(i) = 1; 67#ifndef SUPPRESSED 68 // expected-warning@-2 {{Dereference of null pointer}} 69#endif 70 71 *m.getValueIndirectly(i) = 1; 72#ifndef SUPPRESSED 73 // expected-warning@-2 {{Dereference of null pointer}} 74#endif 75 76 int *&box = m.getValue(i); 77 extern int *getPointer(); 78 box = getPointer(); 79 *box = 1; // no-warning 80 81 int *&box2 = m.getValue(i); 82 box = 0; 83 *box = 1; // expected-warning {{Dereference of null pointer}} 84 } 85 86 class SomeClass { 87 public: 88 void doSomething(); 89 }; 90 91 SomeClass *&getSomeClass() { 92 if (coin()) { 93 extern SomeClass *&opaqueClass(); 94 return opaqueClass(); 95 } else { 96 static SomeClass *sharedClass; 97 sharedClass = 0; 98 return sharedClass; 99 } 100 } 101 102 void testClass() { 103 getSomeClass()->doSomething(); 104#ifndef SUPPRESSED 105 // expected-warning@-2 {{Called C++ object pointer is null}} 106#endif 107 108 // Separate the lvalue-to-rvalue conversion from the subsequent dereference. 109 SomeClass *object = getSomeClass(); 110 object->doSomething(); 111#ifndef SUPPRESSED 112 // expected-warning@-2 {{Called C++ object pointer is null}} 113#endif 114 } 115 116 SomeClass *getNull() { 117 return 0; 118 } 119 120 SomeClass &returnNullReference() { 121 SomeClass *x = getNull(); 122 return *x; 123#ifndef SUPPRESSED 124 // expected-warning@-2 {{Returning null reference}} 125#endif 126 } 127} 128 129class X{ 130public: 131 void get(); 132}; 133 134X *getNull() { 135 return 0; 136} 137 138void deref1(X *const &p) { 139 return p->get(); 140 #ifndef SUPPRESSED 141 // expected-warning@-2 {{Called C++ object pointer is null}} 142 #endif 143} 144 145void test1() { 146 return deref1(getNull()); 147} 148 149void deref2(X *p3) { 150 p3->get(); 151 #ifndef SUPPRESSED 152 // expected-warning@-2 {{Called C++ object pointer is null}} 153 #endif 154} 155 156void pass2(X *const &p2) { 157 deref2(p2); 158} 159 160void test2() { 161 pass2(getNull()); 162} 163 164void deref3(X *const &p2) { 165 X *p3 = p2; 166 p3->get(); 167 #ifndef SUPPRESSED 168 // expected-warning@-2 {{Called C++ object pointer is null}} 169 #endif 170} 171 172void test3() { 173 deref3(getNull()); 174} 175 176 177