gpt4 book ai didi

c - 使 malloc 自动失败以测试 malloc 失败时的情况

转载 作者:行者123 更新时间:2023-12-05 01:30:26 31 4
gpt4 key购买 nike

我一直在为我创建的一个简单程序创建测试。我总是使用类似这样的方法检查使用 malloc 分配内存是否失败

int* ptr = malloc(sizeof(int) * x);

if(!ptr){
//...
exit(1); // but it could also not terminate abnormally and do something else
}

但通常,至少对于我的程序, malloc 永远不会失败,而那些我无法真正确定性地测试 malloc 失败的情况。

我的问题是:如果我无法控制 malloc 是否会失败,我该如何测试程序是否会出现内存分配失败?当 malloc 失败时,我应该怎么做才能进行确定性测试?

最佳答案

当我需要在不同阶段测试内存分配失败时,我使用了这样的函数 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", stderr);
return 0;
}
return malloc(size);
}

测试工具(同一源文件的一部分)可以将 fail_after 设置为任何合适的值,并在每次新测试运行之前将 num_allocs 重置为零。
int main(void)
{
int no1 = 5;

for (fail_after = 0; fail_after < 33; fail_after++)
{
printf("Fail after: %d\n", fail_after);
num_allocs = 0;
test_allocation(no1);
}

printf("PID %d - waiting for some data to exit:", (int)getpid());
fflush(0);
getchar();

return 0;
}

然后你可以安排调用 xmalloc() 来代替“真实的” malloc() :
#define malloc(x)    xmalloc(x)

这将放在 xmalloc() 的定义之后——尽管如果需要的话,有办法解决这个问题。您可以通过各种方式进行调整:也限制总大小,安排每第 N 次分配失败,安排在 M 次成功分配后连续分配 N 次失败,等等。

关于c - 使 malloc 自动失败以测试 malloc 失败时的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38023749/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com