Это ошибка в libС++ std:: search_n ошибка?

Я сузил это, насколько могу, это похоже на ошибку...

#include <algorithm>
#include <vector>

int main(int argc, char *argv[])
{
  // Crashes
  std::vector<uint8_t> bs{1, 0, 0};
  std::search_n(bs.begin(), bs.end(), 3, 1);

  // Does not crash
  std::vector<uint8_t> bs{1, 0};
  std::search_n(bs.begin(), bs.end(), 2, 1);

  return 0;
}

Я получаю

Segmentation fault: 11

Надеюсь, что я не использую std:: search_n неправильно:)

Выполнение реализации STL в настоящее время не представляется возможным, используя LLDB.

информация о версии:

$clang --version
Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.3.0
Thread model: posix

Доказательство;)

13:06:47 ~/bug$ cat bug.cc
#include <algorithm>
#include <vector>

int main(int argc, char *argv[])
{
  std::vector<uint8_t> bs{1, 0, 0};
  std::search_n(bs.begin(), bs.end(), 3, 1);

  // std::vector<uint8_t> bs{1, 0};
  // std::search_n(bs.begin(), bs.end(), 2, 1);

  return 0;
}
13:06:52 ~/bug$ clang++ -std=c++11 -stdlib=libc++ bug.cc -o bug
13:07:36 ~/bug$ ./bug
Segmentation fault: 11
13:07:42 ~/bug$

Ответ 1

Кажется, это ошибка в search_n, она тоже сбой для меня (Xcode 4.6.1). Я думаю, что в __search_n тест

if (__first == __s)  // return __last if no element matches __value_

должно быть

if (__first >= __s)  // return __last if no element matches __value_

Что происходит, так это то, что алгоритм начинает совпадение, затем не совпадает и начинается; эта новая стартовая точка выходит за пределы __s, которая является логической последней возможной начальной точкой для длины шаблона. Старый тест проверял только на равенство, а не на "внесущность". С исправлением он больше не падает для меня.