LLVM:在程序中实现安全的多实例环境

时间:2014-02-26 11:38:26

标签: c++ c multithreading llvm

我是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的许多实例(在不同的线程中)。

提前致谢!

1 个答案:

答案 0 :(得分:1)

可行?在某种程度上。你可以为SIGSEGV设置一个信号处理程序并杀掉那里有问题的线程并忽略错误。

但那是不是防弹(不是说好主意)?不。你正在运行的程序显然是错误的或恶意的 - 你不知道在最终导致SIGSEV或其他错误之前他们搞砸了什么。因此,您在同一进程中编写的任何错误处理代码都可能被恶意程序覆盖,您无法做太多。

在执行不受信任的错误代码(主要示例是浏览器供应商)时,您应该做其他人所做的事情:在自己的进程中运行所有内容并使用进程间通信。这会将您信任的代码与不受信任的代码分开。