From 4c6bea0bc7a02fb1e0dbb0d2c8194d79d3082bec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Tue, 30 Apr 2019 18:03:40 +0200 Subject: [PATCH] Remove allocation overflow warnings in some gcc versions in release mode --- include/boost/container/adaptive_pool.hpp | 8 ++++---- include/boost/container/allocator.hpp | 4 ++-- include/boost/container/new_allocator.hpp | 5 +++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/include/boost/container/adaptive_pool.hpp b/include/boost/container/adaptive_pool.hpp index d1d77bc..8fcc126 100644 --- a/include/boost/container/adaptive_pool.hpp +++ b/include/boost/container/adaptive_pool.hpp @@ -146,13 +146,13 @@ class adaptive_pool //!Returns the number of elements that could be allocated. //!Never throws size_type max_size() const BOOST_NOEXCEPT_OR_NOTHROW - { return size_type(-1)/sizeof(T); } + { return size_type(-1)/(2u*sizeof(T)); } //!Allocate memory for an array of count elements. //!Throws std::bad_alloc if there is no enough memory pointer allocate(size_type count, const void * = 0) { - if(BOOST_UNLIKELY(count > this->max_size())) + if(BOOST_UNLIKELY(count > size_type(-1)/(2u*sizeof(T)))) boost::container::throw_bad_alloc(); if(Version == 1 && count == 1){ @@ -456,13 +456,13 @@ class private_adaptive_pool //!Returns the number of elements that could be allocated. //!Never throws size_type max_size() const BOOST_NOEXCEPT_OR_NOTHROW - { return size_type(-1)/sizeof(T); } + { return size_type(-1)/(2u*sizeof(T)); } //!Allocate memory for an array of count elements. //!Throws std::bad_alloc if there is no enough memory pointer allocate(size_type count, const void * = 0) { - if(BOOST_UNLIKELY(count > this->max_size())) + if(BOOST_UNLIKELY(count > size_type(-1)/(2u*sizeof(T)))) boost::container::throw_bad_alloc(); if(Version == 1 && count == 1){ diff --git a/include/boost/container/allocator.hpp b/include/boost/container/allocator.hpp index aef620c..a14c59e 100644 --- a/include/boost/container/allocator.hpp +++ b/include/boost/container/allocator.hpp @@ -180,7 +180,7 @@ class allocator pointer allocate(size_type count, const void * hint= 0) { (void)hint; - if(count > this->max_size()) + if(count > size_type(-1)/(2u*sizeof(T))) boost::container::throw_bad_alloc(); void *ret = dlmalloc_malloc(count*sizeof(T)); if(!ret) @@ -196,7 +196,7 @@ class allocator //!Returns the maximum number of elements that could be allocated. //!Never throws BOOST_CONTAINER_FORCEINLINE size_type max_size() const BOOST_NOEXCEPT_OR_NOTHROW - { return size_type(-1)/sizeof(T); } + { return size_type(-1)/(2u*sizeof(T)); } //!Swaps two allocators, does nothing //!because this allocator is stateless diff --git a/include/boost/container/new_allocator.hpp b/include/boost/container/new_allocator.hpp index 9af015d..4801f70 100644 --- a/include/boost/container/new_allocator.hpp +++ b/include/boost/container/new_allocator.hpp @@ -154,7 +154,8 @@ class new_allocator //!Throws std::bad_alloc if there is no enough memory pointer allocate(size_type count) { - if(BOOST_UNLIKELY(count > this->max_size())) + const std::size_t max_count = std::size_t(-1)/(2*sizeof(T)); + if(BOOST_UNLIKELY(count > max_count)) throw_bad_alloc(); return static_cast(::operator new(count*sizeof(T))); } @@ -167,7 +168,7 @@ class new_allocator //!Returns the maximum number of elements that could be allocated. //!Never throws size_type max_size() const BOOST_NOEXCEPT_OR_NOTHROW - { return size_type(-1)/sizeof(T); } + { return std::size_t(-1)/(2*sizeof(T)); } //!Swaps two allocators, does nothing //!because this new_allocator is stateless