gpt4 book ai didi

c++ - signal.h 是捕获空指针的可靠方法吗?

转载 作者:太空狗 更新时间:2023-10-29 20:54:43 25 4
gpt4 key购买 nike

我目前正在用 C/C++ 编写一个小型 VM。显然,如果用户取消引用空指针,我不能让整个 VM 崩溃,所以我必须检查每一次访问,随着 VM 的增长和更多系统的实现,这变得越来越麻烦。

所以我有了一个想法:为 sigsegv 编写一个信号处理程序,让操作系统执行它的操作,而不是关闭程序调用 VM 异常处理程序。

它似乎可以工作(使用我非常简单的测试用例),但我没有发现任何东西可以保证 Sigsegv 被抛出在 null-derefs 上,也没有发现处理程序被操作系统生成的信号调用。

所以我的问题是:我可以指望现代 destkop 操作系统上的 signal.h(我真的不在乎它是否不是标准的,因为它不能在 linux/win 以外的东西上工作:它是一个宠物项目)。有什么我应该注意的重要事情吗(signal(...) 或 longjmp(...) 的模糊限制?)

谢谢!

这是伪实现:

/* ... */

jmp_buf env;

/* ... */

void handler(int) {
longjmp(env, VM_NULLPTR);
}

/* ... */

if(setjmp(env)) {
return vm_throw("NullPtrException");
}
switch(opcode) {

/* instructions */

case INVOKE:
*stack_top = vm_call(stack_top->obj); // don't check anything in the case where stack_top or stack_top->obj is null handler() will be called an a "NullPtrException" will be thrown
break;

/* more instructions */

}

/* ... */

注意:我只需要检查空值,垃圾(悬挂)指针由 GC 处理,不应发生。

最佳答案

只有在从不从异步信号不安全代码调用信号处理程序的情况下,从信号处理程序调用 longjmp() 才是安全的。因此,例如,如果您可能通过将错误指针传递给任何 printf() 函数系列来接收 SIGSEGV,则您不能从信号处理程序中使用 longjmp()

关于c++ - signal.h 是捕获空指针的可靠方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38291858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com