我是LLVM的初学者,但不是编程本身。对于我的一个项目,我需要一个安全的多实例环境。我为此选择了LLVM。我用谷歌搜索了一个星期,一无所获。
所以,这是我的问题:是否可以运行多个ExecutionEngine并加载相同的bitcode,并且即使在VM指针取消引用或类似的东西(在正常情况下导致SIGSEGV)发生在VM中之后仍继续运行。
例如:
1)创建一个内部有问题的简单程序
int* p = NULL;
*p++;
2)将其编译为bitcode
$ clang -c -emit-llvm -o null.bc null.c
3)在其他程序中运行(类似
)
LLVMContext context;
string error;
Module *m = ParseBitcodeFile(MemoryBuffer::getFile("null.bc"), context, &error);
ExecutionEngine *ee = ExecutionEngine::create(m);
Function* func = ee->FindFunctionNamed("main");
typedef void (*PFN)();
PFN pfn = reinterpret_cast<PFN>(ee->getPointerToFunction(func));
pfn();
)
4)捕获异常(显然是SIGSEGV),但DO不会崩溃主程序。
翻译有可能吗?还是JIT? (MCJIT显然不起作用)
同样,应该可以运行bitcode的许多实例(在不同的线程中)。
提前致谢!
答案 0 :(得分:1)
可行?在某种程度上。你可以为SIGSEGV设置一个信号处理程序并杀掉那里有问题的线程并忽略错误。
但那是不是防弹(不是说好主意)?不。你正在运行的程序显然是错误的或恶意的 - 你不知道在最终导致SIGSEV或其他错误之前他们搞砸了什么。因此,您在同一进程中编写的任何错误处理代码都可能被恶意程序覆盖,您无法做太多。
在执行不受信任的错误代码(主要示例是浏览器供应商)时,您应该做其他人所做的事情:在自己的进程中运行所有内容并使用进程间通信。这会将您信任的代码与不受信任的代码分开。