有没有办法在C中返回导致SIGSEGV的地址?

Zir*_*Bai 5 c segmentation-fault

我是一个C假人,正在研究一个C项目,它要求我编写一个信号处理程序来捕获SIGSEGV信号并执行一些操作.

基本上,主程序将尝试访问既不可读也不可写的内存块.当主程序访问这块内存时,它将引发一个SIGSEGV信号,在我的信号处理函数中,我将捕获信号并使用mprotect()将该内存块转换为可读写.

但我不知道有没有办法得到信号被我的信号处理程序捕获时导致SIGSEGV的地址.如果我没有导致SIGSEGV的实际地址,我什么也做不了.并且我不允许从main获取地址到我的信号处理程序.

有人能帮我吗?谢谢!

mel*_*ene 4

至少在 Linux 上答案是肯定的。

您可以用来sigaction注册信号处理程序,然后设置标志SA_SIGINFO并设置sa_sigaction处理程序。

这使您可以访问siginfo_t(信号处理程序的第二个参数),其中(除其他外)包含一个void *si_addr;字段,该字段(对于SIGSEGV)包含错误地址。

#define _POSIX_C_SOURCE 199309L
#include <signal.h>

void my_handler(int sig, siginfo_t *info, void *ucontext) {
    ... info->si_addr ...
}

...
struct sigaction act = {0};
act.sa_sigaction = my_handler;
act.sa_flags = SA_SIGINFO;
sigaction(SIGSEGV, &act, NULL);
Run Code Online (Sandbox Code Playgroud)

man 2 sigaction详情请参阅。