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

时间:2015-04-03 11:43:20

标签: c++ arrays

假设我写了

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

以下内容会有什么不同?

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

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

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

2 个答案:

答案 0 :(得分:2)

  

这会导致恶意代码执行吗?

不,这只会导致&#39;未定义的行为。
简单的代码执行通常会在堆栈分配缓冲区的末尾写入,从而覆盖返回地址。当函数返回时,它会跳转到恶意代码。始终需要写入,因为在您的程序的地址空间中没有恶意代码。

vector发生这种情况的可能性很小,因为元素的存储空间没有分配。
通过写入堆上的错误位置,也可以利用漏洞,但它们要复杂得多。

答案 1 :(得分:1)

第一种情况超出了向量的缓冲区,从而调用了未定义的行为。从技术上讲,这意味着任何都可能发生。但它不可能被直接利用来运行恶意代码 - 程序将尝试读取无效内存(获取垃圾值或内存错误),或者编译器完全消除了代码路径(因为它允许假设UB没有不会发生。但是,根据对结果所做的操作,它可能会从内存中显示非预期的数据。

在第二种情况下,一切都很好。您的程序已经已写入此内存 - 它已初始化了向量中的所有6个int对象(发生在std::vector的构造函数中)。因此,您可以在那里找到0类型int