[Boost-bugs] [Boost C++ Libraries] #11912: boost::interprocess::flat_map use of vector::priv_forward_range_insert_expand_backwards may cause boost::container::move with same source and destination

Subject: [Boost-bugs] [Boost C++ Libraries] #11912: boost::interprocess::flat_map use of vector::priv_forward_range_insert_expand_backwards may cause boost::container::move with same source and destination
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2016-01-14 15:25:17


#11912: boost::interprocess::flat_map use of
vector::priv_forward_range_insert_expand_backwards may cause
boost::container::move with same source and destination
----------------------------+------------------------------
 Reporter: zeeshan.qazi@… | Type: Bugs
   Status: new | Milestone: To Be Determined
Component: None | Version: Boost 1.61.0
 Severity: Problem | Keywords:
----------------------------+------------------------------
 boost::interprocess::flat_map use of
 vector::priv_forward_range_insert_expand_backwards may cause
 boost::container::move with same source and destination.

 If an allocator that supports expand_backwards or expand_forwards is used
 and either of the operation succeeds with the capacity of increasing by
 the count of elements being inserted, and the elements being inserted
 happen to be placed in the direction of the expansion, then the following
 line (marked:>>>>) in vector.hpp computes the raw_gap as zero:

             //Old situation:
             // __________________________________________________
             //| raw_mem | old_begin | old_end |
             //| ___________________________|___________|_________|
             //
             //New situation:
             // __________________________________________________
             //| old_begin | new | old_end | raw_mem |
             //|___________|__________|_________|_________________|
             //
             //Now initialize the rest of memory with the last old values
             //All new elements correctly constructed, avoid new element
 destruction
>>>> '''const size_type raw_gap = s_before -
 before_plus_new;'''
             if(!value_traits::trivial_dctr){

 This results in boost::container::move being called with the same source
 and destination.

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/11912>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:19 UTC