c-测试malloc何时返回NULL



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

我建议您伪造内存分配失败。例如,我需要在分配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 memoryn", 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: %dn", fail_after);
        num_allocs = 0;
        test_allocation(no1);
    }
    return 0;
}

编写strdup()代理以使用xmalloc()而不是malloc()。如图所示,对其进行或多或少的测试。你可以通过"内存不足"的要求变得更花哨;这是初步的,但有效。

您可以使用cmocka单元测试框架的mock对象支持来测试这一点。

最新更新