AddressSanitizer的内存泄漏假象

最近在开发一个小的C++项目,由于ASan比较便于在开发阶段帮助发现内存问题,所以在编译设置里默认都是打开的,它工作的很好,帮助团队发现了不少问题。

昨天给项目增加了进程粒度的资源监控,发现进程启动后内存会持续增长,具体去定位的话,会看到非常奇怪的现象,就是它似乎会在不可能泄漏的地方泄漏,比如一个很普通的文件内容读取:

std::ifstream f;
f.open(fileName, std::ios::in);
if (!f.is_open())
{
    LOG(WARNING) << "Failed to open File [" << fileName << "].";
    return false;
}
std::string line;
while (std::getline(f, line))
{
    str += line;
}
f.close();

实在是看不出有什么内存泄漏点,但只要一调用,内存就会缓慢增长,跑一晚上甚至能增长几百M。

因为平时开发ASan默认开着并没有检测到,只能上valgrind:

valgrind --leak-check=full ./output/bin/test

然后尴尬的一幕出现了,内存的持续增长竟然是因为ASan,看起来是检测机制需要确保RedZone不释放导致的内存溢出假象。

==127662== by 0x495E2B6: __sanitizer::Die() (sanitizer_termination.cpp:59)
==127662== by 0x4934398: __asan::AsanCheckDynamicRTPrereqs() (asan_linux.cpp:181)
==127662== by 0x4940544: __asan::AsanInitInternal() [clone .part.0] (asan_rtl.cpp:420)

关闭ASan后现象消失,一切正常,记录以下,以便提醒。

yan 5.23

欢迎关注下方“非著名资深码农“公众号进行交流~

发表评论

邮箱地址不会被公开。