LINUX.ORG.RU

realloc(): invalid next size:

 ,


0

1

Добрый вечер! Есть какой код.

Но он не работает. Не могу понять почему он вываливается, роде всё верно.

Также жду любую конструктивную критику.

./a.out 
*** Error in `./a.out': realloc(): invalid next size: 0x000000000227c030 ***
Аварийный останов (сделан дамп памяти)
★★

Твоё приложение пишет вне выделенных блоков памяти и портит служебную информацию, используемую аллокатором. Valgrind поможет отловить такие ошибки.

valgrind ./a.out
i-rinat ★★★★★ ()

Когда второй раз вызываешь add, q_size == 1, m_size == 1. list->q_size > list->m_size не выполняется и массив не расширяется. Потом ты пишешь во второй индекс и портишь кусок памяти сразу за выделенным. В этом и есть ошибка. Там хранятся служебные данные malloc-а, которыми пользуется realloc и следующей его вызов обнаруживает эту ошибку. Это тебе ещё повезло, бывает хуже.

Для исправления надо использовать >= (35 строчка).

И проверяй результат realloc-а на NULL. Совет про valgrind двачую.

Legioner ★★★★★ ()
Последнее исправление: Legioner (всего исправлений: 1)
diff --git a/main.c b/main.c
index b3c6c01..b38d236 100644
--- a/main.c
+++ b/main.c
@@ -31,7 +31,7 @@ void listFree(List_t *list)
 
 void listAdd(List_t *list, Point_t *point)
 {
-        if (list->q_size > list->m_size) {
+        if (list->q_size >= list->m_size) {
                 list->m_size *= 2;
                 list->point = realloc(list->point, sizeof(Point_t) * list->m_size);
         }
theNamelessOne ★★★★★ ()
Ответ на: комментарий от itn

В худшем он не обнаруживает, а просто крашится (когда-нибудь потом).

mix_mix ★★★★★ ()
Последнее исправление: mix_mix (всего исправлений: 1)
Ответ на: комментарий от itn

Legioner, а что бывает в худшем случае?

В худшем у тебя этот баг проявится не сразу, а после часа работы программы, например и ты будешь искать его совсем в другом месте. Или затрутся пользовательские данные и у пользователя сохранится не его ФИО а тарабарщина, а его потом на самолёт не пустят, например. Или перепишешь координаты места назначения и Фобос-грунт полетит не в ту сторону.

Legioner ★★★★★ ()
Ответ на: комментарий от Legioner

его потом на самолёт не пустят
Фобос-грунт полетит не в ту сторону.

Чисто риторический вопрос. Нахрен для самолётов и фобосов делать что-либо на сплюсе тогда?

nanoolinux ★★★★ ()
Ответ на: комментарий от anonymous

В уни майнц на первой лекции студентам айтишникам рассказывают про финансовые потери из-за ошибок в сплюснутых недоподелиях. Плавно переходя к человеческим жертвам. Так что с точки зрения немецкого прагматизма лучше когда фобос долетит, хоть и медленно, чем перестанет отвечать на даже ручное управление и отправится прямиком на солнце и скажет что так и было например. И тут в центре управления полётом встаёт анонимус и пердит: «И так сойдёт! Зато ЛЕТАЕТ!».

nanoolinux ★★★★ ()
Ответ на: комментарий от nanoolinux

Значит есть причины. Может быть много разных ошибок, не только порча памяти. От всех ошибок не защитишься, запретив С++. А вообще я не очень хорошо знаю, на чём там пишут, это я так, для красного словца пример привёл.

Legioner ★★★★★ ()
Ответ на: комментарий от itn

а что бывает в худшем случае?

хрен его знает. Вполне может и rm -rf /* сделать.

emulek ()
Ответ на: комментарий от nanoolinux

айтишникам рассказывают про финансовые потери из-за ошибок в сплюснутых недоподелиях. Плавно переходя к человеческим жертвам

ЛОР не только тормозит, но и глючит. Почем у так? ЛОР разве на C++?

emulek ()
Ответ на: комментарий от nanoolinux

В уни майнц на первой лекции студентам айтишникам рассказывают про финансовые потери из-за ошибок в сплюснутых недоподелиях.

Тем не менее, в NASA пишут на С, насколько я знаю.

DarkEld3r ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.