diff options
Diffstat (limited to 'gcc-4.9/libstdc++-v3/include/ext/sso_string_base.h')
-rw-r--r-- | gcc-4.9/libstdc++-v3/include/ext/sso_string_base.h | 44 |
1 files changed, 35 insertions, 9 deletions
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> |