From: Louis Dionne Date: Mon, 1 Jun 2020 20:35:42 +0000 (-0400) Subject: [libc++] Add assertions on OOB accesses in std::array when the debug mode is enabled X-Git-Tag: llvmorg-12-init~4479 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=23776a178f8379e1d9b4d79952bac916c1fa70fe;p=platform%2Fupstream%2Fllvm.git [libc++] Add assertions on OOB accesses in std::array when the debug mode is enabled Like we do for empty std::array, make sure we have assertions in place for obvious out-of-bounds issues in std::array when the debug mode is enabled (which isn't by default). --- diff --git a/libcxx/include/array b/libcxx/include/array index 6cd4d19..e73bbe7f 100644 --- a/libcxx/include/array +++ b/libcxx/include/array @@ -196,9 +196,15 @@ struct _LIBCPP_TEMPLATE_VIS array // element access: _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 - reference operator[](size_type __n) _NOEXCEPT {return __elems_[__n];} + reference operator[](size_type __n) _NOEXCEPT { + _LIBCPP_ASSERT(__n < _Size, "out-of-bounds access in std::array"); + return __elems_[__n]; + } _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 - const_reference operator[](size_type __n) const _NOEXCEPT {return __elems_[__n];} + const_reference operator[](size_type __n) const _NOEXCEPT { + _LIBCPP_ASSERT(__n < _Size, "out-of-bounds access in std::array"); + return __elems_[__n]; + } _LIBCPP_CONSTEXPR_AFTER_CXX14 reference at(size_type __n) { @@ -214,10 +220,10 @@ struct _LIBCPP_TEMPLATE_VIS array return __elems_[__n]; } - _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference front() _NOEXCEPT {return __elems_[0];} - _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference front() const _NOEXCEPT {return __elems_[0];} - _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference back() _NOEXCEPT {return __elems_[_Size - 1];} - _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference back() const _NOEXCEPT {return __elems_[_Size - 1];} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference front() _NOEXCEPT {return (*this)[0];} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference front() const _NOEXCEPT {return (*this)[0];} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference back() _NOEXCEPT {return (*this)[_Size - 1];} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference back() const _NOEXCEPT {return (*this)[_Size - 1];} _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 value_type* data() _NOEXCEPT {return __elems_;}