Специфическое регулярное выражение Boost c работает нормально, но если я использую его в модульном тесте Boost, оно вылетает - PullRequest
0 голосов
/ 25 марта 2020

Все работало нормально с моим проектом при использовании Boost 1.58 и GCC4.9, после решения обновить его до Boost 1.72 и GCC9 у меня появилась эта проблема.

Я искал это для Некоторое время и сначала я думал, что это проблема с кодом моего проекта, но я проверил его снаружи на следующем примере, и это все еще происходит.

По сути, у меня есть этот код в основном:

std::string s = "45.125º";

const char* pattern = 
    "^\\s*(\\+|\\-)?\\s*"
    "(?:(?:\\s*((?:[0-9]|\\.)+)(?:º|d|\\s+)))?"
    "(?:(?:\\s*((?:[0-9]|\\.)+)(?:'|m|\\s+)))?"
    "(?:(?:\\s*((?:[0-9]|\\.)+)(?:\"|s|\\s+)))?"
    "\\s*$";

const boost::regex pieces_regex(pattern);
boost::cmatch pieces_match;
if(boost::regex_match(s.c_str(), pieces_match, pieces_regex, boost::match_default)) {
    std::cout << "Match" << std::endl;
    for (auto piece : pieces_match) {
       std::cout << "Piece: " << piece.str() << std::endl;
    }
}
else std::cout << "NOPE" << std::endl;
std::cout << "DONE" << std::endl;

Если я включу boost / regex.hpp и скомпилирую его с помощью:

c++ regexTest.cpp -I $BOOST_ROOT/include/ $BOOST_ROOT/lib/libboost_regex-x64.so

Все работает нормально, если я использую строку, которая соответствует ей, и если нет, то нет 't, хорошо.

Это результат выполнения:

Match
Piece: 45.125º
Piece: 
Piece: 45.125
Piece: 
Piece:
DONE 

Однако, если я помещу это в тест Boost:

BOOST_AUTO_TEST_SUITE (test_reg)
BOOST_AUTO_TEST_CASE (test_example)
{
exactly the same code as before
}
BOOST_AUTO_TEST_SUITE_END ()

А теперь включите boost / test / includes / unit_test.hpp и скомпилируйте его с помощью:

c++ regexTest.cpp -I $BOOST_ROOT/include/ $BOOST_ROOT/lib/libboost_regex-x64.so $BOOST_ROOT/lib/libboost_unit_test_framework-x64.so

Он все еще работает и тест запускается, но это происходит:

Running 1 test case...
Match
Piece: 45.125º
Piece: 
Piece: 45.125
Piece: 
Piece: 
DONE

*** No errors detected
corrupted size vs. prev_size in fastbins
Aborted (core dumped)

Если я использую более простое выражение reg, например:

 const boost::regex pieces_regex("^[0-9]+$");

, например, ничего не падает, несмотря на находясь внутри теста.

Сначала я подумал, что это проблема с моим регулярным выражением, но он, кажется, работает нормально (вне теста), а также протестировал его на https://regex101.com/.

Честно говоря, я понятия не имею, что еще можно попробовать, я начинал думать, что, возможно, произошла какая-то ошибка связи, потому что я указал что-то неправильно для CMake, но ошибка все еще происходит в этом изолированном примере. Любая идея о том, что может происходить здесь?

Примечание: ошибка происходит точно так же внутри моего проекта (он работает нормально и после сообщения «нет ошибок» он вылетает), но появляется сообщение:

malloc_consolidate(): invalid chunk size
Aborted (core dumped)
...