gpt4 book ai didi

c - 为什么这个字符串不会溢出缓冲区?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:48:47 25 4
gpt4 key购买 nike

我在 mac 和 linux 上运行了这段代码:

#include <stdio.h>
#include <string.h>

int main (int argc, char *argv[]){

int value = 5;
char buffer_one[8], buffer_two[8];

strcpy(buffer_one, "one");
strcpy(buffer_two, "two");

printf("[BEFORE] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
printf("[BEFORE] value is at %p and is %i (0x%08x)\n", &value, value, value);

printf("\n[STRCPY] copying %i bytes into buffer two\n\n", strlen(argv[1]));
strcpy(buffer_two, argv[1]);

printf("[AFTER] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
printf("[AFTER] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
printf("[AFTER] value is at %p and is %i (0x%08x)\n", &value, value, value);
}

在 mac 上,如果我输入“1234567890”作为命令行参数,90 就会溢出到缓冲区 1,因为 8 字节的缓冲区超出了 2。

但是,如果我在我的 Linux 系统上运行它,需要更多的字符才能溢出缓冲区。为什么我可以在 Linux 中执行缓冲区?

另请注意,在两个系统上,整个字符串仍将打印在缓冲区二中,只有溢出的项目打印在缓冲区一中。为什么会这样?为什么其他角色不直接去下一个?如果这个问题措辞不当,请举个例子:

如果我在我的 mac 上输入 1234567890,1234567890 将打印在缓冲区二中,90 将打印在缓冲区一中。即使 90 已经溢出,它怎么能仍然适合缓冲区二。 (在 linux 上是相同的概念,但需要超过 10 个字节才能溢出)

最佳答案

在这两种情况下,都存在缓冲区溢出。缓冲区溢出只是调用未定义的行为。在某些情况下,它似乎工作得很好,不会产生崩溃或段错误。

例如,出于对齐原因,内存分配器(在本例中为堆栈分配)分配的内存可能会比您请求的多一些。在那种情况下,您实际上可能会溢出缓冲区而没有任何明显的副作用,但这实际上是一件非常糟糕的事情,因为它隐藏了错误,而不是消除它。

在这种情况下,因为它涉及到堆栈,所以您将覆盖堆栈中分配给您的缓冲区的内容之外的内容。如果您引入更多变量或开始调用函数,您可能会开始注意到非常奇怪的副作用。无论如何,这是一个非常有问题的场景,您需要非常小心,尽可能避免缓冲区溢出。

关于c - 为什么这个字符串不会溢出缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34011866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com