malloc/free,似乎获得了多个自由

VMi*_*lls 1 c malloc free segmentation-fault

我写了一个函数来测试给出的路径是一个有效的Maildir目录(标准的Maildir有三个子文件夹"小人"的"新"和"TMP").函数接受假定的目录,检查这些子文件夹,并适当地返回.

我正在使用当前代码在第二个自由语句中获得段错误,并且我同样得到了"无效的下一个大小"错误,组织略有不同.更令人困惑的,它只出现segfaults一些目录,而成功地完成别人,没有明显原因(虽然它是在哪些它将段错误上一致).随着第二个free()被注释掉,所有准确格式化的目录都成功完成.

显然我是双重释放.我的问题是,为什么以及如何?如果第一个free在条件语句中并且我们在释放后立即返回,我们永远不会获得第二个free.如果我们达到第二个免费,那意味着我们跳过了第一个免费...对吧?

我知道在这种情况下它是完全正常的,因为该系统将在节目结束回收内存,但我更感兴趣的是,这是比只是让代码工作发生的原因.如果我在查看不同的情况,由函数调用的函数调用的函数和内存可能是一个问题呢?我不需要第二次免费回收内存吗?

int is_valid_folder(char* maildir)
{
 struct stat *buf;
 buf = (struct stat *) malloc(sizeof(struct stat));

char* new = strdup(maildir);
char* cur = strdup(maildir);
char* tmp = strdup(maildir);
strcat (cur, "/cur"); strcat (new, "/new"); strcat (tmp, "/tmp");

if(stat(cur, buf) || stat(tmp, buf) || stat(new, buf))
{
printf("Problem stat-ing one of the cur/new/tmp folders\n");
printf("Error number %d\n", errno);
free(buf);
return 1;
}

free(buf);
return 0; //a valid folder path for this function
}
Run Code Online (Sandbox Code Playgroud)

Aas*_*set 5

你有几个缓冲区溢出:strdup()可能分配一个char足够大的数组来保存maildir字符串,然后调用strcat()将溢出数组.(strcat(),而不是strdup(),也不能创建一个新的char数组,所以你必须确保自己的数组,你给它足够大,可以容纳结果字符串.)

顺便说一句,valgrind是你追踪内存管理错误的朋友.