【问题标题】:What are the values that are stored in unused memory space?存储在未使用的内存空间中的值是什么?
【发布时间】:2019-07-24 01:52:18
【问题描述】:

我使用 mmap() 从 /dev/zero 分配 4096 长度的内存空间,我发现我仍然可以访问这个空间之外的内存(例如 start_pt 是指向该空间的指针,我可以打印*start_pt+8192 的值没有任何分段错误)。并且存储在越界区域中的值似乎是随机的。

有人知道这些值是什么以及我为什么可以访问它们吗?

【问题讨论】:

  • 访问越界内存是未定义的行为,任何事情都可能发生。不要这样做,或尝试推理它。
  • 在 Linux cat /proc/1234/maps 上,你会看到。将 1234 替换为程序的 PID。添加睡眠或其他内容,使其不会退出。
  • 你指的是*start_pt + 8192还是*(start_pt + 8192)?前者有效;后者不是。
  • @Shawn 除非您正在寻找安全漏洞。那么 C 编程语言和未定义的行为是你最好的朋友。
  • 和往常一样:发布您的实际代码,以便我们可以尝试与您完全相同的实验。

标签: c mmap virtual-memory


【解决方案1】:

有时,您的进程中的其他东西向操作系统请求了内存。如果不检查您的具体过程,通常不可能说出什么。候选人包括:

  • 当您的程序启动时,加载程序会为您的代码、常量数据、堆栈等设置内存。此外,为您的程序创建新进程的进程(可能是命令行 shell)可能在内存中有些东西在执行新程序的过程中会保留下来。 (例如,我不确定命令行参数是直接从父级继承还是由启动代码通过一些进程间通信接收它们获得的。)
  • 当您的程序的启动代码正在运行时(由加载程序启动并在调用main 之前设置 C 环境的代码),它可能出于各种目的(准备文件缓冲区、初始化malloc 和其他东西的内存池),包括它自己的计算。
  • 如果您在mmap 之前调用了任何例程,它们可能已请求内存。例如,当您打开文件时可能会创建缓冲区,printf 为其需要执行的格式化操作准备一些工作空间,malloc 除了返回给您之外,还需要额外的内存来保存自己的记录。

基本上,除了您在纯 C 代码中观察到的那些之外,内存中还会发生各种事情。

【讨论】:

    【解决方案2】:

    未使用的内存没有映射到进程地址空间。如果您可以访问内存,则意味着某些东西已经使用 mmap(或等效)映射了内存。如果内存未使用,您将无法访问它。

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2012-02-18
      • 2019-03-17
      • 2019-09-18
      • 2020-06-18
      • 1970-01-01
      相关资源
      最近更新 更多