https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64646
Bug ID: 64646 Summary: New overloads of std::is_permutation dereference past-the-end iterator Product: gcc Version: 5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org #include <algorithm> #include <forward_list> #include <assert.h> int main() { std::forward_list<int> l1{0}, l2; assert( !std::is_permutation(l1.begin(), l1.end(), l2.begin(), l2.end()) ); } Aborts when compiled with -std=c++14 -D_GLIBCXX_DEBUG There's a missing range check: --- a/libstdc++-v3/include/bits/stl_algo.h +++ b/libstdc++-v3/include/bits/stl_algo.h @@ -3604,7 +3607,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Efficiently compare identical prefixes: O(N) if sequences // have the same elements in the same order. - for (; __first1 != __last1; ++__first1, ++__first2) + for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2) if (!__pred(__first1, __first2)) break;