(任意のタイプの)ポインターが現在のプロセスにマップされているかどうかを判断するためのダーティハックは、ポインターをaccessシステムコールに渡してから、をチェックするerrnoことですEFAULT。もう1つは、を使用munlockして確認することですENOMEM。もう1つは、解析すること/proc/PID/mapsです。できればprocfsに依存せずに、副作用が少ない方法はありますか?
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 に答える