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