2012-04-23 3 views
1

標準によると、typeid演算子は実装依存であるため、別のコンパイラでコンパイルされた他のプロセスによって作成されたオブジェクトで使用するのはナンセンスです。しかし、提供プロセスが同じコンパイラによってコンパイルされる状況はどうですか?同じコンパイラでコンパイルされた別のプロセスから提供されたポインタにtypeidを使用するのは安全ですか?

+0

なぜ型を知る必要がありますか?破損した設計である可能性があります。 –

答えて

3

異物に検査プロセスのポインタではなく、自身のプロセス空間内にvtableポインタが含まれているため、おそらく動作しません。実行可能なバイナリイメージが実行中のものと同じように配置されているアドレス空間を形成することができれば、それは多分です。同一のコンパイラと同じコマンドラインフラグを使用した場合、またはプラットフォームABIが実行時にtypeidの動作を正確に指定している場合は、問題ありません。

厳密に言えば、C++オブジェクトモデルは共有メモリに対応していません。プロセス間で送信する前にシリアル化する必要があり、受信側に存在しないC++型を安全にシリアル化する方法はありません。

+0

まあ、私はメモリ共有の問題を考慮しませんでした。すべてのクラスがライブラリで定義されていて、各プロセスの実行可能ファイルがライブラリにリンクされている場合は、両方ともクラス定義があります。それは働くでしょうか? –

+0

@ LiuYongtaiほとんどのOSは、アドレス空間のランダム化を使用して、これが起こらないようにします。問題は、このような戦略は、正当な使用よりも外部アプリケーションの間で広がったり、外部アプリケーションを制御しようとするウイルスにとって、より有用であるということです。 OSを入手して、すべてのプロセスで同じ仮想アドレス範囲にライブラリをロードすることは可能かもしれませんが、これはおそらく良い戦略ではありません。 – Potatoswatter

関連する問題