2014-02-26 47 views
2

我是LLVM的初學者,但本身並沒有編程。對於我的一個項目,我需要一個安全的多實例環境。我選擇LLVM。我搜索了一個星期,沒有發現任何東西。LLVM:在程序中實現安全的多實例環境

所以,這是我的問題:是否有可能運行多個ExecutionEngine的相同的位代碼加載到並繼續運行,即使在空指針解引用或類似的東西(這在正常情況下導致SIGSEGV)發生在VM中。

例如:

1)創建一個簡單的程序與內部

int* p = NULL; *p++;

2)編譯的一個問題它位碼

$ 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顯然是行不通的)

再次,它應該是可以運行許多情況下(在單獨的線程)。

在此先感謝!

回答

1

可以嗎?在某種程度上。您可以爲SIGSEGV設置一個信號處理程序,並在那裏殺掉有問題的線程並忽略錯誤。

不過是防彈(不是一個好主意說吧)?不。你正在運行的程序顯然是bug或惡意 - 你不知道他們最終導致SIGSEV或其他錯誤之前搞砸了什麼。因此,您在同一個進程中編寫的任何錯誤處理代碼都可能被惡意程序覆蓋,您無法做太多的工作。

你應該做執行不可信當別人都做這些天,bug的代碼(主要例子是瀏覽器廠商):在自己的進程運行的一切,並使用進程間通信。這將您的可信代碼與不可信代碼分開。

+0

我只是確保代碼(在虛擬機上運行)不是惡意的,因爲它是我寫的。但我無法確定它是沒有問題的。顯然,SIGSEGV不會是一個單一的信號捕捉。 – user3355546

+0

@user無論您是否有惡意代碼或只是普通的老bug代碼,基本問題都是一樣的,惡意代碼更有可能以有趣的新方式利用它。 – Voo

+0

那麼,LLVM不能用來解決這種僞沙箱問題? – user3355546