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
8 namespace std {
9 template <class T1, class T2>
10 struct pair {
11 T1 first;
12 T2 second;
13
pairpair14 pair() : first(), second() {}
pairpair15 pair(const T1 &a, const T2 &b) : first(a), second(b) {}
16
17 template<class U1, class U2>
pairpair18 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:
vector()29 vector() : _start(0), _finish(0), _end_of_storage(0) {}
30 ~vector();
31
size()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
begin()47 T *begin() { return _start; }
begin()48 const T *begin() const { return _start; }
49
end()50 T *end() { return _finish; }
end()51 const T *end() const { return _finish; }
52 };
53
54 class exception {
55 public:
56 exception() throw();
57 virtual ~exception() throw();
what()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();
what()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 // libc++'s implementation
78 template <class _E>
79 class initializer_list
80 {
81 const _E* __begin_;
82 size_t __size_;
83
initializer_list(const _E * __b,size_t __s)84 initializer_list(const _E* __b, size_t __s)
85 : __begin_(__b),
86 __size_(__s)
87 {}
88
89 public:
90 typedef _E value_type;
91 typedef const _E& reference;
92 typedef const _E& const_reference;
93 typedef size_t size_type;
94
95 typedef const _E* iterator;
96 typedef const _E* const_iterator;
97
initializer_list()98 initializer_list() : __begin_(0), __size_(0) {}
99
size()100 size_t size() const {return __size_;}
begin()101 const _E* begin() const {return __begin_;}
end()102 const _E* end() const {return __begin_ + __size_;}
103 };
104
105 template<class InputIter, class OutputIter>
copy(InputIter II,InputIter IE,OutputIter OI)106 OutputIter copy(InputIter II, InputIter IE, OutputIter OI) {
107 while (II != IE)
108 *OI++ = *II++;
109 return OI;
110 }
111
112 struct input_iterator_tag { };
113 struct output_iterator_tag { };
114 struct forward_iterator_tag : public input_iterator_tag { };
115 struct bidirectional_iterator_tag : public forward_iterator_tag { };
116 struct random_access_iterator_tag : public bidirectional_iterator_tag { };
117
118 template <class _Tp>
119 class allocator {};
120
121 template <class _Tp, class _Alloc>
122 class __list_imp
123 {};
124
125 template <class _Tp, class _Alloc = allocator<_Tp> >
126 class list
127 : private __list_imp<_Tp, _Alloc>
128 {
129 public:
pop_front()130 void pop_front() {
131 // Fake use-after-free.
132 // No warning is expected as we are suppressing warning comming
133 // out of std::list.
134 int z = 0;
135 z = 5/z;
136 }
137 bool empty() const;
138 };
139
140 }
141
142 void* operator new(std::size_t, const std::nothrow_t&) throw();
143 void* operator new[](std::size_t, const std::nothrow_t&) throw();
144 void operator delete(void*, const std::nothrow_t&) throw();
145 void operator delete[](void*, const std::nothrow_t&) throw();
146
new(std::size_t size,void * ptr)147 void* operator new (std::size_t size, void* ptr) throw() { return ptr; };
throw()148 void* operator new[] (std::size_t size, void* ptr) throw() { return ptr; };
delete(void * ptr,void *)149 void operator delete (void* ptr, void*) throw() {};
throw()150 void operator delete[] (void* ptr, void*) throw() {};
151