我正在读取git的源代码。我加入了这个xmalloc
实现。
static void *do_xmalloc(size_t size, int gentle)
{
void *ret;
if (memory_limit_check(size, gentle))
return NULL;
ret = malloc(size);
if (!ret && !size)
ret = malloc(1);
if (!ret) {
try_to_free_routine(size);
ret = malloc(size);
if (!ret && !size)
ret = malloc(1);
if (!ret) {
if (!gentle)
die("Out of memory, malloc failed (tried to allocate %lu bytes)",
(unsigned long)size);
else {
error("Out of memory, malloc failed (tried to allocate %lu bytes)",
(unsigned long)size);
return NULL;
}
}
}
#ifdef XMALLOC_POISON
memset(ret, 0xA5, size);
#endif
return ret;
}
我想知道这个部分的目的是什么:
#ifdef XMALLOC_POISON
memset(ret, 0xA5, size);
#endif
这是一种轻松查看是否使用未初始化内存的方法。如果您使用内存,并且所有(或大部分)内容都是0xA5
,那么您就知道内存尚未初始化,并且您有未定义的行为。
如果定义了宏XMALLOC_POISON
,函数不仅会分配内存,还会将内存中的值初始化为任意垃圾值。在调试由未初始化变量引起的问题时,这可能是一种有用的技术。