测试malloc何时返回NULL

con*_*com 5 c macos unit-testing

我试图strdup在C中复制这个功能.这是学校练习的一部分.我想单元测试,其中包括情况下malloc返回NULL,并设置errnoENOMEM.

我在OSX 10.8上.

我已经尝试限制stacksize,然后datasize,在堆上实现malloc分配:

limit stacksize 0
limit datasize 0
Run Code Online (Sandbox Code Playgroud)

确认限制应该有效:

my-host% limit
cputime         unlimited
filesize        unlimited
datasize        0kB
stacksize       0kB
coredumpsize    0kB
addressspace    unlimited
memorylocked    unlimited
maxproc         709
descriptors     256
Run Code Online (Sandbox Code Playgroud)

但是,即使堆栈大小限制为0kB,我也可以正常运行程序.所以我认为我的主机可能对最小堆栈大小有限制.

我怎么能测试malloc返回的情况NULL呢?

Jon*_*ler 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;
}
Run Code Online (Sandbox Code Playgroud)

编写您的strdup()代理以xmalloc()代替malloc(). 或多或少地进行测试,如图所示。您可以更喜欢“内存不足”的要求;这是基本但有效的。