@@ -742,12 +742,23 @@ class basic_monotonic_buffer_resource : public memory_resource
742742 void * result = nullptr ;
743743 if (current_buffer_->buffer && current_buffer_->remaining_buffer_size >= size_bytes)
744744 {
745- void * buffer = current_buffer_->buffer ;
746- std::size_t buffer_size = current_buffer_->remaining_buffer_size ;
747- result = std::align (alignment, size_bytes, buffer, buffer_size);
745+ CETL_DEBUG_ASSERT (current_buffer_->buffer_size >= current_buffer_->remaining_buffer_size ,
746+ " remaining_buffer_size exceeded total buffer size? We have corrupt internal logic." );
747+ const std::size_t current_buffer_size =
748+ current_buffer_->buffer_size - current_buffer_->remaining_buffer_size ;
749+ void * buffer = &static_cast <unsigned char *>(current_buffer_->buffer )[current_buffer_size];
750+ std::size_t remaining_aligned_size = current_buffer_->remaining_buffer_size ;
751+ result = std::align (alignment, size_bytes, buffer, remaining_aligned_size);
748752 if (result)
749753 {
750- current_buffer_->remaining_buffer_size = buffer_size - size_bytes;
754+ CETL_DEBUG_ASSERT (remaining_aligned_size <= current_buffer_->remaining_buffer_size ,
755+ " std::align must never increase the space parameter" );
756+ const std::size_t buffer_used =
757+ size_bytes + (current_buffer_->remaining_buffer_size - remaining_aligned_size);
758+ CETL_DEBUG_ASSERT (buffer_used <= current_buffer_->remaining_buffer_size ,
759+ " std::align must never return non-null if there isn't enough buffer remaining to "
760+ " align the pointer." );
761+ current_buffer_->remaining_buffer_size -= buffer_used;
751762 }
752763 }
753764 return result;
0 commit comments