测试malloc何时返回NULL

时间:2013-11-19 17:18:45

标签: c macos unit-testing

我正在尝试复制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的情况?

2 个答案:

答案 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单元测试框架的模拟对象支持来测试它。