我是 LLVM 的初学者,但不是编程本身。对于我的一个项目,我需要一个安全的多实例环境。为此,我选择了 LLVM。我用谷歌搜索了一个星期,但一无所获。
所以,这就是我的问题:是否有可能运行多个 ExecutionEngine 并加载相同的位码并继续运行,即使在 VM 中发生 NULL 指针取消引用或类似的事情(在正常情况下会导致 SIGSEGV)之后。
例如:
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),但不要使主程序崩溃。
可以用解释器吗?还是用 JIT? (MCJIT显然不行)
同样,应该可以运行许多位代码实例(在单独的线程中)。
提前致谢!
最佳答案
可行吗?在某种程度上。您可以为 SIGSEGV 设置一个信号处理程序并在那里终止有问题的线程并忽略该错误。
但这真的是防弹的吗(更不用说是个好主意了)?没有。您正在运行的程序显然存在错误或恶意 - 在它们最终导致 SIGSEV 或其他错误之前,您无法知道它们还搞砸了什么。因此,您在同一进程中编写的任何错误处理代码都可能已被恶意程序覆盖,您对此无能为力。
在执行不受信任的错误代码(主要示例是浏览器供应商)时,您应该像其他人一样:在自己的进程中运行所有内容并使用进程间通信。这将您的可信代码与不可信代码区分开来。
关于c++ - LLVM:在程序中实现安全的多实例环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22040201/