堆栈内存上的free()

时间:2010-04-22 19:04:59

标签: c memory-management garbage-collection stack free

我在Solaris上支持一些c代码,至少我觉得它看起来很奇怪:

char new_login[64];
...
strcpy(new_login, (char *)login);
...
free(new_login);

我的理解是,由于变量是本地数组,因此内存来自堆栈而不需要释放,而且由于没有使用malloc / calloc / realloc,因此行为未定义。

这是一个实时系统,所以我认为这是一个浪费周期。我错过了一些明显的东西吗

6 个答案:

答案 0 :(得分:17)

你只能释放()从malloc(),calloc()或realloc()函数获得的东西。释放堆栈中的某些内容会产生未定义的行为,您很幸运,这不会导致程序崩溃或更糟。

考虑一个严重的错误,并尽快删除该行。

答案 1 :(得分:7)

没有。这是一个错误。

根据免费(3)....

  

free()释放指向的内存空间   通过ptr,一定是   之前的电话回复   malloc(),calloc()或realloc()。   否则,或者如果已经免费(ptr)   以前被称为未定义   行为发生。如果ptr为NULL,则为no   操作完成。

因此,您的程序中发生了未定义的行为。

答案 2 :(得分:3)

绝对是一个错误。 free()必须只用于堆分配内存,除非它被重新定义为完全不同的东西,我怀疑是这样。

答案 3 :(得分:3)

free()肯定是个bug 但是,这里可能还有另一个错误:


   strcpy(new_login, (char *)login);

如果函数没有迂腐地确认登录是63个或更少的字符以及相应的空终止,则此代码具有经典的缓冲区溢出错误。如果恶意方可以使用正确的字节填充登录,它们可以覆盖堆栈上的返回指针并执行任意代码。一种解决方案是:


   new_login[sizeof(new_login)-1]='\0';
   strncpy(new_login, (char *)login, sizeof(new_login)-1 );

答案 4 :(得分:2)

在大多数情况下,你只能释放()在堆上分配的东西。请参阅http://www.opengroup.org/onlinepubs/009695399/functions/free.html

但是:要做你想要做的事情的一种方法是范围在堆栈上分配的临时变量。如下:

{
char new_login[64];
... /* No later-used variables should be allocated on the stack here */
strcpy(new_login, (char *)login);
}
...

答案 5 :(得分:1)

感谢。很高兴看到我不疯狂。此外,strcpy没有边界检查。我通常使用strncpy来避免这些事情。