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
This commit is contained in:
Simon Marchi 2021-10-19 15:32:08 -04:00 committed by Simon Marchi
parent 61d7f128e6
commit d9f82e9313

View file

@ -162,9 +162,19 @@ public:
constexpr const T *end () const noexcept { return m_array + m_size; } constexpr const T *end () const noexcept { return m_array + m_size; }
/*constexpr14*/ reference operator[] (size_t index) noexcept /*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 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 size_type size () const noexcept { return m_size; }
constexpr bool empty () const noexcept { return m_size == 0; } 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. */ /* Return a new array view over SIZE elements starting at START. */
constexpr array_view<T> slice (size_type start, size_type size) const noexcept constexpr array_view<T> 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, /* Return a new array view over all the elements after START,
inclusive. */ inclusive. */
constexpr array_view<T> slice (size_type start) const noexcept constexpr array_view<T> 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: private:
T *m_array; T *m_array;