c++ - 访问不存在的数组索引和访问现有但为空的索引之间的区别

标签 c++ arrays

假设我写了

vector<int> example(5);
example[6];

它与以下内容有什么区别?

vector<int> example(6);
example[5];

在第一种情况下,我试图访问一个不存在的、未声明的索引。这会导致恶意代码执行吗?是否可以将某种代码放在与 example[5] 对应的内存部分中,并由像上面第一个代码那样编写的程序执行?

第二种情况呢?是否仍然可以将代码放置在 example[5] 的内存区域中,即使它应该保留给我的程序,即使我没有在其中写入任何内容?

最佳答案

Could that result in malicious code execution?

不,这会导致“仅”未定义的行为。
简单的代码执行漏洞通常写入超过堆栈分配的缓冲区的末尾,从而覆盖返回地址。当函数返回时,它会跳转到恶意代码。写入始终是必需的,否则程序的地址空间中就不会存在恶意代码。

对于 vector ,发生这种情况的可能性很低,因为元素的存储空间不是在堆栈上分配的。
通过写入堆上的错误位置,漏洞利用也是可能的,但要复杂得多。

关于c++ - 访问不存在的数组索引和访问现有但为空的索引之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29431559/

相关文章:

c++ - 为什么删除操作符必须是静态的?

php - 如何从数组中删除空值?

c++ - 运行时链接库全局变量是否在加载了 dlopen 的插件之间共享?

c++ - 如何在数据库服务器上直接运行C++进程,避免传输数据集?

C++ 程序将包含的 .txt 文件视为代码

ruby - 在 Ruby 中将数组的数组组合成所有可能的组合,仅向前

javascript - 使用循环来缩短此代码 (javascript)

c++ - 使用运行时指定尺寸的 boost 几何

java - 数组未按预期打印

javascript - Lodash 设置数组的每个元素