-6

Can I set/disable read(or write)-access privilage of the last several elements of an ordinary array in C/C++ ? Since I cannot use other processes' memory, I suspect this could be possible but how? I googled but couldnt find.

If I can, how?

Because I want to try something like this:

SetPrivilage(arr,LAST_5_ELEMENTS,false);

try
{
    for(int i=0;;i++) //without bound checking. i know its evil. just trying if it is possible
    {
        arr[i]++;     //array is 1-billion elements
    } 
}
catch(int catch_end_of_array)
{
    printf("array-inc complete");
}

Memory:

|start of array |00|01|02|03|04|05|06|07|..|..|1B|start of protected page|xx|xx|xx|xx|xx|xx|xx|xx|xx|xx|xx|xx|xx|

Lets assume I learned how to protect a page, then how could i declare an array just near the page so arrays end-point will be next to the page. ?

4

3 に答える 3

3

これは移植可能な方法では実行できず、オペレーティング システムによって異なります。メモリ保護は通常、はるかに粗いレベルで動作するため(たとえば、Linuxにはsyscallがありますが、任意の範囲ではなく全体(通常は4kブロック)mprotectしか保護できないため)、どこでも実際には不可能だと思います.pages

于 2012-09-04T10:08:16.997 に答える
2

オペレーティング システム インターフェイスを使用してページを保護する場合は、配列が保護の開始位置で終了するように配列を配置できます。ほとんどの C 実装では配列のアドレスを指定する方法が提供されていないためint *p、配列として宣言する (例: ) のではなく、設定したポインター (例: ) で配列を指定する必要があります。int p[40]

ほとんどのシステムのメモリ保護は粒度が細かいため、通常はアレイの一方の端のみを保護境界に合わせることができます。そのため、これは配列境界を保護するための一般的に有用なメカニズムではありません。両端を別々にテストすることにより、テスト目的で使用しました。

  • 配列の末尾が保護されたメモリの先頭に接するように配列を整列させます。テストを実行します。
  • 配列の開始点が保護されたメモリの終了点と接するように配列を整列させます。テストを実行します。

したがって、テスト対象のルーチンが配列の前または後のメモリに不適切にアクセスすると、テストの 1 つが失敗します。

于 2012-09-04T10:54:34.943 に答える
1

私はあなたarrがPOD(プレーンオールドデータ)配列であると仮定しています。C++ でクラスをoperator[]作成し、ランタイム インデックス チェックを行うためにオーバーロードすることができます。

通常、やりたいことはできません。できたとしても、実装とオペレーティング システムに大きく依存します。

Linux では、データへのアクセス許可は仮想メモリマッピングに関連しています。これは、mprotect(2) システム コールを使用したmmap(2) および munmap(2) に関連ています。これらの呼び出しは、ページ レベルの粒度で機能します (ページは通常 4K バイトであり、4K バイトが整列されます)。

mmap大きな領域とmprotectその最後のページを -ing したり、ポインタを計算するために移植性のないポインタ演算を行ったりするなどのいたずらなトリックを行うことができarrます。これは嫌なので、しないでください。そして、このようなSIGSEGVdirtymmapベースのトリックでキャッチすることは、あまり移植性がなく、おそらくあまり効率的ではありません. また、シグナル ハンドラーは C++ 例外をスローできません。

于 2012-09-04T10:08:08.433 に答える