1

UnixのIsBadReadPtrに類似した関数はありますか?IsBadReadPtrの少なくともいくつかの機能?SIGSEGVプロセス(など)に何か悪いことが起こった場合に反応し、いくつかの情報を回復するプロシージャを作成したいと思います。ただし、ポインタをチェックして、データが破損していないことを確認し、安全にアクセスできるかどうかを確認したいと思います。そうしないと、クラッシュ処理手順自体がクラッシュし、役に立たなくなります。

助言がありますか?

4

4 に答える 4

8

POSIXシステムでこれを行う通常の方法は、write()システムコールを使用することです。メモリを読み取れない場合は、シグナルを発生させるのではなく、EFAULT戻ります。errno

int nullfd = open("/dev/random", O_WRONLY);

if (write(nullfd, pointer, size) < 0)
{
    /* Not OK */
}
close(nullfd);

/dev/randomこれはLinuxで使用するのに適したデバイスです。これは、すべてのユーザーが書き込むことができ、実際に指定されたメモリを読み取ろうとするためです。/dev/random書き込みができない、または書き込みができないOSでは、試してください/dev/null)。もう1つの方法は無名パイプですが、広い領域をテストする場合は、パイプの読み取り端を定期的にクリアする必要があります。

于 2011-01-06T05:08:21.163 に答える
1

どうすればいいですか?

あなたはそれをやろうとし、それからエラーを処理します。

これを行うには、最初にsigsetjmpとSIGSEGVシグナルハンドラーを設定します。次に、ポインタの使用を試みます。ポインタが不良だった場合は、SIGSEGVハンドラーが呼び出され、安全にジャンプしてユーザーにエラーを報告できます。

于 2011-01-06T05:12:24.627 に答える
1

WindowsでもUnixでも、「ポインタに安全にアクセスできるかどうか」はわかりません。ただし、一部のUNIXプラットフォームに関する同様の情報については、を確認してくださいcat /proc/self/maps

于 2011-01-06T04:40:52.350 に答える
0

仮想ボックス内からUbuntuを実行しているときに、フレームバッファーから「ピクセル」を読み取ろうとすると、同じ問題が発生しました。gdbをクラッシュさせたり、実際にハングさせたりせずにアクセスをチェックする安全な方法はないようです。StasMによる提案は、フォークを使用して機能する「ローカル」ソリューションに従うことを示唆しました。

void *some_address;
int pid = fork();
if (pid== 0)
{
    someaddress[0] = some_address[0];
    _exit(123);
}
bool access_ok = true;
int status;
int result = waitpid(pid, &status, 0);
if (result == -1 || WIFEXITED(status) == 0 || WEXITSTATUS(status) != 123)
{
    access_ok = false;
}
于 2019-05-29T09:15:10.810 に答える