我正在尝试复制C中的strdup
函数。这是学校练习的一部分。我想对其进行单元测试,包括malloc
返回NULL
并将errno
设置为ENOMEM
的情况。
我在OSX 10.8上。
我尝试过限制stacksize,然后数据化,在堆上实现malloc分配:
limit stacksize 0
limit datasize 0
确认限制应该有效:
my-host% limit
cputime unlimited
filesize unlimited
datasize 0kB
stacksize 0kB
coredumpsize 0kB
addressspace unlimited
memorylocked unlimited
maxproc 709
descriptors 256
但是,即使堆栈大小限制为0kB,我也能正常运行程序。所以我想我的主机可能会对最小堆栈大小有限制。
我如何测试malloc
返回NULL
的情况?
答案 0 :(得分:4)
我建议你假装内存分配失败。例如,我需要在分配3D数组(需要大量内存来清理)时测试内存故障,因此我使用了一个框架,其中调用函数xmalloc()
来获取内存,并在{{{}}时控制测试程序{1}}会失败。
xmalloc()
将static int fail_after = 0;
static int num_allocs = 0;
static void *xmalloc(size_t size)
{
if (fail_after > 0 && num_allocs++ >= fail_after)
{
fputs("Out of memory\n", stdout);
return 0;
}
return malloc(size);
}
...code using xmalloc...
int main(int argc, char **argv)
{
int no1 = 5;
int fail_limit = 33;
if (argc == 2)
fail_limit = atoi(argv[1]);
for (fail_after = 0; fail_after < fail_limit; fail_after++)
{
printf("Fail after: %d\n", fail_after);
num_allocs = 0;
test_allocation(no1);
}
return 0;
}
代理人写为使用strdup()
代替xmalloc()
。如图所示,或多或少地测试它。您可以通过“内存不足”的要求获得更高的体验;这是基本但有效的。
答案 1 :(得分:0)
您可以使用cmocka单元测试框架的模拟对象支持来测试它。