false-positive-suppression.cpp revision c236b7327f989c1e7fe6b08a188bfef86727513d
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