
"David Whetstone" <mr.fixit@mac.com> wrote in message news:dqa00f$73r$1@sea.gmane.org...
While investigating basic_path::append (please see my previous posts), I found something a bit suspect.
template<class String, class Traits> template <class InputIterator> basic_path<String, Traits> & basic_path<String, Traits>::append( InputIterator first, InputIterator last ) { if ( detail::is_separator<path_type>( *first ) && detail::is_separator<path_type>( *(first+1) ) && *(first+2) == colon<path_type>::value ) first += 3;
What if first == last? Worse, what if 'last' is the typical past-the-end (dereferencing undefined) value?
Nice catch! The code was a cut-and-past from the previous function, where the input was zero-terminated, and thus correct in that context but not in the additional context. There was also a more subtle bug. The code was supposed to require only input iterators, yet in fact required random access iterators. If, as seems likely, C++0x gets concept checking then this kind of requirements-failure error will get detected by the compiler.
Consider the following test-cases: ...
I've added these - thanks! It will be a couple of days before the fix appears in CVS - it will be part of a update addressing several other issues raised recently on the list. The code is done and tested on Windows, but needs to be tested on a POSIX system before committing to the CVS HEAD. Thanks for the report, --Beman