我发现以下代码会导致堆泄漏,如果我使用draconian模式使用tcmalloc堆检查器对其进行检查,但LSan找不到泄漏(我假设LSan中抑制了glibc中的内部分配)
#include <string.h>
#include <netdb.h>
int foo() {
struct addrinfo hints, *res;
memset(&hints, 0, sizeof hints);
getaddrinfo("www.example.com", 0, &hints, &res);
freeaddrinfo(res);
}
int main() {
foo();
}
我进行了更多检查,发现getaddrinfo()
内部在glibc中使用scratch buffer并怀疑那些暂存缓冲区会导致内存泄漏(即使这不是有害的)
但是可惜的是,没有完整的解释并且只说“临时缓冲区是具有堆栈默认分配的可变大小缓冲区” ;;
但是什么临时缓冲区确实在做什么?
您可以参考glibc/include/scratch_buffer.h
here