1

実際の実装はプラットフォーム固有のものですが、この考え方は潜在的に危険なバッファオーバーフローの原因です。たとえば、関数スタックが通常 '上に行く'の間にメモリ内の配列が '下に行く'という理由がありますか?

------------- 
| arr[0] | \ 
------------- \ 
| arr[1] | -> arr[3] is local to a function 
-------------/
| arr[2] |/
------------- 
| frame ptr | 
------------- 
| ret val | 
------------- 
| ret addr | 
------------- 
| args | 
------------- 

私の質問は、より良い動詞の欠如のためにローカルアレイが流れ落ちる理由はありますか?代わりに、配列が流れ上がった場合、リターンアドレスを上書きするバッファオーバーフローエラーの数を大幅に減らすことはできませんか?

スレッドを使用することによって、現在のものが呼び出した関数の戻りアドレスを上書きすることができます。しかし、今は無視しましょう。

答えて

2

スタック上の配列は、ヒープ上の配列と同じように機能します。つまり、メモリアドレスが増加するとインデックスが増加します。

スタックは、上向きではなく下向きに成長します。これは、スタックがスタックの反対方向に進む理由です。おそらくコード、ヒープ、スタックが同じメモリ領域にある時からヒープとスタックがメモリの各端から成長していたという歴史的な理由があります。

+1

でポイントを作っています。この答えは最高です。メモリレイアウトの詳細については、http://dirac.org/linux/gdb/02a-Memory_Layout_And_The_Stack.phpを参照してください。スタックとヒープは、使用されていないメモリアドレス空間を最大限に活用するために、反対方向に成長します。 –

0

私はこの問題の原因を挙げることはできませんが、私はそれがあなたの記憶を突き抜けることができると信じています。 while *p++かその行に沿ったものを考えてみましょう。

さて、あなたは同じように簡単にwhile *p--を言うことができるが、私は、彼らは選択肢を持っていたならば、彼らはむしろ自分自身の戻り値よりも誰か他の人のデータを上書きしたいと思います:)「貪欲法」について話す(HARのHAR)

+0

私はあまりにも思いついたのです。しかし、確かに、コンパイラが適切な調整を行うことは難しくありません。スケーラビリティはここで問題になると思います。 – Ram

+0

コンパイラは、適切な調整をどういう意味ですか? – corsiKa

+0

私は、アセンブラがスタックの編成方法に必要な調整を行うことを意味していると思います。 –

0

サブアレイを使用するには、通常、ポインタを渡します。すべての索引付け操作では、メモリー索引をすべて逆向きにしたい場合を除いて、配列のサイズを知る必要がありますが、そうであれば、同じ状況になります。