假设我写了
vector<int> example(5);
example[6];
以下内容会有什么不同?
vector<int> example(6);
example[5];
在第一种情况下,我试图访问一个不存在的,未声明的索引。这会导致恶意代码执行吗?是否可以在与example[5]
对应的内存部分放置某种代码,并通过上面第一个编写的程序执行它?
第二种情况怎么样?是否仍然可以将代码放在example[5]
的内存区域中,即使它应该保留给我的程序,即使我没有在其中写入任何内容?
答案 0 :(得分:2)
这会导致恶意代码执行吗?
不,这只会导致&#39;未定义的行为。
简单的代码执行通常会在堆栈分配缓冲区的末尾写入,从而覆盖返回地址。当函数返回时,它会跳转到恶意代码。始终需要写入,因为在您的程序的地址空间中没有恶意代码。
vector
发生这种情况的可能性很小,因为元素的存储空间没有分配。
通过写入堆上的错误位置,也可以利用漏洞,但它们要复杂得多。
答案 1 :(得分:1)
第一种情况超出了向量的缓冲区,从而调用了未定义的行为。从技术上讲,这意味着任何都可能发生。但它不可能被直接利用来运行恶意代码 - 程序将尝试读取无效内存(获取垃圾值或内存错误),或者编译器完全消除了代码路径(因为它允许假设UB没有不会发生。但是,根据对结果所做的操作,它可能会从内存中显示非预期的数据。
在第二种情况下,一切都很好。您的程序已经已写入此内存 - 它已初始化了向量中的所有6个int
对象(发生在std::vector
的构造函数中)。因此,您可以在那里找到0
类型int
。