C ++ регулярное выражение Segfault на длинные последовательности

Я анализировал дамп StackOverflow и пришел наэтот казалось бы, невинный вопрос с небольшими, почти невидимыми деталями о том, что у него 22311 пробелов в конце текста.

Я использую std :: regex (почему-то они работают для меня лучше, чем boost :: regex), чтобы заменить все непрерывные пробелы одним пробелом, например так:

std::regex space_regex("\\s+", std::regex::optimize);
...
std::regex_replace(out, in, in + strlen(in), space_regex, " ");

SIGSEGV обнаруживается, и я начал расследование.

Тестовый код:

#include <regex>
...
std::regex r("\\s+",  std::regex::optimize);
const char* bomb2 = "Small text\n\nwith several\n\nlines.";
std::string test(bomb2);
for (auto i = 0; i < N; ++i) test += " ";

std::string out = std::regex_replace(test.c_str(), r, " ");
std::cout << out << std::endl;

для (gcc 5.3.0)

$ g++ -O3 -std=c++14 regex-test.cpp -o regex-test.out

максимальнаяN до появления SIGSEGV - 21818 (для данной конкретной строки), а для

$ g++ -O0 -std=c++14 regex-test.cpp -o regex-test.out

это 12180.

«Хорошо, давайте попробуем clang, он имеет тенденцию и стремится заменить gcc» - я никогда не ошибался. С-O0 clang (v. 3.7.1) аварийно завершает работу на 9696 пробелах - меньше, чем gcc, но ненамного, но с-O3 и даже с-O2 он падает на ноль пробелов.

Crash dump представляет огромные стековые трассы (35 тыс. Кадров) рекурсивных вызовов

std::__detail::_Executor<char*, std::allocator<std::__cxx11::sub_match<char*> >, std::__cxx11::regex_traits<char>, true>::_M_dfs

Вопрос 1: Это ошибка? Если так, я должен сообщить об этом?

вопрос 2: Есть ли умный способ преодолеть проблему (кроме увеличения размера системного стека, использования других библиотек регулярных выражений и написания собственной функции для замены пробелов)?

Поправка: сообщение об ошибке создан для libstdc ++

Ответы на вопрос(1)

Ваш ответ на вопрос