2013-10-05 3 views
2

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

ответ

5

Вы выделяете память, которая является слишком коротким. Ваши расчеты предназначены для длины данных между, например, «Subject:» и «Content:», но не учитывайте необходимость нулевого терминатора в строке. Затем, когда вы вручную добавляете нулевой ограничитель, вы вызываете неопределенное поведение, записывая конец конца массива.

Изменение вашего кода на следующее следует исправить.

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

Вы также не показываете код в «...» разделе, так что вы можете иметь незавершенную строку там, что, если он обрабатывается в строке библиотечных подпрограммы могут вызвать проблемы.

+0

Спасибо, сэр, вы спасли мой день. Я конвертирую свой код из массива char в указатель на указатель и, как ошибка, сохранил длину массива, который должен быть увеличен на 1. +1 для +1 (нулевой терминатор) хэдз-ап. – ozanmuyes

0

Если вы сделаете это:

char* v = malloc(n); 

тогда действительные индексы клиновых диапазоне от v[0] до v[n-1]. В частности, v [n] никогда не действует. Это общее правило. Если вы снова посмотрите на свой код, вы должны увидеть проблему.

Несколько примечаний:

  1. Ваш код принимает Тема: приходит до содержания: и что оба они существуют. В некоторых случаях это предположение не будет корректным. Вы должны проверить, прежде чем запускать malloc'ing огромные объемы памяти (поскольку маленькие отрицательные числа превращаются в огромные положительные числа без знака). Вы также должны убедиться, что ваши mallocs не возвращают 0, а не segfault, когда они это делают.

  2. strdupstrndup) часто избавит вас от неловкости «oops, я не выделил достаточно места для ошибок NUL byte». Они также не требуют почти столько же времени, что делает ваш код более простым, надежным и понятным. Познакомьтесь с ними. Они будут твоими друзьями.

  3. Если ничего не работает, valgrind может помочь вам найти такие ошибки.

Смежные вопросы