2

セグメンテーション違反を処理しようとしていません。多かれ少なかれ、例外処理がどのように機能するかを理解しています。そもそも過ちを犯したくない。私がしたいのは、関数を呼び出すか、実際にアクセスして障害を発生させることなく、その特定のメモリ位置/ブロックがアクセス可能かどうかを示す値を返す操作を実行することです。

つまり、実際にアクセスする前に、Linux や Mac OS X のアドレスをプローブする C 関数が必要です。何かのようなもの:

result = probe_memory(address,length)

結果はどこにありますか

 0 = writable
 1 = read-only
-1 = nonexistent

またはそれらの線に沿った何か。

Linux や Mac OS X にそのようなものはありますか?

4

3 に答える 3

3

多かれ少なかれ、次のようなものが機能するはずです。

int probe_memory(void *address, size_t length) {
    int result, fd[2];

    pipe(fd);  /* Remember to check for errors! */

    errno = 0;
    result = write(fd[1], address, length);

    if (result < 0 || (size_t)result != length || errno == EFAULT) {
        result = 0;
    } else {
        result = 1;
    }

    close(fd[0]);
    close(fd[1]);

    return result;
}

このコードはページ保護をチェックしないため、これは問題の部分的な解決策です。

基本的な考え方は、OS がへの呼び出しを通じてlengthからバイトを読み取れるようにすることです。メモリにアクセスできない場合は、segfault をトリガーせずに戻ります。addresswriteEFAULT

Jonathan Lefflerは、彼のStack Overflow Questions リポジトリに完全に完成した実装を書きました。

于 2013-09-18T03:59:40.673 に答える
0

応答のリストを忘れていました-書き込み可能ですが、OS/重要なものによって使用されています/実際にはメモリマップされた自己破壊などです.

あなたの最善の策は、あなたが所有する場所にのみ書き込むという防弾コードを作成することです。

割り当て、チェック、コピー、変更は、OS アームをひねって必要な情報を提供しようとするよりも、おそらく、自分でチェックしようとするよりも、より迅速で、信頼性が高く、移植可能で、保守しやすいものになるでしょう。

于 2013-09-18T05:04:02.343 に答える