在一个爱好项目中,我使用地址清理程序 (-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 CHECK failed 错误),但问题可能相关吗?
我也确实看到了其中一些,只是为了完整:
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.
编辑:忘了提到我也注意到的一个细节。如果我注释掉 m.cpp 中的正则表达式 var 're',问题也会完全消失。
谢谢你的帮助!