C++ 在沙箱中运行插件

C++ 在沙箱中运行插件,c++,c,plugins,sandbox,C++,C,Plugins,Sandbox,我正在用C/C++设计一个系统,这个系统可以用各种插件进行扩展。有一个定义良好的C公共API,主要用于(const)char*和其他指针类型。插件被编译成.so或.dll文件,主应用程序在启动时加载它们,然后根据请求卸载或重新加载它们 插件可能来自不同的来源,可信与否:) 现在,我想确定的是,如果一个插件做了一些愚蠢的事情(比如试图释放一个他不应该释放的内存),这个动作不会导致整个系统崩溃,而只是通知主系统该插件的错误行为,以便将其从队列中移除 代码调用按以下方式进行: const char*

我正在用C/C++设计一个系统,这个系统可以用各种插件进行扩展。有一个定义良好的C公共API,主要用于
(const)char*
和其他指针类型。插件被编译成.so或.dll文件,主应用程序在启动时加载它们,然后根据请求卸载或重新加载它们

插件可能来自不同的来源,可信与否:)

现在,我想确定的是,如果一个插件做了一些愚蠢的事情(比如试图释放一个他不应该释放的内存),这个动作不会导致整个系统崩溃,而只是通知主系统该插件的错误行为,以便将其从队列中移除

代码调用按以下方式进行:

const char* data = get_my_data();
for(int i = 0; i<plugins; i++)
{
   plugins[i]->execute(data);
}
const char*data=get_my_data();
对于(int i=0;i执行(数据);
}

但是如果
plugin[0]
意外释放数据字符串或覆盖它,或者错误地跳转到地址0x0,这将导致整个系统崩溃,我不希望这样。我如何避免这种灾难。(我知道,我可以复制
数据
字符串…这并不能解决我的问题:)

为插件创建一个包装过程,并通过IPC与该包装进行通信。
在插件失败的情况下,您的主进程将保持不变

简单地说,您不能在同一进程中执行此操作。如果你的插件是用C或C++编写的,它们可以包含很多未定义行为的来源,这意味着无法检测到的崩溃的来源。因此,你要么像kassak建议的那样在自己的过程中启动插件,让它们崩溃(如果它们愿意的话),要么为你的插件使用另一种语言,例如一些智能脚本语言,如lua。

看看

我在我的一个项目中使用/EHa来帮助我捕获库中的异常,这些库做了一些愚蠢的事情。如果您使用此设置编译代码,一个普通的try-catch块将捕获异常,如devide by zero等


不确定Linux上是否有类似的解决方案--请告诉我是否有。

我的回答是否帮助您解决了这个问题?如果是,请接受它作为正确答案。+1表示提及/EHa。虽然对于异步异常使用catch(…)不是一种普遍推荐的做法,但我仍然对您使用这种方法的经验感兴趣,即任何复杂情况等。