(任意のタイプの)ポインターが現在のプロセスにマップされているかどうかを判断するためのダーティハックは、ポインターをaccess
システムコールに渡してから、をチェックするerrno
ことですEFAULT
。もう1つは、を使用munlock
して確認することですENOMEM
。もう1つは、解析すること/proc/PID/maps
です。できればprocfsに依存せずに、副作用が少ない方法はありますか?
質問する
102 次
1 に答える
1
ポインターへのアクセスを確認する方法は、単純に使用してみることです。アクセス権がない場合は、SIGSEGV を受け取ります。これは、独自のシグナル ハンドラーでキャッチできます。
これを行うにはsetjmp()
、ポインターにアクセスする前に関数を使用し、シグナル ハンドラーをlongjmp()
アウトする必要があります。これらの行に沿ったもの:
if (setjmp(jmp_buf)) printf("The pointer was inaccessible.\n");
else {
int x = *ptr;
printf("The pointer was readable.\n");
}
シグナル ハンドラーでは、次のことを行います。
...
longjmp(jmp_buf, 1);
これにより、アプリケーションは関数内の特定のポイントで再開され、setjmp()
すべてのレジスタが復元され、関数が返され1
ます (デフォルトの ではなく0
)。
于 2012-06-19T18:15:26.373 に答える