C ++读/写数组越界

时间:2016-07-25 02:15:05

标签: c++ pointers memory

可能已经在某处找到了答案,但我无法找到答案。

如本问题所述: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时,程序会出现段错误,我估计它大约是为我的程序分配的内存大小。这让我想到了我的问题,这有三个方面:

  1. 什么阻止我继续读取(不写入)此范围之外的值?这是预防阅读系统特定的吗?编译器特定的

  2. 如果我对操作指针的方式很聪明,我是否可以在程序范围之外读取或写入值(显然,没有直接/正常访问这些值)?

    < / LI>
  3. 我在虚拟机上运行所有这些操作。我可以在主机上访问读/写内存值吗? (如果(2)是否,那么这也不是。)

  4. 请注意,我在带有Windows主机的ubuntu虚拟机上运行g ++ 5.3.1,没有c ++ 11。

    此外,我认识到这个问题可能被视为安全问题(读/写内存)。我当然不打算恶意,但如果这是一个问题,请告诉我,我很乐意结束这个问题。

    编辑:以下问题似乎相关且有趣: Accessing outside the memory allocated by the program. (Accessing other app's memory) 关于程序是否可以在其虚拟内存空间之外读取,似乎没有达成共识。

1 个答案:

答案 0 :(得分:1)

  1. 操作系统。操作系统仅将特定范围的虚拟地址映射到物理地址。到达映射的虚拟地址范围的末尾后,尝试访问不存在的虚拟地址会生成SIGSEGV

  2. 没有。至少在任何现代操作系统上都没有。

  3. 除非您在主机操作系统的虚拟机中发现错误并将其利用,否则不会这样做。