在沙箱中运行插件

Fer*_*eak 8 c c++ plugins sandbox

我正在设计一个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);
}
Run Code Online (Sandbox Code Playgroud)

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

kas*_*sak 12

为插件创建一个包装器进程,并通过IPC与该包装器进行通信.如果插件失败,您的主要流程将不受影响