From d9f82e931394efed68858eb7c7bb5832ad888482 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Tue, 19 Oct 2021 15:32:08 -0400 Subject: gdbsupport: add assertions in array_view Add assertions to ensure we don't access an array_view out of bounds. Enable these assertions only when _GLIBCXX_DEBUG is set, as we did for gdb::optional. Change-Id: Iffaee38252405073735ed123c8e57fde6b2c6be3 --- gdbsupport/array-view.h | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/gdbsupport/array-view.h b/gdbsupport/array-view.h index c41fd62..ab1d032 100644 --- a/gdbsupport/array-view.h +++ b/gdbsupport/array-view.h @@ -162,9 +162,19 @@ public: constexpr const T *end () const noexcept { return m_array + m_size; } /*constexpr14*/ reference operator[] (size_t index) noexcept - { return m_array[index]; } + { +#if defined(_GLIBCXX_DEBUG) + gdb_assert (index < m_size); +#endif + return m_array[index]; + } constexpr const_reference operator[] (size_t index) const noexcept - { return m_array[index]; } + { +#if defined(_GLIBCXX_DEBUG) + gdb_assert (index < m_size); +#endif + return m_array[index]; + } constexpr size_type size () const noexcept { return m_size; } constexpr bool empty () const noexcept { return m_size == 0; } @@ -173,12 +183,22 @@ public: /* Return a new array view over SIZE elements starting at START. */ constexpr array_view slice (size_type start, size_type size) const noexcept - { return {m_array + start, size}; } + { +#if defined(_GLIBCXX_DEBUG) + gdb_assert (start + size <= m_size); +#endif + return {m_array + start, size}; + } /* Return a new array view over all the elements after START, inclusive. */ constexpr array_view slice (size_type start) const noexcept - { return {m_array + start, size () - start}; } + { +#if defined(_GLIBCXX_DEBUG) + gdb_assert (start <= m_size); +#endif + return {m_array + start, size () - start}; + } private: T *m_array; -- cgit v1.1