确定指针是否映射到当前进程

时间:2012-06-19 17:24:49

标签: c memory system-calls

确定指针(任何类型)是否映射到当前进程的脏黑客是将指针传递给access系统调用,然后检查errno EFAULT 。另一种方法是使用munlock并检查ENOMEM。另一个是解析/proc/PID/maps。是否存在副作用较少的方法,最好不依赖于procfs?

1 个答案:

答案 0 :(得分:1)

检查指针的访问方法就是尝试使用它;如果您没有访问权限,您将收到一个SIGSEGV - 您可以使用自己的信号处理程序捕获。

为此,您需要在访问指针之前使用setjmp()函数,并且您需要将信号处理程序移至longjmp()。这些方面的东西:

if (setjmp(jmp_buf)) printf("The pointer was inaccessible.\n");
else {
    int x = *ptr;
    printf("The pointer was readable.\n");
}

在您的信号处理程序中,您需要:

...
longjmp(jmp_buf, 1);

这将使您的应用程序在<{em> {/ 1}}函数中的某个特定点恢复,其方式是恢复所有寄存器并使函数返回setjmp()(而不是其默认值为1)。