system-header-simulator-cxx.h revision e600d4be7d01661ab7601f9ef9c4d3236c377385
1// Like the compiler, the static analyzer treats some functions differently if 2// they come from a system header -- for example, it is assumed that system 3// functions do not arbitrarily free() their parameters, and that some bugs 4// found in system headers cannot be fixed by the user and should be 5// suppressed. 6#pragma clang system_header 7 8namespace std { 9 template <class T1, class T2> 10 struct pair { 11 T1 first; 12 T2 second; 13 14 pair() : first(), second() {} 15 pair(const T1 &a, const T2 &b) : first(a), second(b) {} 16 17 template<class U1, class U2> 18 pair(const pair<U1, U2> &other) : first(other.first), second(other.second) {} 19 }; 20 21 typedef __typeof__(sizeof(int)) size_t; 22 23 template<typename T> 24 class vector { 25 T *_start; 26 T *_finish; 27 T *_end_of_storage; 28 public: 29 vector() : _start(0), _finish(0), _end_of_storage(0) {} 30 ~vector(); 31 32 size_t size() const { 33 return size_t(_finish - _start); 34 } 35 36 void push_back(); 37 T pop_back(); 38 39 T &operator[](size_t n) { 40 return _start[n]; 41 } 42 43 const T &operator[](size_t n) const { 44 return _start[n]; 45 } 46 47 T *begin() { return _start; } 48 const T *begin() const { return _start; } 49 50 T *end() { return _finish; } 51 const T *end() const { return _finish; } 52 }; 53 54 class exception { 55 public: 56 exception() throw(); 57 virtual ~exception() throw(); 58 virtual const char *what() const throw() { 59 return 0; 60 } 61 }; 62 63 class bad_alloc : public exception { 64 public: 65 bad_alloc() throw(); 66 bad_alloc(const bad_alloc&) throw(); 67 bad_alloc& operator=(const bad_alloc&) throw(); 68 virtual const char* what() const throw() { 69 return 0; 70 } 71 }; 72 73 struct nothrow_t {}; 74 75 extern const nothrow_t nothrow; 76 77 template<class InputIter, class OutputIter> 78 OutputIter copy(InputIter II, InputIter IE, OutputIter OI) { 79 while (II != IE) 80 *OI++ = *II++; 81 return OI; 82 } 83 84 struct input_iterator_tag { }; 85 struct output_iterator_tag { }; 86 struct forward_iterator_tag : public input_iterator_tag { }; 87 struct bidirectional_iterator_tag : public forward_iterator_tag { }; 88 struct random_access_iterator_tag : public bidirectional_iterator_tag { }; 89 90 template <class _Tp> 91 class allocator {}; 92 93 template <class _Tp, class _Alloc> 94 class __list_imp 95 {}; 96 97 template <class _Tp, class _Alloc = allocator<_Tp> > 98 class list 99 : private __list_imp<_Tp, _Alloc> 100 { 101 public: 102 void pop_front() { 103 // Fake use-after-free. 104 // No warning is expected as we are suppressing warning comming 105 // out of std::list. 106 int z = 0; 107 z = 5/z; 108 } 109 bool empty() const; 110 }; 111 112} 113 114void* operator new(std::size_t, const std::nothrow_t&) throw(); 115void* operator new[](std::size_t, const std::nothrow_t&) throw(); 116void operator delete(void*, const std::nothrow_t&) throw(); 117void operator delete[](void*, const std::nothrow_t&) throw(); 118 119void* operator new (std::size_t size, void* ptr) throw() { return ptr; }; 120void* operator new[] (std::size_t size, void* ptr) throw() { return ptr; }; 121void operator delete (void* ptr, void*) throw() {}; 122void operator delete[] (void* ptr, void*) throw() {}; 123