147 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
// 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)
 | 
						|
}
 | 
						|
 |