У меня странная проблема с malloc
.После выделения <10 МБ с количеством malloc, malloc неожиданно возвращает адрес <code>0x100000000, который вызывает SIGSEGV при доступе.Я понятия не имею, что не так.errno
установлен на 0
, и у меня достаточно места в оперативной памяти, поэтому не должно быть проблем с пространством.Последние адреса, возвращаемые malloc, были меньше 0x6255f0
.Любая идея, что искать?
Некоторая информация о моей системе:
- gcc версии 4.4.5 (Ubuntu / Linaro 4.4.4-14ubuntu5)
- flags: -Wall
- uname: 2.6.35-27-generic # 48-Ubuntu SMP Вт 22 февраля 20:25:46 UTC 2011 x86_64 GNU / Linux
Выход PMAP:
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 0 32 0 r-x-- tests
000000000060a000 0 4 4 r---- tests
000000000060b000 0 4 4 rw--- tests
000000000060c000 0 116 116 rw--- [ anon ]
00007ffff75cd000 0 348 0 r-x-- libc-2.12.1.so
00007ffff7747000 0 0 0 ----- libc-2.12.1.so
00007ffff7946000 0 16 16 r---- libc-2.12.1.so
00007ffff794a000 0 4 4 rw--- libc-2.12.1.so
00007ffff794b000 0 12 12 rw--- [ anon ]
00007ffff7950000 0 32 0 r-x-- libm-2.12.1.so
00007ffff79d2000 0 0 0 ----- libm-2.12.1.so
00007ffff7bd1000 0 4 4 r---- libm-2.12.1.so
00007ffff7bd2000 0 4 4 rw--- libm-2.12.1.so
00007ffff7bd3000 0 28 0 r-x-- liblinopt.so
00007ffff7bdb000 0 0 0 ----- liblinopt.so
00007ffff7dda000 0 4 4 r---- liblinopt.so
00007ffff7ddb000 0 4 4 rw--- liblinopt.so
00007ffff7ddc000 0 108 4 r-x-- ld-2.12.1.so
00007ffff7f6c000 0 432 432 rw--- [ anon ]
00007ffff7ff8000 0 12 12 rw--- [ anon ]
00007ffff7ffb000 0 4 0 r-x-- [ anon ]
00007ffff7ffc000 0 4 4 r---- ld-2.12.1.so
00007ffff7ffd000 0 4 4 rw--- ld-2.12.1.so
00007ffff7ffe000 0 4 4 rw--- [ anon ]
00007ffffffde000 0 16 16 rw--- [ stack ]
ffffffffff600000 0 0 0 r-x-- [ anon ]
---------------- ------ ------ ------
total kB 9160 1196 648
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7bd8e67 in bound_knapsack (sizes=0x610b30, profits=0x610ad0, B=103,
limit=2) at /home/x/Development/binpacking/src/lib/knapsack.c:123
ОБНОВЛЕНИЕ
Запуск valgrind выявил проблему: перед вызовом было несколько строк: calloc( n, sizeof(unsigned int));
, которые должны были быть: calloc( n, sizeof(unsigned int*));
, что привело к слишком маленькому выделенному блоку, которыйиспользуется для хранения результата malloc. вздох
Спасибо за резиновую утку!