一段时间以来,我的代码中有一个我无法弄清楚的错误。也许我只是瞎了眼,但是这个错误没有多大意义,因为据我所知,这段代码是完美无缺的。我推测其他地方可能存在损坏,但我想我会在这里粘贴我的问题代码以防万一。
我知道存在堆损坏,因为我收到标准错误消息,然后是 free() 无效的下一个大小消息。我已经包含了我认为相关的内容。堆损坏发生在第二个空闲(FileBuf)上;
while ((DirPtr = readdir(ProcDir)))
{
if (AllNumeric(DirPtr->d_name) && atoi(DirPtr->d_name) >= InObj->ObjectPID &&
atoi(DirPtr->d_name) <= InObj->ObjectPID + 10) /*Search 10 PIDs forward.*/
{
char TChar;
snprintf(FileName, sizeof FileName, "/proc/%s/cmdline", DirPtr->d_name);
if (!(Descriptor = fopen(FileName, "r")))
{
closedir(ProcDir);
return 0;
}
FileBuf = malloc(MAX_LINE_SIZE);
/*Scroll further down to find the free()s.*/
for (Inc = 0; (TChar = getc(Descriptor)) != EOF && Inc < MAX_LINE_SIZE - 1; ++Inc)
{
FileBuf[Inc] = TChar;
}
FileBuf[Inc] = '\0';
fclose(Descriptor);
for (Inc = 0, Inc2 = NumSpaces; Inc2 != 0; ++Inc)
{ /*We need to replace the NUL characters with spaces.*/
if (FileBuf[Inc] == '\0')
{
--Inc2;
FileBuf[Inc] = ' ';
}
}
if (!strcmp(FileBuf, InObj->ObjectStartCommand))
{
unsigned long RealPID;
free(FileBuf);
FileBuf = NULL;
snprintf(FileName, sizeof FileName, "%s", DirPtr->d_name);
closedir(ProcDir);
RealPID = atoi(FileName);
if (UpdatePID)
{
InObj->ObjectPID = RealPID;
}
return RealPID;
}
/*And here is the problem.*/
free(FileBuf);
}
}
closedir(ProcDir);
return 0;