| // This is a fake system header with divide-by-zero bugs introduced in |
| // c++ std library functions. We use these bugs to test hard-coded |
| // suppression of diagnostics within standard library functions that are known |
| // to produce false positives. |
| |
| #pragma clang system_header |
| |
| typedef unsigned char uint8_t; |
| |
| typedef __typeof__(sizeof(int)) size_t; |
| void *memmove(void *s1, const void *s2, size_t n); |
| |
| namespace std { |
| |
| template <class _Tp> |
| class allocator { |
| public: |
| void deallocate(void *p) { |
| ::delete p; |
| } |
| }; |
| |
| template <class _Alloc> |
| class allocator_traits { |
| public: |
| static void deallocate(void *p) { |
| _Alloc().deallocate(p); |
| } |
| }; |
| |
| template <class _Tp, class _Alloc> |
| class __list_imp |
| {}; |
| |
| template <class _Tp, class _Alloc = allocator<_Tp> > |
| class list |
| : private __list_imp<_Tp, _Alloc> |
| { |
| public: |
| void pop_front() { |
| // Fake use-after-free. |
| // No warning is expected as we are suppressing warning coming |
| // out of std::list. |
| int z = 0; |
| z = 5/z; |
| } |
| bool empty() const; |
| }; |
| |
| // basic_string |
| template<class _CharT, class _Alloc = allocator<_CharT> > |
| class __attribute__ ((__type_visibility__("default"))) basic_string { |
| bool isLong; |
| union { |
| _CharT localStorage[4]; |
| _CharT *externalStorage; |
| |
| void assignExternal(_CharT *newExternal) { |
| externalStorage = newExternal; |
| } |
| } storage; |
| |
| typedef allocator_traits<_Alloc> __alloc_traits; |
| |
| public: |
| basic_string(); |
| |
| void push_back(int c) { |
| // Fake error trigger. |
| // No warning is expected as we are suppressing warning coming |
| // out of std::basic_string. |
| int z = 0; |
| z = 5/z; |
| } |
| |
| _CharT *getBuffer() { |
| return isLong ? storage.externalStorage : storage.localStorage; |
| } |
| |
| basic_string &operator +=(int c) { |
| // Fake deallocate stack-based storage. |
| // No warning is expected as we are suppressing warnings within |
| // std::basic_string. |
| __alloc_traits::deallocate(getBuffer()); |
| } |
| |
| basic_string &operator =(const basic_string &other) { |
| // Fake deallocate stack-based storage, then use the variable in the |
| // same union. |
| // No warning is expected as we are suppressing warnings within |
| // std::basic_string. |
| __alloc_traits::deallocate(getBuffer()); |
| storage.assignExternal(new _CharT[4]); |
| } |
| }; |
| |
| template<class _Engine, class _UIntType> |
| class __independent_bits_engine { |
| public: |
| // constructors and seeding functions |
| __independent_bits_engine(_Engine& __e, size_t __w); |
| }; |
| |
| template<class _Engine, class _UIntType> |
| __independent_bits_engine<_Engine, _UIntType> |
| ::__independent_bits_engine(_Engine& __e, size_t __w) |
| { |
| // Fake error trigger. |
| // No warning is expected as we are suppressing warning coming |
| // out of std::__independent_bits_engine. |
| int z = 0; |
| z = 5/z; |
| } |
| |
| #if __has_feature(cxx_decltype) |
| typedef decltype(nullptr) nullptr_t; |
| |
| template<class _Tp> |
| class shared_ptr |
| { |
| public: |
| constexpr shared_ptr(nullptr_t); |
| explicit shared_ptr(_Tp* __p); |
| |
| shared_ptr(shared_ptr&& __r) { } |
| |
| ~shared_ptr(); |
| |
| shared_ptr& operator=(shared_ptr&& __r) { |
| // Fake error trigger. |
| // No warning is expected as we are suppressing warning coming |
| // out of std::shared_ptr. |
| int z = 0; |
| z = 5/z; |
| } |
| }; |
| |
| template<class _Tp> |
| inline |
| constexpr |
| shared_ptr<_Tp>::shared_ptr(nullptr_t) { |
| } |
| |
| #endif // __has_feature(cxx_decltype) |
| } |
| |