From 8079cda8aa2e39d453112cc63af6740adfa4f270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 24 Mar 2019 17:10:21 +0100 Subject: [PATCH] Math: check for OOB access in Frustum::operator[](). --- src/Magnum/Math/Frustum.h | 10 ++++++++-- src/Magnum/Math/Test/CMakeLists.txt | 1 + src/Magnum/Math/Test/FrustumTest.cpp | 5 +++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Math/Frustum.h b/src/Magnum/Math/Frustum.h index cd300b5d6..9ac7c020c 100644 --- a/src/Magnum/Math/Frustum.h +++ b/src/Magnum/Math/Frustum.h @@ -122,9 +122,15 @@ template class Frustum { return Corrade::Containers::StaticArrayView<6, const Vector4>{_data}; } - /** @brief Plane at given index */ + /** + * @brief Plane at given index + * + * Expects that @p i is less than @cpp 6 @ce. + */ /* returns const& so [][] operations are also constexpr */ - constexpr const Vector4& operator[](std::size_t i) const { return _data[i]; } + constexpr const Vector4& operator[](std::size_t i) const { + return CORRADE_CONSTEXPR_ASSERT(i < 6, "Math::Frustum::operator[](): index" << i << "out of range"), _data[i]; + } /** @brief Left plane */ constexpr Vector4 left() const { return _data[0]; } diff --git a/src/Magnum/Math/Test/CMakeLists.txt b/src/Magnum/Math/Test/CMakeLists.txt index c65a57440..459935561 100644 --- a/src/Magnum/Math/Test/CMakeLists.txt +++ b/src/Magnum/Math/Test/CMakeLists.txt @@ -75,6 +75,7 @@ set_property(TARGET MathComplexTest MathCubicHermiteTest MathDualComplexTest + MathFrustumTest MathQuaternionTest MathDualQuaternionTest diff --git a/src/Magnum/Math/Test/FrustumTest.cpp b/src/Magnum/Math/Test/FrustumTest.cpp index 9fc2b7ac8..0bfde3772 100644 --- a/src/Magnum/Math/Test/FrustumTest.cpp +++ b/src/Magnum/Math/Test/FrustumTest.cpp @@ -283,6 +283,11 @@ void FrustumTest::data() { #endif Float b = *a.data(); CORRADE_COMPARE(b, 1.0f); + + std::ostringstream out; + Error redirectError{&out}; + a[6]; + CORRADE_COMPARE(out.str(), "Math::Frustum::operator[](): index 6 out of range\n"); } void FrustumTest::compare() {