QVarLengthArray: assert that the range passed to erase() is valid

We already checked that the two iterators, indvidually, are valid, but
we didn't check that the range formed by them is valid, namely that
the end iterator is reachable from the start iterator.

Add an assert, because if the range isn't valid, we run into UB in the
std::move() algorithm two lines later.

Qt 5.15 uses std::copy() here, which has the same precondition, so the
assertion would make sense there, too.

Pick-to: 6.2 5.15
Change-Id: I90b7e846455ff86383a8971bea908036684961d8
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Marc Mutz 2021-12-09 22:53:48 +01:00
parent 7670db3146
commit c38639089f

View File

@ -896,6 +896,8 @@ Q_OUTOFLINE_TEMPLATE auto QVLABase<T>::erase(const_iterator abegin, const_iterat
if (n == 0) // avoid UB in std::move() below
return data() + f;
Q_ASSERT(n > 0); // aend must be reachable from abegin
if constexpr (QTypeInfo<T>::isComplex) {
std::move(begin() + l, end(), QT_MAKE_CHECKED_ARRAY_ITERATOR(begin() + f, size() - f));
std::destroy(end() - n, end());