缓冲区溢出-变量的更改

Buffer overflow - The changes of variables

本文关键字:变量 溢出 缓冲区      更新时间:2023-10-16
void go()
{
    //{1}
    char buffer[2];
    gets(buffer);
    //{2}
    cout << allow;
}

我试着在两种情况下运行上面的程序:

-1st:我在位置1处声明"int allow;">

-第二:我在的第二个位置声明"int allow;">

在这两种情况下,当我尝试输入字符串"123"(不带引号(时,allow的值都是51。然而,当我读到关于内存布局的文章时,只有在第一种情况下,"allow"在堆栈中的位置在缓冲区之前,这意味着当字符串比缓冲区时,"allove"的值会发生变化。

然后,我试图在两个位置上都声明"char sth[10]"。这一次,只有当我把某件事放在第一位时,它的价值才发生了变化。

有人能解释一下发生了什么吗?

由于通过溢出更改allow是Undefined Behavior,编译器甚至可能根本没有变量allow,并在使用优化进行编译时将代码更改为cout << 0。无论将allow放在何处,这都不是检查溢出的有效方法。

需要强调的是:你观察到的allow的所有变化都是UB的结果。在标准中对此没有任何保证。你可以继续推测为什么你今天在你的系统上,用这个工具链看到这个输出,但结果可能会因为任何原因而变成的任何东西(比如你的程序移动你的草坪或偷走皇冠上的珠宝(。

实际上,没有办法安全地使用gets。这就是为什么它在当前的C++和C标准中都被删除了。

您可以使用std::stringstd::getline

string buffer;
std::getline(std::cin, buffer);