我目前正在开发一个单元测试框架,用户可以在其中创建测试用例并在框架中注册。
我还想确保如果任何用户测试代码导致崩溃,它不应该使整个框架崩溃,而是应该被标记为失败。为了完成这项工作,我编写了以下代码,以便我可以在沙盒函数中运行用户代码
bool SandBox(void *(*fn)(void *),void *arg, void *rc)
{
#ifdef WIN32
__try
{
if (rc)
rc = fn(arg);
else
fn(arg);
return true;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
return false;
}
#else
#endif
}
这在 Windows 上完美运行,但我希望我的框架是可移植的,为了做到这一点,我想确保 posix 环境具有类似的功能。
我知道 C 信号处理程序可以拦截 OS 信号,但是将信号处理机制转换为 SEH 框架有一些我无法解决的挑战
- 即使我的程序收到信号,如何继续执行?
- 如何将执行控制从失败位置跳转到可用于错误处理的块(类似于除外)?
- 如何清理资源?
另一种可能性是我正在考虑在具有自己的信号处理程序的单独线程上运行用户测试代码并从信号处理程序终止线程,但再次不确定这是否可行。
因此,在我想得更远之前,如果他们知道解决这个问题/情况的更好解决方案,我希望得到社区的帮助。