「スタックフレーム」の版間の差分
提供: セキュリティ
(相違点なし)
|
2014年2月17日 (月) 15:23時点における最新版
スタックフレーム (stack frame)とは、C言語のプログラムが関数を呼び出すときにスタックにデータを積みますが、そのデータをまとめた呼び方です。
読み方
- スタックフレーム
- すたっくふれーむ
- stack frame
- すたっくふれーむ
概要
スタックには、プログラムの制御に必要な情報やプログラムのワークエリア(ローカル変数)として利用されます。
関数呼び出しをするときに、関数の引数のデータをスタックに置いて、関数に渡します。
呼び出された関数の制御が終わったときに、呼び出し元に制御を移すためには、ベースポインタの値を元に戻したり、呼び出し側の命令に戻るための情報(リターンアドレス)が必要になります。
関数は、ローカル変数のデータをスタック領域において使用します。
スタックフレーム
C言語のプログラムを例に挙げます。
void foo() { ; } void bar() { foo(); } int main() { bar(); }
上記のコードが foo() の処理に移ったときに、スタックには、以下のようにスタックフレームが積まれていきます。
スタックフレーム |
---|
fooのスタックフレーム |
barのスタックフレーム |
mainのスタックフレーム |
スタックフレームの中身
スタックには、関数の引数やローカル変数、リターンアドレス、ベースポインタ(bp)が積まれます。関数ごとのデータのまとまりをスタックフレームと呼びます。 以下の表に例を示します。
スタックフレーム | スタック |
---|---|
barのスタックフレーム | barのローカル領域 |
ベースポインタ | |
リターンアドレス | |
barの引数領域 | |
mainのスタックフレーム | mainのローカル領域 |
ベースポインタ | |
リターンアドレス | |
mainの引数領域 | |
_startのスタックフレーム | _start ... |
関連項目
- セキュアプログラミング
- C言語
- スタック
- スタックフレーム
- リターンアドレス
- ベースポインタ