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 上执行的代码。
我是 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 上执行的代码。