【问题标题】:Running plugins in a sandbox在沙箱中运行插件
【发布时间】:2013-04-03 12:00:04
【问题描述】:

我正在用 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 字符串...这并不能解决我的问题:))

【问题讨论】:

  • 我的回答是否帮助您解决了这个问题?如果是,请接受它作为正确答案。

标签: c++ c plugins sandbox


【解决方案1】:

为插件创建一个包装器进程并通过 IPC 与该包装器通信。 如果插件失败,您的主进程将保持不变

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      不确定在 Linux 上是否有类似的东西——如果有,请告诉我..

      【讨论】:

      • +1 用于提及 /EHa。虽然通常不建议将 catch(...) 用于异步异常,但我仍然对您使用这种方法的经验感兴趣,即任何并发症等。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多