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