IsBadReadPtr类似于Unix

时间:2011-01-06 04:36:23

标签: c debugging unix libc

在Unix中是否有与IsBadReadPtr类似的功能?至少IsBadReadPtr的一些功能? 我想写一个程序,如果某个进程发生了不好的事情(比如SIGSEGV),就会做出反应并恢复一些信息。但我想检查指针,以确保数据没有损坏,看看它们是否可以安全访问。否则崩溃处理程序本身将崩溃,从而变得无用。

有什么建议吗?

4 个答案:

答案 0 :(得分:7)

在POSIX系统上执行此操作的常用方法是使用write()系统调用。它将在EFAULT中返回errno,而不是在无法读取内存时发出信号:

int nullfd = open("/dev/random", O_WRONLY);

if (write(nullfd, pointer, size) < 0)
{
    /* Not OK */
}
close(nullfd);

/dev/random是一个很好的设备,可以在Linux上使用它,因为它可以由任何用户编写,并且实际上会尝试读取给定的内存。在没有/dev/random的操作系统上或者它在哪里不可写,试试/dev/null)。另一种选择是匿名管道,但如果你想测试一个大区域,你需要定期清除管道的读数端。

答案 1 :(得分:1)

在Windows或Unix上,你永远无法告诉“是否可以安全地访问指针”。但是对于某些unix平台上的类似信息,请查看cat /proc/self/maps

答案 2 :(得分:0)

你怎么能这样做?

您尝试执行此操作然后处理错误。

为此,首先要设置sigsetjmp和SIGSEGV信号处理程序。然后尝试使用指针。如果它是一个错误的指针,那么调用SIGSEGV处理程序,你可以跳转到安全并向用户报告错误。

答案 3 :(得分:0)

在从virtualbox中运行Ubuntu时,尝试从帧缓冲区读取“像素”时遇到了同样的问题。似乎没有安全的方法来检查访问而不会崩溃或自动挂起gdb。 StasM的建议提示我要遵循使用fork的可行的“本地”解决方案。

void *some_address;
int pid = fork();
if (pid== 0)
{
    someaddress[0] = some_address[0];
    _exit(123);
}
bool access_ok = true;
int status;
int result = waitpid(pid, &status, 0);
if (result == -1 || WIFEXITED(status) == 0 || WEXITSTATUS(status) != 123)
{
    access_ok = false;
}
相关问题