Две проблемы с адресом Sanitizer

В хобби-проекте я использую адресное дезинфицирующее средство (-fsanitize = address)
и g ++ — 6 (Homebrew GCC 6.3.0_1) 6.3.0.

Я получил ошибку, которую я не понимаю, а именно:

==94266==AddressSanitizer CHECK failed: ../../../../libsanitizer/asan/asan_globals.cc:146 "((AddrIsAlignedByGranularity(g->size_with_redzone))) != (0)" (0x0, 0x0)
#0 0x10b60cd3d in __asan::AsanCheckFailed(char const*, int, char const*, unsigned long long, unsigned long long) (libasan.3.dylib+0x5dd3d)
#1 0x10b612be3 in __sanitizer::CheckFailed(char const*, int, char const*, unsigned long long, unsigned long long) (libasan.3.dylib+0x63be3)

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

Итак, моя следующая попытка — создать минимальный пример проблемы, и я придумал следующее:

// a.cpp

#include <iostream>
#include <regex>
#include <string>

using namespace std;

void a(const std::string &s)
{
regex re_a("foo (.+)");
smatch pieces;

if (regex_match(s, pieces, re_a))
{
cout << "foo with " << pieces[1].str() << endl;
}
}

// m.cpp
#include <string>
#include <regex>

void a(const std::string &s);

int main(int argc, char** argv)
{
std::regex re("123");

a("foo test 123");
}

Если я скомпилирую с «g ++ — 6 -fsanitize = address a.cpp m.cpp», а затем запустлю «./a.out», программа зависнет навсегда, а «g ++ — 6 a.cpp m.cpp» с последующим « ./a.out «просто работает как положено.

Это не совсем то, что я хотел продемонстрировать здесь (так как я не получаю ошибку проверки адреса AddressSanitizer), но проблемы могут быть связаны?

Я также вижу некоторые из них, только для полноты:
ld: warning: direct access in function '__GLOBAL__sub_D_00099_0_a.cpp' from file '/var/folders/lq/t18hc5bn0c5bxf7h7nn609f40000gp/T//ccTC4rgj.o' to global weak symbol 'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > std::__cxx11::regex_traits<char>::lookup_collatename<char const*>(char const*, char const*) const::__collatenames' from file '/var/folders/lq/t18hc5bn0c5bxf7h7nn609f40000gp/T//ccTC4rgj.o' means the weak symbol cannot be overridden at runtime. This was likely caused by different translation units being compiled with different visibility settings.

редактировать: забыл упомянуть одну деталь, которую я также заметил. Если я закомментирую регулярное выражение var ‘re’ в m.cpp, проблема также полностью исчезнет.

Спасибо за любую помощь!

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector