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

标签 c++ c multithreading llvm

我是 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/

相关文章:

python - 接收 linux 信号并与线程交互

c++ - 在多线程程序中同步嵌入式Python

java - 使用newCachedThreadPool时如何获取当前线程数

c++ - 使用导入的静态函数构建 C++ 类

c++ - 在同一个 C++ 源文件中使用多个命名空间是一种好习惯吗?

c - 如何在C中运行shell命令

c - 在 Asterisk 中使用 libwebsockets + ssl 在创建 ssl 上下文时出错 140A90A1 :lib(20):func(169):reason(161)

c - struct Complex (*ptr1)[4] 和 struct Complex *ptr1 之间的区别

c++ - 如何计算 int64_t 的平均值

c++ - 使用 C++ 将 CPU 专用于在 1 个内核上运行您的进程