libc ++ std :: search_n中的这个崩溃是一个错误吗?

时间:2013-04-04 11:32:35

标签: c++ c++11 stl libc++

我尽可能缩小范围,这似乎是一个错误...

#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:)

使用LLDB,目前似乎无法单步执行STL实现。

版本信息:

$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 个答案:

答案 0 :(得分:6)

它似乎是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,这是模式长度的逻辑最后可能的起始点。旧测试只测试了平等性,而不是“超越性”。有了这个修复程序,它就不会再崩溃了。