From 273682355a32827658568757a76830864249a12d Mon Sep 17 00:00:00 2001 From: nogitsune-youkai Date: Sat, 26 Sep 2026 19:30:06 +0300 Subject: [PATCH] Fix exception safety in util::stack_vector::push_back --- src/util/stack_vector.hpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/util/stack_vector.hpp b/src/util/stack_vector.hpp index 715ca3717..a58777845 100644 --- a/src/util/stack_vector.hpp +++ b/src/util/stack_vector.hpp @@ -48,21 +48,25 @@ namespace util { } void push_back(const T& value) { - if (size_ < capacity) { - auto data = reinterpret_cast(data_.ptr() + (size_++)); - new (data) T(value); - } else { + if (size_ >= capacity) { throw std::overflow_error("stack vector capacity exceeded"); } + + void* p = data_.data + size_ * sizeof(T); + ::new (p) T(value); + + ++size_; } void push_back(T&& value) { - if (size_ < capacity) { - auto data = reinterpret_cast(data_.ptr() + (size_++)); - new (data) T(std::move(value)); - } else { + if (size_ >= capacity) { throw std::overflow_error("stack vector capacity exceeded"); } + + void* p = data_.data + size_ * sizeof(T); + ::new (p) T(std::move(value)); + + ++size_; } void pop_back() { @@ -76,7 +80,7 @@ namespace util { void clear() { for (int i = 0; i < size_; ++i) { - data_.ptr()[i].~T(); + data_.ptr()[i].~T(); } size_ = 0; }