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