4

「CRT は、アプリケーションがヒープ バッファーのメモリ末尾に書き込みを行ったことを検出しました」エラー。に到達するとクラッシュしfreeます。どんな助けでも大歓迎です。

int messageFunction(char* message) {
   char* sPtr = strstr(message,"Subject:");
   char* cPtr = strstr(message,"Content:");

   char* messageSubject = (char*) malloc(cPtr - sPtr - strlen("Subject:"))
   char* messageContent = (char*) malloc(strlen(cPtr + strlen("Content:")))

   strncpy(messageSubject, 
          stPtr + strlen("Subject:"), 
          cPtr - sPtr - strlen("Subject:"));

   messageSubject[cPtr - sPtr - strlen("Subject:")] = '\0';

   strncpy(messageContent, 
           cPtr + strlen("Content:"), 
           strlen(cPtr + strlen("Content:")));
   ...
   free(messageSubject);
   free(messageContent);
   }


void main() {
  char* message = "Subject:HelloWorldContent:MessageContent";
  int result = messageFunction(message);
 }
4

2 に答える 2

13

1 バイトが短すぎるメモリを割り当てています。計算は、たとえば「Subject:」と「Content:」の間のデータの長さに関するものですが、文字列内の null ターミネータの必要性は考慮されていません。次に、null ターミネータを手動で追加すると、配列の末尾を超えて書き込むことにより、未定義の動作が呼び出されます。

コードを次のように変更すると修正されます。

char* messageSubject = malloc(cPtr - sPtr - strlen("Subject:") + 1)
char* messageContent = malloc(strlen(cPtr + strlen("Content:")) + 1)

また、「...」セクションにコードを表示しないため、文字列ライブラリルーチンによって処理されている場合に問題を引き起こす可能性のある、終了していない文字列がそこにある可能性があります。

于 2013-10-05T23:16:28.757 に答える
0

これを行う場合:

char* v = malloc(n);

その場合、v の有効な添え字は からv[0]までv[n-1]です。特に、v[n] は決して有効ではありません。それが一般的なルールです。コードをもう一度見ると、問題がわかるはずです。

いくつかのメモ:

  1. あなたのコードは、Subject: が Content: の前に来て、両方が存在することを前提としています。場合によっては、この仮定が正しくないことがあります。大量のメモリの malloc を開始する前に確認する必要があります (小さな負の数が巨大な正の符号なし数に変わるため)。また、malloc が 0 を返さないようにする必要があります。

  2. strdup(およびstrndup) は、多くの場合、「おっと、NUL バイトに十分なスペースを割り当てていませんでした」というエラーからあなたを救います。また、コードをよりシンプルにし、信頼性を高め、理解しやすくします。それらを知りましょう。彼らはあなたの友達になります。

  3. 他に何も機能しない場合は、valgrindこのようなバグを見つけるのに役立ちます。

于 2013-10-05T23:15:44.223 に答える