system-header-simulator-cxx.h revision be2e1b11e3350e3a6e632c71beaab83aae3824d2
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
881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rosenamespace std {
981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  template <class T1, class T2>
1081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  struct pair {
1181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T1 first;
1281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T2 second;
1381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
1481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    pair() : first(), second() {}
1581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    pair(const T1 &a, const T2 &b) : first(a), second(b) {}
1681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
1781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    template<class U1, class U2>
1881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    pair(const pair<U1, U2> &other) : first(other.first), second(other.second) {}
1981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  };
2081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
2181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  typedef __typeof__(sizeof(int)) size_t;
2281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
2381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  template<typename T>
2481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  class vector {
2581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T *_start;
2681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T *_finish;
2781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T *_end_of_storage;
2881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  public:
2981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    vector() : _start(0), _finish(0), _end_of_storage(0) {}
3081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    ~vector();
3181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
3281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    size_t size() const {
3381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose      return size_t(_finish - _start);
3481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    }
3581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
3681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    void push_back();
3781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T pop_back();
3881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
3981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T &operator[](size_t n) {
4081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose      return _start[n];
4181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    }
4281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
4381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    const T &operator[](size_t n) const {
4481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose      return _start[n];
4581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    }
4681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
4781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T *begin() { return _start; }
4881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    const T *begin() const { return _start; }
4981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
5081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T *end() { return _finish; }
5181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    const T *end() const { return _finish; }
5281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  };
5381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
5481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  class exception {
5581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  public:
5681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    exception() throw();
5781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    virtual ~exception() throw();
5881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    virtual const char *what() const throw() {
5981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose      return 0;
6081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    }
6181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  };
622de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev
632de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev  class bad_alloc : public exception {
642de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    public:
652de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    bad_alloc() throw();
662de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    bad_alloc(const bad_alloc&) throw();
672de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    bad_alloc& operator=(const bad_alloc&) throw();
682de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    virtual const char* what() const throw() {
692de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev      return 0;
702de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    }
712de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev  };
722de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev
732de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev  struct nothrow_t {};
742de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev
752de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev  extern const nothrow_t nothrow;
76a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose
77be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose  // libc++'s implementation
78be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose  template <class _E>
79be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose  class initializer_list
80be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose  {
81be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    const _E* __begin_;
82be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    size_t    __size_;
83be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose
84be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    initializer_list(const _E* __b, size_t __s)
85be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose      : __begin_(__b),
86be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose        __size_(__s)
87be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    {}
88be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose
89be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose  public:
90be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    typedef _E        value_type;
91be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    typedef const _E& reference;
92be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    typedef const _E& const_reference;
93be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    typedef size_t    size_type;
94be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose
95be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    typedef const _E* iterator;
96be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    typedef const _E* const_iterator;
97be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose
98be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    initializer_list() : __begin_(0), __size_(0) {}
99be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose
100be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    size_t    size()  const {return __size_;}
101be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    const _E* begin() const {return __begin_;}
102be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose    const _E* end()   const {return __begin_ + __size_;}
103be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose  };
104be2e1b11e3350e3a6e632c71beaab83aae3824d2Jordan Rose
105a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose  template<class InputIter, class OutputIter>
106a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose  OutputIter copy(InputIter II, InputIter IE, OutputIter OI) {
107a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose    while (II != IE)
108a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose      *OI++ = *II++;
109a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose    return OI;
110a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose  }
111776d3bb65c90278b9c65544b235d2ac40aea1d6eJordan Rose
112776d3bb65c90278b9c65544b235d2ac40aea1d6eJordan Rose  struct input_iterator_tag { };
113776d3bb65c90278b9c65544b235d2ac40aea1d6eJordan Rose  struct output_iterator_tag { };
114776d3bb65c90278b9c65544b235d2ac40aea1d6eJordan Rose  struct forward_iterator_tag : public input_iterator_tag { };
115776d3bb65c90278b9c65544b235d2ac40aea1d6eJordan Rose  struct bidirectional_iterator_tag : public forward_iterator_tag { };
116776d3bb65c90278b9c65544b235d2ac40aea1d6eJordan Rose  struct random_access_iterator_tag : public bidirectional_iterator_tag { };
1178b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks
1188b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  template <class _Tp>
1198b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  class allocator {};
1208b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks
1218b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  template <class _Tp, class _Alloc>
1228b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  class __list_imp
1238b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  {};
1248b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks
1258b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  template <class _Tp, class _Alloc = allocator<_Tp> >
1268b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  class list
1278b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  : private __list_imp<_Tp, _Alloc>
1288b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  {
1298b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  public:
130e600d4be7d01661ab7601f9ef9c4d3236c377385Anna Zaks    void pop_front() {
131e600d4be7d01661ab7601f9ef9c4d3236c377385Anna Zaks      // Fake use-after-free.
132e600d4be7d01661ab7601f9ef9c4d3236c377385Anna Zaks      // No warning is expected as we are suppressing warning comming
133e600d4be7d01661ab7601f9ef9c4d3236c377385Anna Zaks      // out of std::list.
134e600d4be7d01661ab7601f9ef9c4d3236c377385Anna Zaks      int z = 0;
135e600d4be7d01661ab7601f9ef9c4d3236c377385Anna Zaks      z = 5/z;
136e600d4be7d01661ab7601f9ef9c4d3236c377385Anna Zaks    }
1378b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks    bool empty() const;
1388b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks  };
1398b625a3f7764959d0a2ac3cd860ce1e168e0fc9bAnna Zaks
14081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose}
1412de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev
1422de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid* operator new(std::size_t, const std::nothrow_t&) throw();
1432de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid* operator new[](std::size_t, const std::nothrow_t&) throw();
1442de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid operator delete(void*, const std::nothrow_t&) throw();
1452de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid operator delete[](void*, const std::nothrow_t&) throw();
1462de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev
1472de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid* operator new (std::size_t size, void* ptr) throw() { return ptr; };
1482de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid* operator new[] (std::size_t size, void* ptr) throw() { return ptr; };
1492de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid operator delete (void* ptr, void*) throw() {};
1502de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid operator delete[] (void* ptr, void*) throw() {};
151