缓冲区溢出-变量的更改
Buffer overflow - The changes of variables
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::string
和std::getline
:
string buffer;
std::getline(std::cin, buffer);
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 将字符数组转换为结构时出现问题. 结构的字符数组变量溢出
- 整数溢出是否会影响其他变量
- 3 * 1000000000 溢出为 int,但变量很长.为什么
- C 缓冲区溢出或损坏的变量
- 在溢出的情况下,变量的值始终为负数
- C++ 大于堆栈的变量(堆栈溢出)
- 当与可能导致缓冲区溢出的功能一起使用时,外部变量是否比其他变量更大
- Project Euler#11,变量溢出
- 包含溢出缓冲区的堆栈分配变量,也称为缓冲区
- 关于 Sstream,使用变量作为数组大小和计算溢出
- 保护C++变量不被溢出?如果值小于任何DataType的UpperBound
- 为什么我的大5D数组只作为成员变量导致堆栈溢出异常?
- 缓冲区溢出-变量的更改
- 局部变量的堆栈溢出
- 缓冲区溢出不影响常量变量