1

ポインターのアクセシビリティの検証に関する質問を投稿しました。結論は、IsBadReadPtr を使用してポインターをチェックするか、SEH を使用して例外をキャッチすることでした (どちらも使用せずにアプリケーションをデバッグすることが望ましいですが、それはここでは問題ではありません)。

IsBadReadPtr は、他の理由の中でも特に、ポインターを読み取ろうとし、例外をキャッチするため、悪いと言われています。スタック ガード ページの例外をキャッチする可能性があり、スタックを拡大する必要があるメモリ マネージャーに到達できなくなります。

SEH を使用して EXCEPTION_ACCESS_VIOLATION 例外のみをキャッチすると、同じ問題が発生しますか?

別のこと: SEH を使用することの意味は何ですか? この記事では、「コンパイラは SEH で保護されたコードでフロー解析を実行できない」ことを示唆しています。__try ブロック内で関数を呼び出すとどうなりますか。コンパイラは呼び出された関数をまったく最適化しませんか?

4

1 に答える 1

1

SEH を使用して EXCEPTION_ACCESS_VIOLATION 例外のみをキャッチすると、同じ問題が発生しますか?

そうだと思います。回避策は、IsBadReadPtr の呼び出しを開始する前に、知っていて関心のあるスレッドのスタックをプローブすることです (「スタックをプローブする」とは、スタック内のすべてのメモリ ページに意図的に触れて、ページは事前に割り当てられます)。

コンパイラは呼び出された関数をまったく最適化しませんか?

関数がインライン化されていない場合、コンパイラが通常の最適化を適用することを期待します (関数の最適化は、関数がどこから呼び出されても影響を受けません)。

于 2009-06-14T19:36:25.367 に答える