在沙盒中运行插件
Running plugins in a 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);
}
但是如果plugin[0]
"意外地"释放数据字符串或覆盖它,或者错误地跳转到地址0x0,这将导致整个系统崩溃,我不希望这样。我怎样才能避免这种灾难呢?(我知道,我可以复制data
字符串…这并不能解决我的问题:))
为插件创建一个包装器进程,并通过IPC与该包装器通信。在插件失败的情况下,你的主进程将不受影响
简单地说,您不能在同一过程中做到这一点。如果您的插件是用C或c++编写的,它们可能包含许多未定义行为的来源,这意味着无法检测到不可避免的崩溃的来源。所以你应该像kassak建议的那样,在自己的进程中启动插件,如果他们想崩溃,让他们崩溃,或者为你的插件使用另一种语言,例如一些解释脚本语言,如lua。
看看http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.90).aspx
在我的一个项目中,我使用/EHa来帮助我从做愚蠢的事情的库中捕获异常。如果你用这个设置编译你的代码,一个正常的try catch块将捕获异常,如除以零等。相关文章:
- 运行命令 "rosbag play example.bag" 时出错。找不到与插件 rosbag/NoEncryptor 对应的库
- 在 linux 原因上运行自定义原型插件
- 在 Windows 10 中运行 gcc 插件的问题
- 如何使用 Gradle MSBuild 插件运行 SonarQube Scanner
- 如何使用Cmake Build Config运行LLVM Libclang工具,该工具不是我整个代码库上的插件
- 带有C++插件的节点应用程序在运行时抱怨未定义的符号
- 我的C++ Unity 插件在编辑器中运行一次,但不能运行两次
- Vim如何在某些文件类型上运行/加载某些插件
- c++工厂:通过运行时加载的插件扩展寄存器
- 无法运行使用 macdeployqt 创建的 OSX 应用程序。使用 Fusion 样式时缺少可可插件
- 如何在运行时通过插件机制动态加载数据类型
- 使用授予的权限运行NPAPI插件(firebreath)
- 创建一个QML插件来运行系统命令
- 用于运行测试和浏览报告的Eclipse (CDT)插件
- 如何在运行时(启动)更改Open Scene Graph插件目录
- 在沙盒中运行插件
- Uv_queue_work没有在node插件(c++)中运行callback_method
- 节点.js本机插件 - 包装类的析构函数不运行
- 使用特征的插件在第二次运行时崩溃
- node.js/[我自己的库/插件]如何在v8上运行?