(Not) detecting bugs--Andrzej KrzemieĊski
Undefined behaviour can be dangerous.
(Not) detecting bugs
by Andrzej Krzemieński
From the article:
The following code contains a bug. A developer has spent quite some time looking for the source. The intent of this code is to iterate over two vectors simultaneously, from the first up to the one-before-last element. Thus the most interesting tools that will be employed will be boost::zip_iterator and std::prev.
#include <boost/iterator/zip_iterator.hpp> #include <boost/tuple/tuple.hpp> #include <vector> using zip_iter = boost::zip_iterator< boost::tuple< std::vector<int>::iterator, std::vector<int>::iterator > >; int main() { std::vector<int> v1 = {1, 2, 3, 4, 0}; std::vector<int> v2 = {2, 3, 5, 7, 0}; zip_iter beg {boost::make_tuple(v1.begin(), v2.begin())}; zip_iter end {boost::make_tuple(v1.end(), v2.end())}; auto process = [](zip_iter::reference){}; std::for_each(beg, std::prev(end), process); }