我是C ++的新手,我在玩string
类。我意识到,当我使用GNU编译器在CodeBlocks中运行以下代码时:
#include <iostream>
using namespace std;
int main()
{
string test = "hi";
cout<<"char is : "<<test[100];
return 0;
}
我实际上得到了一个价值。我使用索引(我尝试从100到10000),并且我可能会得到其他字符,或者我可能会得到null。这是否意味着您可以读取您不应该读取的部分内存?你可以利用它进行剥削吗?还是我的脑子虚幻?
答案 0 :(得分:2)
答案很简单-未定义行为。不,您不能信任此信息,因此强烈建议您不要使用此信息。别做..
答案 1 :(得分:0)
这是未定义的行为,因此任何事情都可能发生。编译器可以优化这一行,插入abort()或执行其他任何操作。
如果编译器未对代码进行较大更改,并且std::string
实现了短字符串优化,则test[100]
将访问调用{{1}的函数之一的堆栈帧}。
这些函数负责加载共享库,安排环境变量,构造诸如main()
之类的全局对象,以及创建并将argc,argv传递给std::cout
。这段代码探查了这些函数的堆栈。在具有内存保护功能的系统(例如Linux或Windows)上具有足够的出站访问权限时,应用程序将崩溃。
不要依赖它,因为编译器可以用它做完全出乎意料的事情。
是的,它可能导致剥削。如果越界取决于用户输入,则该用户可能能够读取或写入原本不应该的数据。这是蠕虫或病毒传播的一种方式:它们读取密码或编写将在函数返回时执行的代码。