[Boost-bugs] [Boost C++ Libraries] #5674: assertion failed in boost::range::copy_n()

Subject: [Boost-bugs] [Boost C++ Libraries] #5674: assertion failed in boost::range::copy_n()
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2011-07-06 15:07:07


#5674: assertion failed in boost::range::copy_n()
-----------------------------------+----------------------------------------
 Reporter: farid@… | Owner: neilgroves
     Type: Patches | Status: new
Milestone: To Be Determined | Component: range
  Version: Boost 1.46.1 | Severity: Problem
 Keywords: copy_n |
-----------------------------------+----------------------------------------
 The program below fails on assert:

 {{{
 #!cpp
 #include <boost/range/iterator_range.hpp>
 #include <boost/range/algorithm_ext/copy_n.hpp>

 int main(int argc, char* argv[])
 {
     int src[5] = { 1, 2, 3, 4, 5 };
     int dst[5];

     boost::copy_n(boost::make_iterator_range(src, src + 5), 5, dst);

     return 0;
 }
 }}}


 {{{
 Assertion failed: n < static_cast<Size>(boost::distance(rng)), file
 boost_1_46_1/boost/range/algorithm_ext/copy_n.hpp, line 38
 }}}


 Proposed patch:


 {{{
 --- boost/range/algorithm_ext/copy_n.hpp
 +++ boost/range/algorithm_ext/copy_n.hpp
 @@ -30,12 +30,12 @@
  ///
  /// \pre SinglePassRange is a model of the SinglePassRangeConcept
  /// \pre OutputIterator is a model of the OutputIteratorConcept
 -/// \pre 0 <= n < distance(rng)
 +/// \pre 0 <= n <= distance(rng)
  template< class SinglePassRange, class Size, class OutputIterator >
  inline OutputIterator copy_n(const SinglePassRange& rng, Size n,
 OutputIterator out)
  {
      BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<const
 SinglePassRange> ));
 - BOOST_ASSERT( n < static_cast<Size>(boost::distance(rng)) );
 + BOOST_ASSERT( n <= static_cast<Size>(boost::distance(rng)) );
      BOOST_ASSERT( n >= static_cast<Size>(0) );

      BOOST_DEDUCED_TYPENAME range_iterator<const SinglePassRange>::type
 source = boost::begin(rng);
 }}}

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/5674>
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:06 UTC