2013-04-03 8 views
8

私はすべての種類のプラグインで拡張可能なC/C++のシステムを設計しています。多くの場合、(const) char*とその他のポインタ型で動作する、よく定義されたCの公開APIがあります。プラグインは.soまたは.dllファイルにコンパイルされ、メインアプリケーションは起動時にそれらを読み込み、要求に応じて後でアンロードまたはリロードします。信頼できるかのプラグインは、さまざまなソースから来るかもしれないサンドボックスでのプラグインの実行

、ないので:)今

は、私は、ことを確認したいと思い、1つのプラグインは、彼がいたメモリを解放するためにこのような試みとして愚かな何かを(ない場合このアクションはシステム全体を停止させるのではなく、キューから削除するために誤ったプラグインに関するメインシステムに通知するだけです。

呼び出しは次のように行われているコード:

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

が、データ列「偶然」plugin[0]解放とは、それを上書きするか、誤っては0x0に対処するためにジャンプしている場合、これは、システム全体をダウンさせるだろう私はこれを望んでいません。このような大惨事をどうやって避けることができますか? (data文字列を複製することができます。これは私の問題を解決しません:))

+0

私の答えはこれを解決するのに役立ちましたか?その場合は、正解として受け入れてください。 –

答えて

12

プラグインのラッパープロセスを作成し、そのラッパーとIPCで通信します。 プラグインに問題が発生した場合、メインプロセスはそのままです

0

簡単に言えば、同じプロセスでは実行できません。あなたのプラグインがCまたはC++で書かれている場合、検出不能なクラッシュのためのソースを意味する未定義の動作の多くのソースを含むことができます。そのため、kassakのような独自のプロセスでプラグインを起動し、必要に応じてクラッシュさせたり、プラグインに別の言語を使用する必要があります。 luaのようなintepretedスクリプト言語

-1

は、私は私が愚かのことを行うライブラリからの例外をキャッチ助けるために私のプロジェクトの一つに/ EHAを使用http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.90).aspx

を見てください。この設定でコードをコンパイルすると、通常のtry catchブロックはゼロなどの除外のような例外をキャッチします。

Linux上でこれに相当するものがあるかどうかわかりません -

関連する問題