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