我正在开发四个基本内存分配例程malloc
,realloc
,calloc
和free
(与Electric Fence的操作类似)的调试实现,以在不具有此功能的嵌入式系统上调试堆损坏具有运行其他内存调试工具的资源,或者没有运行其他工具的资源(例如,GPC 4.6.3随附的PowerPC的LynxOS 7.0,以及不包含mtrace
系列的glibc和libstdc ++的专有实现功能)。
以下是GCC的calloc.c中calloc的源代码。
PTR
calloc (size_t nelem, size_t elsize)
{
register PTR ptr;
if (nelem == 0 || elsize == 0)
nelem = elsize = 1;
ptr = malloc (nelem * elsize);
if (ptr) bzero (ptr, nelem * elsize);
return ptr;
}
为什么nelem
和elsize
都等于1
都等于0
?
如果我尝试分配大小为0
的n
个块或大小为n
的0
个块,则不会导致0
个总字节而不是1
个字节的总分配?
是的,这只是错误的代码,这在libiberty / gnulib / etc中并不意外。据我了解,如果malloc
为每个调用返回空指针而不是唯一指针,它们已经替换了malloc(0)
,所以我看不出有什么充分的理由使calloc
传递1而不是0传递给malloc
此外,传递1会破坏/破坏诸如消毒剂之类的调试工具,这些工具可能会告诉您是否无意中将指针取消了对“零元素数组”的引用。
该代码也非常危险,因为它不检查乘法是否溢出;为此需要任何正确的calloc
实现。