我使用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
。但它不是导致泄漏或崩溃,而是像null终止一样工作。有什么方法可以解决这个问题吗?
..而不是通过使用+1
的5543行代码。
答案 0 :(得分:5)
下面的行会导致缓冲区溢出,因为以前计算了要分配的大小时缺少+ 1
。
strcpy(local, (char*)str);
缓冲区溢出比内存泄漏严重得多。不幸的是,缓冲区溢出不会系统地崩溃程序。它调用未定义的行为,这意味着任何事情都可能发生,包括程序继续,就像你已经分配了足够大的集团一样。这不是编译器优化:它可以在任何优化级别发生(或不发生),并且程序员几乎无法控制发生的情况。请参阅下面的部分解决方案。
获取许多缓冲区溢出的诊断消息的一种方法是在正常编译后使用Valgrind执行程序。
或者,Clang和GCC的最新版本包含一个“地址清理程序”功能,使用-fsanitize=address
激活,在生成的代码中插入一些可能检测到问题的指令。我还没有使用此功能,但文档是available。