当malloc返回NULL时的测试

5
我正在尝试在C语言中复制“strdup”函数。这是学校习题的一部分。我想对它进行单元测试,包括malloc返回NULL并将errno设置为ENOMEM的情况。
我使用的操作系统是OSX 10.8。
我已经尝试了限制堆栈大小和数据大小,然后意识到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 的情况?


4
用一个模拟替代它? - Kerrek SB
1
问题不在于堆栈大小,而是在于堆。也许addressspace设置了堆限制,但我不确定。 - Charlie Burns
@KerrekSB - 你所说的mock是什么意思? - ryyker
为了消除(对于我们这些需要的人)关于堆栈/堆的困惑,请参考以下链接:https://dev59.com/hHVD5IYBdhLWcg3wHn2d - ryyker
@conradk:单元测试的重点在于你没有其他函数... - Kerrek SB
显示剩余5条评论
2个回答

4
我建议你伪造内存分配失败。例如,我需要在分配3D数组(需要清理大量内存)期间测试内存故障,因此我使用了一个框架,其中调用函数xmalloc()来获取内存,并且测试程序控制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()代替malloc()。按照下面所示的方式进行测试。你可以在"内存不足"的要求方面更加复杂;这是基本但有效的。


0

您可以使用cmocka单元测试框架的模拟对象支持来进行测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接