1

これは一般的に非常に悪い考えであり、安全に実行できるのはプログラムを終了することだけであることを示唆するSOについても含めて、私は多くのことを読みました。これが本当かどうかはわかりません。

これは、mallocに大量の割り当てを渡すプーリングメモリアロケータ用です。pool_free()中に、ポインターがプールに属しているか、mallocで割り当てられているかを確認する必要があります。アドレスを最も近い1MBの境界に切り捨てることにより、プール内のメモリブロックの先頭へのポインタを取得します。mallocが使用されている場合は未定義です。最初のケースでは、メモリのブロックがプールに属していることを簡単に確認できますが、そうでない場合は、この確認に失敗するかアクセス違反が発生します(これは読み取り専用プロセスであることに注意してください)。これをSEH(Windows)でキャッチしたり、シグナル(POSIX)を処理して、検証の失敗として処理したりすることはできませんか?(つまり、これはmallocが使用された場合にのみ可能であるため、ptrをfree()に渡します)

編集:人々は上記のORを見逃しているようです。ポインターがmallocで割り当てられた場合、アクセス違反が発生することはないと思いますが、これは考えられる結果の1つです。ブロックの先頭(1MB境界)へのポインタを使用する手順は、マジックナンバーを確認してから、メモリプールへのポインタをたどり、ブロックへの前述のポインタが実際に含まれていることを確認することです。これらの読み取り専用ステップのいずれかがアクセス違反を生成した場合、個々のステップが失敗した場合と同じように確実に検証に失敗します。

4

4 に答える 4

2

より良いテストが必要です。切り捨てポイントもアプリケーションに割り当てられている可能性があるため、mallocが使用された場合に、AVを取得できるという実際の保証はありません。したがって、そのメモリへのアクセスが許可されます。

于 2010-05-28T22:15:38.780 に答える
1

反応メカニズムを実装する必要はありません。ヒープ割り当てを1MBの境界に揃えることで、問題の前に立つことができます。

  1. ウィンドウズ:_aligned_malloc(size, 1<<20)
  2. Unix:memalign(1<<20, size)

このアプローチを使用すると、1 MBに切り捨てると、割り当てられたメモリブロックを指すことが保証され、そのアドレスがプール内にあるかプール外にあるかを識別する必要があります(この場合は明らかにmalloc編集されています)。

本当に大きなオブジェクトには、整列されたヒープ割り当てのみを使用することに注意する必要があります。たとえば、サイズが100 kBを超える場合、アロケータはオブジェクト間に大きなギャップを残します。理想的には、1MBのプールブロックに収まらないオブジェクトにのみ使用してください。

于 2010-05-28T22:14:16.600 に答える
0

安全だと思います。しかし、おそらく悪い考えです。

ただし、プールに割り当てられたメモリとプールに割り当てられていないメモリを混在させる必要がある場合は、その情報をどこかに保存する必要があると思います。たぶん、pool_alloc()を使用して行われたすべてのメモリ割り当てには、実際の割り当ての前に「隠された」小さなヘッダーが含まれる可能性があります。このヘッダーは、それがどのように割り当てられたかに関する情報を保持できます。したがって、char * block =(char *)pool_alloc(32)は、実際には32 + sizeof(BlockHeader)バイトを割り当てます。そして、block --sizeof(BlockHeader)はヘッダーへのアクセスを提供します。

IsBadReadPtrは、msdnによると廃止されました。

重要この機能は廃止されたため、使用しないでください。その名前にもかかわらず、ポインタが有効であること、またはポイントされたメモリが安全に使用できることを保証するものではありません。詳細については、このページの備考を参照してください。

于 2010-05-28T22:25:31.613 に答える
0

わかりました。inazarukは、IsBadReadPtr + VirtualQueryの使用を提案するために大幅に反対票を投じて削除した回答を投稿しました(ガードページやアクセスページがないことを避けるため)。アクセス違反よりも副作用。

スレッドスタックの最後にあるガードページに誤ってアクセスすると、そのスレッドスタックが大きくなると、プログラムが突然終了します。

したがって、アクセス違反をキャッチすることは潜在的に危険です。これは質問に答えます。

于 2010-05-29T00:16:31.377 に答える