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));

割り当てられたメモリを初期化していないため、strlenonを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ています。そのメモリのチャンクに何が含まれるかはわかりませんが、戻る前にnull文字を探す呼び出しを行います。あなたは間違っていて、どこにでも書き込みをしている可能性があり、メモリが破損する可能性があります。char*mallocstrlenmemset

ちなみに、Cでmallocの戻り値をキャストしないでください。これは完全に不要であり、stdlib.hを含めるのを忘れたという事実(古いバージョンの標準では)を実際に隠すことができます。

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

fileToReadFrom文字列を;にコピーしました。持っていたファイル名に加えて、余分な文字列データを処理するのに十分な大きさであると確信していますか?(そして、なぜこれがここで起こらなければならないのですか?1行でやりすぎないでください。)

あなたがどのように機能するかを誤解しているのではないかと疑っています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 に答える