malloc缓冲区溢出(C)

时间:2013-11-29 19:52:15

标签: c malloc buffer overflow

如果之前已经回答过,我很抱歉,但我一直在疯狂地寻找答案。我一直在使用malloc来创建一个数组:

char *message = (char*) malloc(31 *sizeof(char));

让用户输入最多30个字符的消息:

 fgets(message, 30, stdin);

在另一个函数中,我尝试将消息转换为小写并将其存储在另一个字符串中(希望长度与消息相同)。

int length_message = strlen(message) - 1;

char *temp1 = (char*) malloc(length_message * sizeof(char));

for(int i=0; message[i] != '\0'; i++) 
{
        temp1[i] = tolower(message[i]);     
}

但是当我来显示新字符串

puts(temp1);

它显示了我的输入消息,然后在新行上显示了一大堆乱码。我无法理解它的来源。

此外,在检查我的temp1数组的长度和我为长度消息创建的值时,使用:

printf("length of temp array: %d", strlen(temp1));
printf("length of message: %d\n", length_message);

返回了所需的length_message(用户在消息中输入的字符数)但是我的临时数组长度错误的数字!我是否错误地为临时阵列分配了内存,或者我没有正确地写入该阵列?

从我在其他线程上看到的内容,我似乎有一个缓冲区溢出错误?我该如何控制这个?

提前致谢!

2 个答案:

答案 0 :(得分:3)

此:

strlen(message) - 1

当然应该是这样的:

strlen(message) + 1

你弄错了。

答案 1 :(得分:1)

您的代码存在一些问题。

实际错误是由于您没有将源字符串中的终止0字符复制到目标而引起的。你需要在for循环之后写一个temp[i] = 0;

此外,您确实有可能发生缓冲区溢出,因为复制的malloc()字符比字符串的长度少sizeof(char)。 ( 为什么......? 你应该分配一个更多 ...)

其他问题包括可怕的 casting of void *,冗余(因而不安全)char *message = (char*) malloc(31 *sizeof(char)); 以及硬编码的缓冲区大小。

而不是

#define BUF_SIZE 31

char *message = malloc(BUF_SIZE);
fgets(message, BUF_SIZE, stdin);

char *message = malloc(BUF_SIZE * sizeof message[0]);

或者如果你觉得迂腐那么

sizeof()

从不malloc()内存时使用malloc()中的硬编码类型。但无论如何,我认为你根本不需要sizeof。为什么不使用自动数组(“堆栈分配”,而不是它的正确名称)呢?然后,您可以在获取用户输入时利用strlen()运算符。

此外,size_t和其他几个stdlib函数返回int。您绝对应该使用该类型而不是{{1}}。