Napisałem ten niewinny kawałek kodu i skutkuje takim złym błędu:SIGABRT w malloc.c, co się właśnie stało?
static char * prefixed(char * pref, char *str) {
size_t newalloc_size = sizeof(char) * (strlen(pref) + strlen(str));
char * result = (char*) malloc(newalloc_size);
[...]
wyjściowy z debugowania (cgdb):
Breakpoint 1, prefixed (pref=0x401345 "Env: ", str=0x4012b5 "Home") at ./src/backend/os/env.c:77
(gdb) s
(gdb) p newalloc_size
$1 = 9
(gdb) s
envtest: malloc.c:2368: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >=
(unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)'
failed.
Program received signal SIGABRT, Aborted.
0x00007ffff7a68fd5 in raise() from /usr/lib/libc.so.6
(gdb)
Sprawdziłem przekazywane argumenty, too. Są tacy, jak powinni:
Breakpoint 1, prefixed (pref=0x401345 "Env: ", str=0x4012b5 "Home") at ./src/backend/os/env.c:77
(gdb) p pref
$2 = 0x401345 "Env: "
(gdb) p strlen(pref)
$3 = 5
(gdb) p str
$4 = 0x4012b5 "Home"
(gdb) p strlen(str)
$5 = 4
(gdb)
Czy ktoś może sobie wyobrazić, co tu jest nie tak? Wiem, że istnieją funkcje łączenia dwóch ciągów, ale chcę to zrobić samodzielnie!
Pozdrawiamy.
To wygląda na korupcję sterty. Rzeczywisty błąd może dotyczyć dowolnego miejsca w kodzie, prawdopodobnie daleko, daleko od tego bloku. – Mat
Libc ukarał cię za rzucenie wartości zwracanej przez 'malloc()'. –
just-the-way: 'newalloc_size = ... + 1', aby umożliwić zakończenie' 0' – slashmais