可能已经在某处找到了答案,但我无法找到答案。
如本问题所述:Accessing an array out of bounds gives no error, why?,C ++不强制执行数组边界,而是选择提供未定义的行为。我关心的是这种行为的力量。
所以假设我写了一些简单的程序:
#include <iostream>
int main() {
int* a = new int[1];
long large_number = 9223372036854775807l; //2**63 - 1
for (long i = 0l; i < large_number; i++) {
std::cout << i << " " << a[i] << std::endl;
}
return 0;
}
这将继续打印存储在我系统上的下一个32位数字(假设显然是32位大小的整数)。当我在我的机器上运行时,当我大约30,000时,程序会出现段错误,我估计它大约是为我的程序分配的内存大小。这让我想到了我的问题,这有三个方面:
什么阻止我继续读取(不写入)此范围之外的值?这是预防阅读系统特定的吗?编译器特定的
如果我对操作指针的方式很聪明,我是否可以在程序范围之外读取或写入值(显然,没有直接/正常访问这些值)?
< / LI>我在虚拟机上运行所有这些操作。我可以在主机上访问读/写内存值吗? (如果(2)是否,那么这也不是。)
请注意,我在带有Windows主机的ubuntu虚拟机上运行g ++ 5.3.1,没有c ++ 11。
此外,我认识到这个问题可能被视为安全问题(读/写内存)。我当然不打算恶意,但如果这是一个问题,请告诉我,我很乐意结束这个问题。
编辑:以下问题似乎相关且有趣: Accessing outside the memory allocated by the program. (Accessing other app's memory) 关于程序是否可以在其虚拟内存空间之外读取,似乎没有达成共识。
答案 0 :(得分:1)
操作系统。操作系统仅将特定范围的虚拟地址映射到物理地址。到达映射的虚拟地址范围的末尾后,尝试访问不存在的虚拟地址会生成SIGSEGV
。
没有。至少在任何现代操作系统上都没有。
除非您在主机操作系统的虚拟机中发现错误并将其利用,否则不会这样做。