在沙盒中运行插件

Running plugins in a sandbox

本文关键字:运行 插件      更新时间:2023-10-16

我正在设计一个系统在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);
}

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

为插件创建一个包装器进程,并通过IPC与该包装器通信。在插件失败的情况下,你的主进程将不受影响

简单地说,您不能在同一过程中做到这一点。如果您的插件是用C或c++编写的,它们可能包含许多未定义行为的来源,这意味着无法检测到不可避免的崩溃的来源。所以你应该像kassak建议的那样,在自己的进程中启动插件,如果他们想崩溃,让他们崩溃,或者为你的插件使用另一种语言,例如一些解释脚本语言,如lua。

看看http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.90).aspx

在我的一个项目中,我使用/EHa来帮助我从做愚蠢的事情的库中捕获异常。如果你用这个设置编译你的代码,一个正常的try catch块将捕获异常,如除以零等。