c ++ - 成功打印超出范围的字符串索引

c++ -successfully printing out of range string indexes

我是 C++ 的新手,我在玩 string class。当我 运行 使用 GNU 编译器在 CodeBlocks 中编写以下代码时,我意识到:

#include <iostream>

using namespace std;

int main()
{
    string test = "hi";
    cout<<"char is : "<<test[100];
    return 0;
}

我实际上得到了一个值。我玩索引(我尝试从 100 到 10000)并且我可能会得到其他字符或者我可能会得到空值。这是否意味着您可以通过这种方式读取不应该读取的内存部分?你可以用它来剥削吗?还是只是我的想法是幻觉?

答案很简单——未定义的行为。不,您不能相信此信息,强烈不建议这样做。不要这样..

这是未定义的行为,所以任何事情都有可能发生。编译器可以优化该行、插入 abort() 或执行任何其他操作。

如果编译器没有对代码进行大的更改,并且 std::string 实现了短字符串优化,那么 test[100] 将访问调用 [= 的函数之一的堆栈帧12=]。

这些函数负责加载共享库,配置环境变量,构造全局对象如std::cout,创建并传递argc,argv,给main()。此代码查看这些函数的堆栈。在具有内存保护的系统上,例如 Linux 或 Windows,如果有足够多的越界访问,应用程序将崩溃。

不要依赖它,因为编译器可以用它做一些完全意想不到的事情。

是的,它会导致剥削。如果越界取决于用户输入,则该用户可能能够读取或写入他们不应该读取的数据。这是蠕虫或病毒可能传播的一种方式:它们读取密码,或编写将在函数 return 上执行的代码。