2016-07-25 3 views
0

これはおそらく既にどこかの答えがありますが、見つけられません。C++は範囲外の配列に読み書きします

Accessing an array out of bounds gives no error, why?のように、C++では配列の境界が強制されず、代わりに未定義の動作が行われます。私が心配しているのは、この行動の力です。これは、(明らかに、32ビットサイズの整数型を仮定して)次の32ビットの数は、私のシステムに保存されている印刷していきます

#include <iostream> 
int main() { 
    int* a = new int[1]; 
    long large_number = 9223372036854775807l; //2**63 - 1 
    for (long i = 0l; i < large_number; i++) { 
     std::cout << i << " " << a[i] << std::endl; 
    } 
    return 0; 
} 

は、だから私はいくつかの簡単なプログラムを書くとします。これを私のマシン上で実行すると、私のプログラムに割り当てられているメモリのサイズの約30,000になったときにsegfaultsが実行されます。これは私の質問に私を連れて来ます:

  1. 私はこの範囲外の値を(書き込みではなく)読み続けるのを妨げていますか?これはシステム固有の読み取りを防止していますか?コンパイラ固有?

  2. ポインタをどのように操作するのが巧妙であれば、私のプログラムの範囲外の値を読み書きすることはできますか(もちろん、これらの値に直接/通常のアクセスはありません)。

  3. 私はこれをすべて仮想マシンで実行しています。ホストマシンの読み取り/書き込みメモリ値にアクセスできますか? ((2)がノーならば、これもノーである)。

Windowsホストマシンのubuntuバーチャルボックスでg ++ 5.3.1、C++ 11を実行していることに注意してください。

また、私はこの問題がセキュリティ上の問題(メモリの読み書き)と考えられることを認識しています。私は確か悪意のあるものは何も意図していませんが、これが問題であれば教えてください。私はその質問を閉じることができてうれしいです。

EDIT:次の質問は関連して興味深い表示されます: Accessing outside the memory allocated by the program. (Accessing other app's memory) プログラムはそれの外にかかわらず、仮想メモリ空​​間です読み取ることができるかどうかについてコンセンサスがあるように思えません。

+4

ルックアップ_仮想メモリ_。最新のOSの各プロセスにはそれぞれ独自のメモリ空間があり、他のプロセス(またはVM上のホストマシン)のメモリは表示されません。 –

+0

これは意味があります。好奇心のために、現代のOSはすべて仮想メモリ管理を使用していますか?仮想メモリ空​​間外の情報にプログラムからアクセスできますか?私はコンセンサスの多くを見つけることができません... – Checkmate

+1

あなたがカーネル(またはカーネルの実装にバグがある場合)を除いて、あなたはユーザーモードで他のプログラムのメモリ空間にアクセスすることはできません。 – roelofs

答えて

1
  1. オペレーティングシステム。オペレーティングシステムは、特定の範囲の仮想アドレスのみを物理アドレスにマッピングしました。マップされた仮想アドレス範囲の終わりに達した後、存在しない仮想アドレスにアクセスしようとすると、SIGSEGVが生成されます。

  2. 少なくとも最新のオペレーティングシステムにはありません。

  3. あなたのホストオペレーティングシステムの仮想マシンにバグがあり、それを悪用することができます。

関連する問題