brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · dc53af2 Raw
147 lines · c
1// This is a fake system header with divide-by-zero bugs introduced in2// c++ std library functions. We use these bugs to test hard-coded3// suppression of diagnostics within standard library functions that are known4// to produce false positives.5 6#pragma clang system_header7 8typedef unsigned char uint8_t;9 10typedef __typeof__(sizeof(int)) size_t;11void *memmove(void *s1, const void *s2, size_t n);12 13namespace std {14 15  template <class _Tp>16  class allocator {17  public:18    void deallocate(void *p) {19      ::delete p;20    }21  };22 23  template <class _Alloc>24  class allocator_traits {25  public:26    static void deallocate(void *p) {27      _Alloc().deallocate(p);28    }29  };30 31  template <class _Tp, class _Alloc>32  class __list_imp33  {};34 35  template <class _Tp, class _Alloc = allocator<_Tp> >36  class list37  : private __list_imp<_Tp, _Alloc>38  {39  public:40    void pop_front() {41      // Fake use-after-free.42      // No warning is expected as we are suppressing warning coming43      // out of std::list.44      int z = 0;45      z = 5/z;46    }47    bool empty() const;48  };49 50  // basic_string51  template<class _CharT, class _Alloc = allocator<_CharT> >52  class __attribute__ ((__type_visibility__("default"))) basic_string {53    bool isLong;54    union {55      _CharT localStorage[4];56      _CharT *externalStorage;57 58      void assignExternal(_CharT *newExternal) {59        externalStorage = newExternal;60      }61    } storage;62 63    typedef allocator_traits<_Alloc> __alloc_traits;64 65  public:66    basic_string();67 68    void push_back(int c) {69      // Fake error trigger.70      // No warning is expected as we are suppressing warning coming71      // out of std::basic_string.72      int z = 0;73      z = 5/z;74    }75 76    _CharT *getBuffer() {77      return isLong ? storage.externalStorage : storage.localStorage;78    }79 80    basic_string &operator +=(int c) {81      // Fake deallocate stack-based storage.82      // No warning is expected as we are suppressing warnings within83      // std::basic_string.84      __alloc_traits::deallocate(getBuffer());85    }86 87    basic_string &operator =(const basic_string &other) {88      // Fake deallocate stack-based storage, then use the variable in the89      // same union.90      // No warning is expected as we are suppressing warnings within91      // std::basic_string.92      __alloc_traits::deallocate(getBuffer());93      storage.assignExternal(new _CharT[4]);94    }95  };96 97template<class _Engine, class _UIntType>98class __independent_bits_engine {99public:100  // constructors and seeding functions101  __independent_bits_engine(_Engine& __e, size_t __w);102};103 104template<class _Engine, class _UIntType>105__independent_bits_engine<_Engine, _UIntType>106    ::__independent_bits_engine(_Engine& __e, size_t __w)107{108  // Fake error trigger.109  // No warning is expected as we are suppressing warning coming110  // out of std::__independent_bits_engine.111  int z = 0;112  z = 5/z;113}114 115#if __has_feature(cxx_decltype)116typedef decltype(nullptr) nullptr_t;117 118template<class _Tp>119class shared_ptr120{121public:122  constexpr shared_ptr(nullptr_t);123  explicit shared_ptr(_Tp* __p);124 125  shared_ptr(shared_ptr&& __r) { }126 127  ~shared_ptr();128 129  shared_ptr& operator=(shared_ptr&& __r) {130    // Fake error trigger.131    // No warning is expected as we are suppressing warning coming132    // out of std::shared_ptr.133    int z = 0;134    z = 5/z;135  }136};137 138template<class _Tp>139inline140constexpr141shared_ptr<_Tp>::shared_ptr(nullptr_t) {142}143 144#endif // __has_feature(cxx_decltype)145}146 147