Opened 12 years ago

Closed 12 years ago

#5162 closed Bugs (fixed)

boost::iterator_range< T* > is unsafe

Reported by: nicos@… Owned by: Neil Groves
Milestone: To Be Determined Component: range
Version: Boost 1.45.0 Severity: Problem
Keywords: Cc:

Description

The following code compiles and does not generate any warning:

#include <boost/range/iterator_range.hpp>

int main()
{
  double v[] = { 1.0,2.0,3.0 };
  boost::iterator_range<float *> r = boost::make_iterator_range( v );
}

The culprits are adl_begin, adl_end, as in this case, they perform a C-style cast from double* to float*:

      template<class IteratorT>
        struct iterator_range_impl {
            template< class ForwardRange >
            static IteratorT adl_begin( ForwardRange& r )
            {
                return IteratorT( boost::begin( r ) );
            }

            template< class ForwardRange >
            static IteratorT adl_end( ForwardRange& r )
            {
                return IteratorT( boost::end( r ) );
            }
        };

Change History (1)

comment:1 by Neil Groves, 12 years ago

Resolution: fixed
Status: newclosed

Resolved on the trunk by simply altering the code to use static_cast. Additional tests were added to ensure scenarios like those provided do not compile, while other compatible pointers continue to work as expected.

Note: See TracTickets for help on using tickets.