1. ホーム
  2. c

[解決済み] ヒープ破損の検出:通常ブロックの後

2022-02-12 05:33:39

質問

アプリケーションがヒープバッファのメモリ終端に書き込んだことを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);
 }

解決方法は?

1バイト足りないメモリを割り当てている。あなたの計算は、例えば "Subject:" と "Content:" の間のデータの長さですが、文字列内のヌル終端の必要性は考慮されていません。そのため、手動でヌルターミネーターを追加すると、配列の末尾を越えて書き込むことになり、未定義の動作を引き起こすことになります。

以下のようなコードに変更すると直るはずです。

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

また、"..." セクションのコードが表示されていないので、終端されていない文字列があるかもしれませんが、それが文字列ライブラリルーチンによって処理されている場合、問題が発生する可能性があります。