正式な保証をお探しの場合は、お手伝いできません。使用しているコンパイラと OS のドキュメントを参照する必要がありますが、必要な保証が見つかるとは思えません。ただし、一部の特殊な組み込みシステム OS を除きます。
ただし、問題なく動作することを 99.99% 確信している 1 つのシナリオを提供できます。
- ウィンドウズ
- 32 ビット プロセス
- 関数は、再配置情報を持たないモジュールにあります
- 問題のモジュールは、クライアント側で既にロードおよび初期化されています
- 問題のモジュールは両側で 100% 同一です
- 非常にクレイジーなことをしないコンパイラ (たとえば、MSVC と GCC はどちらも問題ないはずです)
DLL 内の関数を呼び出す場合、問題が発生する可能性があります。上記のリストによると、モジュール (=DLL) には再配置情報が含まれていない可能性があります。これにより、もちろん再配置が不可能になります (これが必要です)。残念ながら、これは、「優先読み込みアドレス」が他の何かによって使用されている場合、DLL の読み込みが失敗することも意味します。ですから、それは一種の危険です。
ただし、関数が EXE にある場合は問題ありません。32 ビット EXE は再配置情報を必要とせず、ほとんどの場合含まれません (MSVC の既定の設定)。ところで: ASLR はここでは問題ではありません。なぜなら、a) ASLR は移動したいというタグが付けられたモジュールのみを移動し、b) ASLR は再配置情報なしでは 32 ビット Windows モジュールを移動できなかったからです。
上記のほとんどは、関数が両側で同じアドレスを持つことを確認するだけです。残っている唯一の質問-少なくとも私が考えることができる-は、バイトパターンが目的の関数のアドレスを取得した場合と同じでしょうか? これは確かに C++ 標準では保証されていませんが、現在の実際のコンパイラで問題が発生することはないと思います。
そうは言っても、セキュリティと堅牢性が本当に重要ではない状況を除いて、それを行うことはお勧めしません.