2013-04-03 58 views
8

我正在用C/C++設計一個系統,它可以通過各種插件進行擴展。有一個明確定義的C公共API,主要與(const) char*和其他指針類型一起使用。插件被編譯成.so或.dll文件,並且主應用程序在啓動時加載它們,隨後根據請求卸載或重新加載它們。在沙箱中運行插件

的插件可能會從各種渠道進來的,值得信賴的或不那麼:)

現在,我想確保,如果一個插件做一些愚蠢的事(如試圖釋放他是一個記憶不應該自由),但這一行爲並沒有降低整個系統的效能,只是通知主系統關於該行爲不當的插件,以便將其從隊列中移除。

調用以下方式正在做的代碼:

const char* data = get_my_data(); 
for(int i = 0; i<plugins; i++) 
{ 
    plugins[i]->execute(data); 
} 

但如果plugin[0]的FreeS「意外」的數據字符串或覆蓋,或錯誤地跳轉到地址0x0這會搞垮整個系統,我不想要這個。我怎樣才能避免這種災難。 (我知道,我可以複製data字符串......這並不能解決我的問題:))

+0

我的回答有助於你解決這個問題嗎?如果是這樣,請接受它作爲正確答案。 –

回答

12

爲插件創建一個包裝進程並通過IPC與該包裝進行通信。 在插件失敗的情況下,您的主要過程將不會被觸動

0

簡而言之,您不能在同一個過程中這樣做。如果你的插件是用C或C++編寫的,它們可能包含大量未定義行爲的來源,這意味着無法檢測到不可避免的崩潰。因此,您應該在自己的流程中啓動插件,例如kassak建議的插件,並讓它們在需要時崩潰,或者爲插件使用其他語言,例如一些像lua這樣的解釋性腳本語言。

-1

看一看http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.90).aspx

我用/ EHA在我的項目之一,以幫助我抓住從做愚蠢的事情庫例外。如果你用這個設置編譯你的代碼,一個正常的try catch塊會捕獲異常,例如由零等devide。

不知道在Linux上是否有一些等價物 - 請讓我知道如果有..