【问题标题】:How to test if an address is readable in linux userspace app如何在linux用户空间应用程序中测试地址是否可读
【发布时间】:2011-10-31 08:46:57
【问题描述】:

出于调试目的,我需要测试一个指针以查看它是否指向有效的可读页面。目前我正在解析 /proc/[pid]/maps 以查看地址是否映射正常,但这似乎有点冗长。有没有更好的办法?谢谢。

【问题讨论】:

  • 我也在解析/proc/self/maps
  • @GregoryPakosz:为了成为一个通用且可靠的解决方案,是否需要在每次检查时重新加载和重新解析映射以解决诸如不断增长的堆或新映射的内存段之类的问题?
  • @etherice:不,因为 /proc 是自刷新的;每次访问 /proc 文件时,内核代码都会运行并重新生成它的“内容”。
  • @etherice 我相信这是正确的。在存在并行性、中断或硬件故障的情况下,任何对此的解决方案基本上都是不可靠的。使用时间竞赛窗口 (CWE-367) 有一个检查时间。地址指向的内存在检查地址和使用地址之间可能会被取消映射、保护或中毒。

标签: linux memory segmentation-fault memory-address


【解决方案1】:

规范的方法是使用write() 系统调用从页面读取(写入一个虚拟的pipe() 文件描述符)。如果传递给write() 的缓冲区不可读,它将返回-1 和errno == EFAULT,而不是出错。

【讨论】:

  • 警告:至少有一个其他 SO 解决方案建议为此目的使用 /dev/null (stackoverflow.com/questions/4611776/…),但较新的内核(我在 3.8.7 上测试)为 /dev/ 返回成功即使 'buf' 为 NULL,也为 null write()。因此,尽管此测试可能适用于您正在测试的任何系统上的 /dev/null,但它绝对不是一个可移植的解决方案。使用其他一些 fd(如虚拟管道或 posix shm 对象)不会那么快,但它肯定会更安全、更便携。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 2021-09-30
相关资源
最近更新 更多