system-header-simulator-cxx.h revision 651f13cea278ec967336033dd032faef0e9fc2ec
18c888b10fdd2846885e8582b131fa076ce1b77b1Jordan Rose// Like the compiler, the static analyzer treats some functions differently if
28c888b10fdd2846885e8582b131fa076ce1b77b1Jordan Rose// they come from a system header -- for example, it is assumed that system
38c888b10fdd2846885e8582b131fa076ce1b77b1Jordan Rose// functions do not arbitrarily free() their parameters, and that some bugs
48c888b10fdd2846885e8582b131fa076ce1b77b1Jordan Rose// found in system headers cannot be fixed by the user and should be
58c888b10fdd2846885e8582b131fa076ce1b77b1Jordan Rose// suppressed.
681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose#pragma clang system_header
781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
8bdc0bf3f84b8771572d8401c66903c56a2e1318eAnna Zakstypedef unsigned char uint8_t;
9bdc0bf3f84b8771572d8401c66903c56a2e1318eAnna Zaks
1081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rosenamespace std {
1181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  template <class T1, class T2>
1281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  struct pair {
1381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T1 first;
1481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T2 second;
1581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
1681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    pair() : first(), second() {}
1781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    pair(const T1 &a, const T2 &b) : first(a), second(b) {}
1881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
1981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    template<class U1, class U2>
2081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    pair(const pair<U1, U2> &other) : first(other.first), second(other.second) {}
2181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  };
2281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
2381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  typedef __typeof__(sizeof(int)) size_t;
2481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
2581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  template<typename T>
2681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  class vector {
2781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T *_start;
2881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T *_finish;
2981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T *_end_of_storage;
3081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  public:
3181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    vector() : _start(0), _finish(0), _end_of_storage(0) {}
3281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    ~vector();
3381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
3481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    size_t size() const {
3581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose      return size_t(_finish - _start);
3681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    }
3781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
3881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    void push_back();
3981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T pop_back();
4081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
4181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T &operator[](size_t n) {
4281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose      return _start[n];
4381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    }
4481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
4581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    const T &operator[](size_t n) const {
4681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose      return _start[n];
4781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    }
4881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
4981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T *begin() { return _start; }
5081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    const T *begin() const { return _start; }
5181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
5281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T *end() { return _finish; }
5381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    const T *end() const { return _finish; }
5481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  };
5581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
5681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  class exception {
5781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  public:
5881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    exception() throw();
5981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    virtual ~exception() throw();
6081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    virtual const char *what() const throw() {
6181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose      return 0;
6281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    }
6381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  };
642de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev
652de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev  class bad_alloc : public exception {
662de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    public:
672de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    bad_alloc() throw();
682de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    bad_alloc(const bad_alloc&) throw();
692de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    bad_alloc& operator=(const bad_alloc&) throw();
702de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    virtual const char* what() const throw() {
712de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev      return 0;
722de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    }
732de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev  };
742de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev
752de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev  struct nothrow_t {};
762de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev
772de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev  extern const nothrow_t nothrow;
78a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose
79be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose  // libc++'s implementation
80be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose  template <class _E>
81be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose  class initializer_list
82be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose  {
83be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    const _E* __begin_;
84be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    size_t    __size_;
85be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose
86be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    initializer_list(const _E* __b, size_t __s)
87be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose      : __begin_(__b),
88be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose        __size_(__s)
89be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    {}
90be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose
91be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose  public:
92be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    typedef _E        value_type;
93be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    typedef const _E& reference;
94be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    typedef const _E& const_reference;
95be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    typedef size_t    size_type;
96be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose
97be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    typedef const _E* iterator;
98be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    typedef const _E* const_iterator;
99be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose
100be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    initializer_list() : __begin_(0), __size_(0) {}
101be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose
102be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    size_t    size()  const {return __size_;}
103be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    const _E* begin() const {return __begin_;}
104be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    const _E* end()   const {return __begin_ + __size_;}
105be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose  };
106be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose
107a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose  template<class InputIter, class OutputIter>
108a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose  OutputIter copy(InputIter II, InputIter IE, OutputIter OI) {
109a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose    while (II != IE)
110a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose      *OI++ = *II++;
111a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose    return OI;
112a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose  }
113776d3bb65c90278b9c65544b235d2ac40aea1d6eJordan Rose
114776d3bb65c90278b9c65544b235d2ac40aea1d6eJordan Rose  struct input_iterator_tag { };
115776d3bb65c90278b9c65544b235d2ac40aea1d6eJordan Rose  struct output_iterator_tag { };
116776d3bb65c90278b9c65544b235d2ac40aea1d6eJordan Rose  struct forward_iterator_tag : public input_iterator_tag { };
117776d3bb65c90278b9c65544b235d2ac40aea1d6eJordan Rose  struct bidirectional_iterator_tag : public forward_iterator_tag { };
118776d3bb65c90278b9c65544b235d2ac40aea1d6eJordan Rose  struct random_access_iterator_tag : public bidirectional_iterator_tag { };
1198b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks
1208b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  template <class _Tp>
121fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose  class allocator {
122fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose  public:
123fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose    void deallocate(void *p) {
124fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose      ::delete p;
125fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose    }
126fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose  };
127fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose
128fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose  template <class _Alloc>
129fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose  class allocator_traits {
130fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose  public:
131fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose    static void deallocate(void *p) {
132fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose      _Alloc().deallocate(p);
133fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose    }
134fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose  };
1358b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks
1368b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  template <class _Tp, class _Alloc>
1378b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  class __list_imp
1388b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  {};
1398b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks
1408b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  template <class _Tp, class _Alloc = allocator<_Tp> >
1418b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  class list
1428b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  : private __list_imp<_Tp, _Alloc>
1438b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  {
1448b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  public:
145e600d4be7d01661ab7601f9ef9c4d3236c377385Anna Zaks    void pop_front() {
146e600d4be7d01661ab7601f9ef9c4d3236c377385Anna Zaks      // Fake use-after-free.
147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // No warning is expected as we are suppressing warning coming
148e600d4be7d01661ab7601f9ef9c4d3236c377385Anna Zaks      // out of std::list.
149e600d4be7d01661ab7601f9ef9c4d3236c377385Anna Zaks      int z = 0;
150e600d4be7d01661ab7601f9ef9c4d3236c377385Anna Zaks      z = 5/z;
151e600d4be7d01661ab7601f9ef9c4d3236c377385Anna Zaks    }
1528b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks    bool empty() const;
1538b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  };
1548b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks
155bdc0bf3f84b8771572d8401c66903c56a2e1318eAnna Zaks  // basic_string
156fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose  template<class _CharT, class _Alloc = allocator<_CharT> >
157bdc0bf3f84b8771572d8401c66903c56a2e1318eAnna Zaks  class __attribute__ ((__type_visibility__("default"))) basic_string {
158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLong;
159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    union {
160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      _CharT localStorage[4];
161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      _CharT *externalStorage;
162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      void assignExternal(_CharT *newExternal) {
164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        externalStorage = newExternal;
165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } storage;
167fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose
168fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose    typedef allocator_traits<_Alloc> __alloc_traits;
169fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose
170bdc0bf3f84b8771572d8401c66903c56a2e1318eAnna Zaks  public:
171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    basic_string();
172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
173fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose    void push_back(int c) {
174fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose      // Fake error trigger.
175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // No warning is expected as we are suppressing warning coming
176fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose      // out of std::basic_string.
177fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose      int z = 0;
178fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose      z = 5/z;
179fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose    }
180fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose
181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    _CharT *getBuffer() {
182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return isLong ? storage.externalStorage : storage.localStorage;
183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
185fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose    basic_string &operator +=(int c) {
186fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose      // Fake deallocate stack-based storage.
187fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose      // No warning is expected as we are suppressing warnings within
188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // std::basic_string.
189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      __alloc_traits::deallocate(getBuffer());
190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    basic_string &operator =(const basic_string &other) {
193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Fake deallocate stack-based storage, then use the variable in the
194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // same union.
195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // No warning is expected as we are suppressing warnings within
196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // std::basic_string.
197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      __alloc_traits::deallocate(getBuffer());
198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      storage.assignExternal(new _CharT[4]);
199fda9dbf1f4d15baaedffdd4b4bb529e06172f73dJordan Rose    }
200bdc0bf3f84b8771572d8401c66903c56a2e1318eAnna Zaks  };
20181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose}
2022de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev
2032de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid* operator new(std::size_t, const std::nothrow_t&) throw();
2042de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid* operator new[](std::size_t, const std::nothrow_t&) throw();
2052de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid operator delete(void*, const std::nothrow_t&) throw();
2062de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid operator delete[](void*, const std::nothrow_t&) throw();
2072de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev
2082de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid* operator new (std::size_t size, void* ptr) throw() { return ptr; };
2092de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid* operator new[] (std::size_t size, void* ptr) throw() { return ptr; };
2102de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid operator delete (void* ptr, void*) throw() {};
2112de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid operator delete[] (void* ptr, void*) throw() {};
212