不能在另一个函数中由malloc()分配的free()值

Jac*_*ack 1 c memory-management buffer-overflow

我有一个C函数,像这样:

void foo(char ** out) {
     *out = malloc(computedsize);
     if(*out != NULL){
         sprintf(*out, "%s,%s", foovar, baa);
      }
}
Run Code Online (Sandbox Code Playgroud)

然后我打电话给:

int main(void) {
   char * out = NULL;
   foo(&out);
   printf("%s\n", out); /* so far, it works fine */
   free(out); /* the problem. */ 
}
Run Code Online (Sandbox Code Playgroud)

我打电话的时候:

free(out);

它给出了:

*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x09a03050 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b161)[0x4ff161]
/lib/tls/i686/cmov/libc.so.6(+0x6c9b8)[0x5009b8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x503a9d]
./a.out[0x804875b]
./a.out[0x804871a]
./a.out[0x80486f9]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x4aabd6]
./a.out[0x8048601]
======= Memory map: ========
Run Code Online (Sandbox Code Playgroud)

//需要复制内存映射部分吗?

有人可以指出我的错误吗?我相信那是sprintf()......或者不,实际上,我不知道.我尝试过做内部功能的alloc值的新变量,然后*out = myvariable;*out = strdup(myvariable),但free()呼叫给予同样的错误.

更新

我看到问题出在函数内部.其中的任何free()调用都会导致下一个无效的大小.

例如:

char *f=malloc(2);
strcpy(f,"a");
free(f);
Run Code Online (Sandbox Code Playgroud)

内部foo()功能,得到上述错误,在main()功能上,正常工作.我完全失去了如何解决这个问题.

Oli*_*rth 5

你可能已经写入操作超出了分配的数组的边界,从而破坏堆(其中包含元数据malloc/ free使用管理的东西).

像Valgrind这样的工具旨在帮助您找到这种错误.