【发布时间】:2014-08-12 15:12:17
【问题描述】:
我使用 C::B 在 Win7 的 MinGW 的 gcc 上编译了以下测试代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* Func. prototype */
char* returnString (void *str);
int main()
{
printf("%s", returnString("Hello World!!!!!!!!!!!!"));
return 1;
}
char* returnString (void *str)
{
char *local = malloc(strlen((char*)str));
strcpy(local, (char*)str);
return local;
}
默认情况下,分配会导致泄漏/u/b.. 因为我必须分配一个空闲字节+1,空终止符所在的位置。但它不会导致泄漏或崩溃,而是像空终止一样工作。有什么办法可以禁用这个吗?
..而不是使用 +1 的 5543 行代码。
【问题讨论】:
-
这与编译器优化有什么关系?无论如何,只需使用编辑器的 grep 或 Find in files... 在代码中找到每个 malloc 调用,然后检查并修复。最多只有几十个,所以只需要几分钟的工作时间。
-
如果您想知道为什么它很少崩溃:
malloc甚至在 8 或 16 或类似的字节处进行关联。所以大多数时候在分配之间会有一些未使用的字节,所以缺少 +1 不会有任何影响,除了每个长度可以被某个数字整除的字符串。没有 valgrind 或分配保护字节的调试真的很讨厌。
标签: c optimization compiler-construction