C ++ regex segfault en secuencias largas
Estaba analizando el volcado de stackoverflow y aparecí enesta pregunta aparentemente inocente con detalles pequeños, casi invisibles, que tiene 22311 espacios al final del texto.
Estoy usando std :: regex (de alguna manera funcionan mejor para mí que boost :: regex) para reemplazar todos los espacios en blanco continuos con un solo espacio como este:
std::regex space_regex("\\s+", std::regex::optimize);
...
std::regex_replace(out, in, in + strlen(in), space_regex, " ");
SIGSEGV aparece y he comenzado a investigar.
Código de prueba:
#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;
para (gcc 5.3.0)
$ g++ -O3 -std=c++14 regex-test.cpp -o regex-test.out
máximoN
antes de que aparezca SIGSEGV es 21818 (para esta cadena en particular), y para
$ g++ -O0 -std=c++14 regex-test.cpp -o regex-test.out
es 12180.
'Ok, intentemos con el sonido metálico, es tendencia y apunta a reemplazar gcc', nunca me he equivocado tanto. Con-O0
Clang (v. 3.7.1) se bloquea en 9696 espacios - menos que gcc, pero no mucho, pero con-O3
e incluso con-O2
se estrella en CERO espacios.
Crash dump presenta enormes stacktraces (35k frames) de llamadas recursivas de
std::__detail::_Executor<char*, std::allocator<std::__cxx11::sub_match<char*> >, std::__cxx11::regex_traits<char>, true>::_M_dfs
Pregunta 1: ¿Es esto un error? Si es así, ¿debo informarlo?
Pregunta 2: ¿Hay una manera inteligente de superar el problema (aparte de aumentar el tamaño de la pila del sistema, probar otras bibliotecas de expresiones regulares y escribir funciones propias para reemplazar los espacios en blanco)?
Enmienda: informe de error creado para libstdc ++