0

当我尝试释放 dataToWrite 时,我不确定为什么在 if 循环中会抛出垃圾值。它在 else 循环中工作正常。谁能帮我这个?

FILE *readFilePointer = NULL;
Message_buf outputMsgBuffer;
char fileData[PIPE_BUF];
char *dataToWrite=NULL;

readFilePointer = fopen(fileToReadFrom, "r");

if (readFilePointer == NULL)
{
    outputMsgBuffer.messageType=1;
    dataToWrite=(char *)malloc(strlen(strcat(fileToReadFrom," does not exists!!"))+1);
    memset(dataToWrite,0,strlen(dataToWrite));
    dataToWrite=strcat(fileToReadFrom," does not exists!!");
    strcat(outputMsgBuffer.messageText,dataToWrite);
    memset(dataToWrite,0,strlen(dataToWrite)+1);
    free(dataToWrite);
}
else
{   
    //outputMsgBuffer.messageText[0] = '\0';
    while (fgets(fileData, sizeof(fileData), readFilePointer) != NULL)
    {
        dataToWrite=(char *)malloc(sizeof(fileData));
        memset(dataToWrite,0,strlen(dataToWrite));
        strcpy(dataToWrite,fileData);
        strcat(outputMsgBuffer.messageText,dataToWrite);    
        free(dataToWrite);
    }

    fclose(readFilePointer);
}
outputMsgBuffer.messageType=1;
outputMsgBuffer.messageLength=strlen(outputMsgBuffer.messageText);
mesg_send(fd,&outputMsgBuffer);
}
4

4 回答 4

2
dataToWrite=(char *)malloc(strlen(strcat(fileToReadFrom," does not exists!!"))+1);
memset(dataToWrite,0,strlen(dataToWrite));

您没有初始化分配的内存,因此调用会strlen调用dataToWrite未定义的行为。

此外,您似乎没有意识到strcat修改其第一个参数指向的内存并返回指向它的指针的事实,

dataToWrite=strcat(fileToReadFrom," does not exists!!");

丢弃刚刚分配的内存。

于 2012-05-07T23:32:54.200 回答
1

好吧,这让我大吃一惊:

dataToWrite=(char *)malloc(sizeof(fileData));
memset(dataToWrite,0,strlen(dataToWrite));

您正在调用strlen指向char*您刚刚分配的内存的malloc. 您不知道该内存块中将包含什么,但是您调用strlenwhich 在返回之前查找空字符。你memset错了,可能在任何地方写,导致内存损坏。

附带说明一下,不要在 C 中转换 malloc 的返回值。这是完全没有必要的,实际上可以隐藏您忘记包含 stdlib.h 的事实(在旧版本的标准中)

于 2012-05-07T23:33:24.583 回答
0
dataToWrite=(char *)malloc(strlen(strcat(fileToReadFrom," does not exists!!"))+1);

您已将字符串复制到fileToReadFrom; 除了文件名之外,您是否确信它足够大以处理额外的字符串数据?(为什么这必须发生在这里?不要试图在一行中做太多。)

我怀疑您误解了strcat(3)工作原理;再看一下原型:

   char *strcat(char *dest, const char *src);

是目的地dest

dataToWrite=(char *)malloc(strlen(strcat(fileToReadFrom," does not exists!!"))+1);
memset(dataToWrite,0,strlen(dataToWrite));
dataToWrite=strcat(fileToReadFrom," does not exists!!");

假设fileToReadFrom包含hello. 在此代码之后,dataToWrite包含:

hello does not exists!! does not exists!!

如果fileToReadFrom不够大,那么您已经在很多相关的内存上乱涂乱画。

我强烈建议在你的程序中找到每一个使用,strcpy(3)并检查每一个的正确性。您可能在程序的其余部分中存在可利用的安全漏洞。

于 2012-05-07T23:35:23.617 回答
0

你的代码有很多问题。

dataToWrite=(char *)malloc(strlen(strcat(fileToReadFrom," does not exists!!"))+1);

你确定 fileToReadFrom 有足够的空间吗?

dataToWrite=strcat(fileToReadFrom," does not exists!!");

再次,你确定吗?...然后您将覆盖指向新分配内存的指针

free(dataToWrite);

dataToWrite 不再包含来自 malloc 的指针。

strcat(outputMsgBuffer.messageText,dataToWrite);

你确定 outputMsgBuffer.messageText 有足够的空间吗?如果是,为什么要为另一个指针分配内存(在 else 中)?

你可能想要的是:

strcpy(outputMsgBuffer.messageText,fileToReadFrom); 
strcat(outputMsgBuffer.messageText," does not exists!!");

而在其他

strcpy(outputMsgBuffer.messageText,fileData); 

仅此而已(如果您确定 outputMsgBuffer.messageText 足够大)。

于 2012-05-07T23:47:44.027 回答