tôi đã viết tác phẩm này vô tội mã, và kết quả là một lỗi ác như vậy:SIGABRT trong malloc.c, điều gì vừa xảy ra?
static char * prefixed(char * pref, char *str) {
size_t newalloc_size = sizeof(char) * (strlen(pref) + strlen(str));
char * result = (char*) malloc(newalloc_size);
[...]
đầu ra từ 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)
Tôi đã kiểm tra các đối số trôi qua, quá. Họ ở đúng như chúng được cho là:
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)
ai cũng có thể tưởng tượng, điều gì xảy ra ở đây? Tôi biết có chức năng để mèo hai dây với nhau, nhưng tôi muốn làm điều đó một mình!
kính thư.
Trông giống như tham nhũng đống. Lỗi thực tế có thể chỉ là về bất cứ nơi nào trong mã của bạn, có thể xa, cách xa khối đó. – Mat
Libc trừng phạt bạn vì đã gán giá trị trả về của 'malloc()'. –
chỉ bằng cách: 'newalloc_size = ... + 1' để cho phép chấm dứt' 0' – slashmais