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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c ++ - 成功打印超出范围的字符串索引相关的知识,希望对你有一定的参考价值。

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

#include <iostream>

using namespace std;

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

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

答案

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

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

这些函数负责加载共享库,安排环境变量,构建std::cout等全局对象,以及创建和传递argc,argv到main()。这段代码窥视了这些函数的堆栈。在具有内存保护的系统(例如Linux或Windows)上,具有足够的越界访问权限,应用程序将崩溃。

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

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

另一答案

答案很简单 - 未定义的行为。不,你不能相信这个信息,强烈不推荐。不要这样做..

以上是关于c ++ - 成功打印超出范围的字符串索引的主要内容,如果未能解决你的问题,请参考以下文章

线程“主”java.lang.StringIndexOutOfBoundsException 中的异常:字符串索引超出范围:7

在列表索引超出范围时插入错误消息

IndexError:列表索引超出范围(打印整数)

字符串索引超出范围,Vigenere 密码

我的 Matlab 代码有啥问题?索引超出范围[关闭]

Java charAt() 字符串索引超出范围:5