Ho scritto questo pezzo innocenti di codice, e si traduce in un errore così malvagio:SIGABRT in malloc.c, cosa è successo?
static char * prefixed(char * pref, char *str) {
size_t newalloc_size = sizeof(char) * (strlen(pref) + strlen(str));
char * result = (char*) malloc(newalloc_size);
[...]
uscita dal debug (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)
ho controllato gli argomenti passati, anche. Loro dove proprio come dovrebbero essere:
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)
qualcuno può immaginare, che cosa va storto qui? So che ci sono funzioni per mettere insieme due stringhe, ma voglio farlo da solo!
cordiali saluti.
Sembra una perdita di dati. L'errore effettivo potrebbe essere praticamente ovunque nel tuo codice, possibilmente lontano, molto lontano da quel blocco. – Mat
Libc ti ha punito per aver lanciato il valore di ritorno di 'malloc()'. –
solo by-the-way: 'newalloc_size = ... + 1' per consentire la terminazione di' 0' – slashmais