diff options
Diffstat (limited to 'gcc-4.9/libstdc++-v3/include/ext')
-rw-r--r-- | gcc-4.9/libstdc++-v3/include/ext/new_allocator.h | 7 | ||||
-rw-r--r-- | gcc-4.9/libstdc++-v3/include/ext/sso_string_base.h | 44 | ||||
-rw-r--r-- | gcc-4.9/libstdc++-v3/include/ext/vstring.h | 39 |
3 files changed, 81 insertions, 9 deletions
diff --git a/gcc-4.9/libstdc++-v3/include/ext/new_allocator.h b/gcc-4.9/libstdc++-v3/include/ext/new_allocator.h index 996a2195e..ee9333e1f 100644 --- a/gcc-4.9/libstdc++-v3/include/ext/new_allocator.h +++ b/gcc-4.9/libstdc++-v3/include/ext/new_allocator.h @@ -104,10 +104,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp))); } +#ifdef __GXX_DELETE_WITH_SIZE__ + // __p is not permitted to be a null pointer. + void + deallocate(pointer __p, size_type __t) + { ::operator delete(__p, __t * sizeof(_Tp)); } +#else // __p is not permitted to be a null pointer. void deallocate(pointer __p, size_type) { ::operator delete(__p); } +#endif size_type max_size() const _GLIBCXX_USE_NOEXCEPT diff --git a/gcc-4.9/libstdc++-v3/include/ext/sso_string_base.h b/gcc-4.9/libstdc++-v3/include/ext/sso_string_base.h index 80c88aeb5..3ad4e9547 100644 --- a/gcc-4.9/libstdc++-v3/include/ext/sso_string_base.h +++ b/gcc-4.9/libstdc++-v3/include/ext/sso_string_base.h @@ -85,6 +85,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { if (!_M_is_local()) _M_destroy(_M_allocated_capacity); +#if __google_stl_debug_dangling_string + else { + // Wipe local storage for destructed string with 0xCD. + // This mimics what DebugAllocation does to free()d memory. + __builtin_memset(_M_local_data, 0xcd, sizeof(_M_local_data)); + } +#endif } void @@ -168,15 +175,29 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_leak() { } void - _M_set_length(size_type __n) + _M_set_length_no_wipe(size_type __n) { _M_length(__n); traits_type::assign(_M_data()[__n], _CharT()); } + void + _M_set_length(size_type __n) + { +#if __google_stl_debug_dangling_string + if (__n + 1 < _M_length()) + { + // Wipe the storage with 0xCD. + // Also wipes the old NUL terminator. + __builtin_memset(_M_data() + __n + 1, 0xcd, _M_length() - __n); + } +#endif + _M_set_length_no_wipe(__n); + } + __sso_string_base() : _M_dataplus(_M_local_data) - { _M_set_length(0); } + { _M_set_length_no_wipe(0); } __sso_string_base(const _Alloc& __a); @@ -193,7 +214,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION const _Alloc& __a); ~__sso_string_base() - { _M_dispose(); } + { + _M_dispose(); +#ifdef __google_stl_debug_dangling_string + __builtin_memset(this, 0xcd, sizeof(*this)); +#endif + } _CharT_alloc_type& _M_get_allocator() @@ -335,7 +361,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __sso_string_base<_CharT, _Traits, _Alloc>:: __sso_string_base(const _Alloc& __a) : _M_dataplus(__a, _M_local_data) - { _M_set_length(0); } + { _M_set_length_no_wipe(0); } template<typename _CharT, typename _Traits, typename _Alloc> __sso_string_base<_CharT, _Traits, _Alloc>:: @@ -361,9 +387,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_capacity(__rcs._M_allocated_capacity); } - _M_set_length(__rcs._M_length()); + _M_set_length_no_wipe(__rcs._M_length()); __rcs._M_data(__rcs._M_local_data); - __rcs._M_set_length(0); + __rcs._M_set_length_no_wipe(0); } #endif @@ -425,7 +451,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __throw_exception_again; } - _M_set_length(__len); + _M_set_length_no_wipe(__len); } template<typename _CharT, typename _Traits, typename _Alloc> @@ -457,7 +483,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __throw_exception_again; } - _M_set_length(__dnew); + _M_set_length_no_wipe(__dnew); } template<typename _CharT, typename _Traits, typename _Alloc> @@ -474,7 +500,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (__n) this->_S_assign(_M_data(), __n, __c); - _M_set_length(__n); + _M_set_length_no_wipe(__n); } template<typename _CharT, typename _Traits, typename _Alloc> diff --git a/gcc-4.9/libstdc++-v3/include/ext/vstring.h b/gcc-4.9/libstdc++-v3/include/ext/vstring.h index 749d370f9..45d807961 100644 --- a/gcc-4.9/libstdc++-v3/include/ext/vstring.h +++ b/gcc-4.9/libstdc++-v3/include/ext/vstring.h @@ -39,6 +39,21 @@ #include <ext/rc_string_base.h> #include <ext/sso_string_base.h> +#if __google_stl_debug_string && !defined(_GLIBCXX_DEBUG) +# undef _GLIBCXX_DEBUG_ASSERT +# undef _GLIBCXX_DEBUG_PEDASSERT +// Perform additional checks (but only in this file). +# define _GLIBCXX_DEBUG_ASSERT(_Condition) \ + if (! (_Condition)) { \ + char buf[512]; \ + __builtin_snprintf(buf, sizeof(buf), \ + "%s:%d: %s: Assertion '%s' failed.\n", \ + __FILE__, __LINE__, __func__, # _Condition); \ + std::__throw_runtime_error(buf); \ + } +# define _GLIBCXX_DEBUG_PEDASSERT(_Condition) _GLIBCXX_DEBUG_ASSERT(_Condition) +#endif + namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -536,7 +551,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION const_reference operator[] (size_type __pos) const _GLIBCXX_NOEXCEPT { +#if __google_stl_debug_string && !defined(_GLIBCXX_DEBUG) + if (__pos > this->size()) + std::__throw_out_of_range_fmt(__N("__versa_string::operator[]: __pos " + "(which is %zu) > this->size() " + "(which is %zu)"), + __pos, this->size()); +#else _GLIBCXX_DEBUG_ASSERT(__pos <= this->size()); +#endif return this->_M_data()[__pos]; } @@ -555,7 +578,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { // Allow pos == size() both in C++98 mode, as v3 extension, // and in C++11 mode. +#if __google_stl_debug_string && !defined(_GLIBCXX_DEBUG) + if (__pos > this->size()) + std::__throw_out_of_range_fmt(__N("__versa_string::operator[]: __pos " + "(which is %zu) > this->size() " + "(which is %zu)"), + __pos, this->size()); +#else _GLIBCXX_DEBUG_ASSERT(__pos <= this->size()); +#endif // In pedantic mode be strict in C++98 mode. _GLIBCXX_DEBUG_PEDASSERT(__cplusplus >= 201103L || __pos < this->size()); @@ -2960,4 +2991,12 @@ _GLIBCXX_END_NAMESPACE_VERSION #include "vstring.tcc" +#if __google_stl_debug_string && !defined(_GLIBCXX_DEBUG) +// Undo our defines, so they don't affect anything else. +# undef _GLIBCXX_DEBUG_ASSERT +# undef _GLIBCXX_DEBUG_PEDASSERT +# define _GLIBCXX_DEBUG_ASSERT(_Condition) +# define _GLIBCXX_DEBUG_PEDASSERT(_Condition) +#endif + #endif /* _VSTRING_H */ |