LINUX.ORG.RU

valgrind - Address 0x5c191c0 is 0 bytes after a block of size 786,432 alloc'd


0

1

Что означает эта ошибка?

==4304== 11 errors in context 3 of 18:
==4304== Invalid write of size 1
==4304==    at 0x401A68: main (colors.c:86)
==4304==  Address 0x5c191c0 is 0 bytes after a block of size 786,432 alloc'd
==4304==    at 0x4C244E8: malloc (vg_replace_malloc.c:236)
==4304==    by 0x401E00: TImage::Create(int, int, unsigned char) (mypic.h:66)
==4304==    by 0x401741: main (colors.c:48)

class TImage {
public:
  U08 *pBuf;
  S32 w,h;
  U08 planes;
  U32 stride;
....
  void Create (S32 w_new, S32 h_new, U08 planes_new) {
    w = w_new;
    h = h_new;
    planes = planes_new;
    stride = planes * w;
    pBuf = (U08 *)malloc (stride * h); <--- вот на эту строчку ругается, mypic.h:66
    memset (pBuf, 0x00, stride * h);
  }
....
}
За пределы памяти вроде-бы не вылажу. http://valgrind.org/gallery/linux_mag.html

★★★★★

Ошибка происходит здесь: at 0x401A68: main (colors.c:86). В этом месте ты выходишь за границу блока, аллоцированного здесь: by 0x401E00: TImage::Create(int, int, unsigned char) (mypic.h:66).

ты же сам дал ссылку, там все про это написано.

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

Собственно, как читать валгриндовский лог:

Сейчас нам говорят, где произошла ошибка, по возможности показывают стек вызовов. У тебя ошибка прямо в main, поэтому в стеке всего одна запись.
==4304== Invalid write of size 1
==4304==    at 0x401A68: main (colors.c:86)

Теперь нам показывают, как мы создавали блок памяти. Опять же со стеком.
==4304==  Address 0x5c191c0 is 0 bytes after a block of size 786,432 alloc'd
==4304==    at 0x4C244E8: malloc (vg_replace_malloc.c:236)
==4304==    by 0x401E00: TImage::Create(int, int, unsigned char) (mypic.h:66)
==4304==    by 0x401741: main (colors.c:48)

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

>Теперь нам показывают, как мы создавали блок памяти

, при обращении к которому и произошла ошибка.

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

> Ошибка происходит здесь: at 0x401A68: main (colors.c:86).

Да, действительно. В этой строке вылазил за границы массива
(неправильно рассчитал координаты пикселя в изображении).

Вопрос закрыт. Спасибо.

pacify ★★★★★
() автор топика

В 80-90-е годы это называлось - дебаг.экзе. А вот под Спектрумом - уже не помню. Там мы просто выводили дамп памяти в мониторе или Zeus assembler'е - и думали где какие циклы/переходы/вычисления.

Вообще-то, «это» называлось debug.com.

;)

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