brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.2 KiB · 2f9ed7f Raw
230 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-config suppress-null-return-paths=false -verify %s2// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify -DSUPPRESSED=1 %s3 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 SUPPRESSED26// expected-warning@-2 {{Called C++ object pointer is null}}27#endif28    }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 43class SomeClass {44public:45  void doSomething();46};47 48namespace References {49  class Map {50    int *&getNewBox();51    int *firstBox;52 53  public:54    int *&getValue(int key) {55      if (coin()) {56        return firstBox;57      } else {58        int *&newBox = getNewBox();59        newBox = 0;60        return newBox;61      }62    }63 64    int *&getValueIndirectly(int key) {65      int *&valueBox = getValue(key);66      return valueBox;67    }68  };69 70  void testMap(Map &m, int i) {71    *m.getValue(i) = 1;72#ifndef SUPPRESSED73    // expected-warning@-2 {{Dereference of null pointer}}74#endif75 76    *m.getValueIndirectly(i) = 1;77#ifndef SUPPRESSED78    // expected-warning@-2 {{Dereference of null pointer}}79#endif80 81    int *&box = m.getValue(i);82    extern int *getPointer();83    box = getPointer();84    *box = 1; // no-warning85 86    int *&box2 = m.getValue(i);87    box2 = 0;88    *box2 = 1; // expected-warning {{Dereference of null pointer}}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 SUPPRESSED105    // expected-warning@-2 {{Called C++ object pointer is null}}106#endif107 108    // Separate the lvalue-to-rvalue conversion from the subsequent dereference.109    SomeClass *object = getSomeClass();110    object->doSomething();111#ifndef SUPPRESSED112    // expected-warning@-2 {{Called C++ object pointer is null}}113#endif114  }115 116  SomeClass *getNull() {117    return 0;118  }119 120  SomeClass &returnNullReference() {121    SomeClass *x = getNull();122    return *x;123#ifndef SUPPRESSED124    // expected-warning@-2 {{Returning null reference}}125#endif126  }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 SUPPRESSED141	  // expected-warning@-2 {{Called C++ object pointer is null}}142	#endif143}144 145void test1() {146	return deref1(getNull());147}148 149void deref2(X *p3) {150	p3->get();151	#ifndef SUPPRESSED152	  // expected-warning@-2 {{Called C++ object pointer is null}}153	#endif154}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 SUPPRESSED168	  // expected-warning@-2 {{Called C++ object pointer is null}}169	#endif170}171 172void test3() {173	deref3(getNull());174}175 176 177namespace Cleanups {178  class NonTrivial {179  public:180    ~NonTrivial();181 182    SomeClass *getNull() {183      return 0;184    }185  };186 187  void testImmediate() {188    NonTrivial().getNull()->doSomething();189#ifndef SUPPRESSED190    // expected-warning@-2 {{Called C++ object pointer is null}}191#endif192  }193 194  void testAssignment() {195    SomeClass *ptr = NonTrivial().getNull();196    ptr->doSomething();197#ifndef SUPPRESSED198    // expected-warning@-2 {{Called C++ object pointer is null}}199#endif200  }201 202  void testArgumentHelper(SomeClass *arg) {203    arg->doSomething();204#ifndef SUPPRESSED205    // expected-warning@-2 {{Called C++ object pointer is null}}206#endif207  }208 209  void testArgument() {210    testArgumentHelper(NonTrivial().getNull());211  }212}213 214class Bear *getNullBear() { return nullptr; }215class Bear {216public:217  void brum() const;218};219class Door {220public:221  Door() : ptr(getNullBear()) {222    ptr->brum();223#ifndef SUPPRESSED224    // expected-warning@-2 {{Called C++ object pointer is null}}225#endif226  }227private:228  Bear* ptr;229};230