Ich schrieb dieses unschuldige Stück Code, und die Ergebnisse in einer solchen bösen Fehler:SIGABRT in malloc.c, was ist gerade passiert?
static char * prefixed(char * pref, char *str) {
size_t newalloc_size = sizeof(char) * (strlen(pref) + strlen(str));
char * result = (char*) malloc(newalloc_size);
[...]
Ausgabe von 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)
ich die übergebenen Argumente geprüft, auch. Sie waren genau so, wie sie sein sollten:
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)
kann mir jemand vorstellen, was schief geht hier? Ich weiß, dass es Funktionen gibt, um zwei Saiten miteinander zu verbinden, aber ich möchte es alleine machen!
Mit freundlichen Grüßen.
Das sieht aus wie Haufen Korruption. Der tatsächliche Fehler könnte fast überall in Ihrem Code sein, möglicherweise weit, weit weg von diesem Block. – Mat
Libc bestrafte Sie für den Rückgabewert von 'malloc()'. –
nur durch den Weg: 'newalloc_size = ... + 1' um' 0' zu beenden – slashmais