aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@efficios.com>2021-10-19 15:32:08 -0400
committerSimon Marchi <simon.marchi@polymtl.ca>2021-10-25 14:51:44 -0400
commitd9f82e931394efed68858eb7c7bb5832ad888482 (patch)
tree2c8d23aac0b396bcfe433a26f16c2d80e9650423
parent61d7f128e6ea37af805be4e365f5879b0d42bb93 (diff)
downloadgdb-d9f82e931394efed68858eb7c7bb5832ad888482.zip
gdb-d9f82e931394efed68858eb7c7bb5832ad888482.tar.gz
gdb-d9f82e931394efed68858eb7c7bb5832ad888482.tar.bz2
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
-rw-r--r--gdbsupport/array-view.h28
1 files 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<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,
inclusive. */
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:
T *m_array;