C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 関数呼出時のスタックの挙動に関して


(過去ログ 74 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■43368 / inTopicNo.1)  関数呼出時のスタックの挙動に関して
  
□投稿者/ DD. (13回)-(2009/11/06(Fri) 23:05:02)

分類:[その他の言語] 

お世話になります。DD.です。

環境:WindowsXP(x86)、VC++2008

関数呼び出し時のスタックの挙動に関して不明点があったので質問させて下さい。

メモリの上位から下位にかけて、スタックフレームの後に「192byte + α(ローカル変数)」分の領域が確保されていることを確認したのですが、
この「192byte」は何のための領域なのでしょうか?

ローカル変数が増えてもその分+αが増えるだけで、「192byte」に関しては固定されているようであり、
再帰的に呼び出しを行ってもさらに下位に向かってスタックが確保されていく(当然ながら通常の関数呼び出しと同様に)だけで、
用途がよくわかりませんでした。

また、ローカル変数 1つにつき、約12byte(プリミティブ型ではdouble以外で12byteを確認。また、配列の場合は要素数に応じてさらに領域が確保されることも確認)の領域が確保されていることも確認したのですが、
変数を使用しても変数の型に応じたbyte数分が使用されているだけで、残りのbyteが使用されていることを確認することができませんでした。
私の確認の仕方の問題かもしれませんが、この残りのbyteは何のために確保されているものなのでしょうか?

よろしくお願い致します。


引用返信 編集キー/
■43370 / inTopicNo.2)  Re[1]: 関数呼出時のスタックの挙動に関して
□投稿者/ オショウ (377回)-(2009/11/07(Sat) 07:29:03)
No43368 (DD. さん) に返信
> メモリの上位から下位にかけて、スタックフレームの後に「192byte + α(ローカル変数)」分の領域が確保されていることを確認したのですが、
> この「192byte」は何のための領域なのでしょうか?

  どんな関数を定義されて、どんな引数を宣言されているのか・・・
  それが解らない限りコメントのしようもありません。

> また、ローカル変数 1つにつき、約12byte(プリミティブ型ではdouble以外で12byteを確認。また、配列の場合は要素数に応じてさらに領域が確保されることも確認)の領域が確保されていることも確認したのですが、
> 変数を使用しても変数の型に応じたbyte数分が使用されているだけで、残りのbyteが使用されていることを確認することができませんでした。
> 私の確認の仕方の問題かもしれませんが、この残りのbyteは何のために確保されているものなのでしょうか?

  コンパイラスイッチで、アセンブラ出力でもしてみたら、解るんじゃ〜ないですか?
  /Faだったか・・・(まだ使えるんかネ〜)(未確認)

※ ヘルプ見たら、まだあった・・・使える!

以上。
引用返信 編集キー/
■43371 / inTopicNo.3)  Re[2]: 関数呼出時のスタックの挙動に関して
□投稿者/ 774RR (418回)-(2009/11/07(Sat) 07:40:54)
いわゆる Debug モードでコンパイルしているんぢゃないかな?
バッファオーバーランによるメモリ破壊を検出する/メモリ破壊があっても暴走しない ためのデバッグ機構。
Release モードで当該コードが除去されるようならそういうこと。

まあ何にせよそれだけの情報提示ではさっぱりわからん、に同意。
引用返信 編集キー/
■43378 / inTopicNo.4)  Re[2]: 関数呼出時のスタックの挙動に関して
□投稿者/ DD. (15回)-(2009/11/09(Mon) 01:39:23)
回答有難う御座います。

どの関数というわけではなく、また、引数に応じて変化するというわけでもありませんでした。
アセンブラ吐かせて確認はしたんですが、引数の後のスタックフレームのPUSH後に
SPが減算されて領域が確保されているものなので、少なくとも引数に関与するものではないと考えました。

提示条件が少なかったようで申し訳ありません。
知っている人は知っているんだ的な既知の話かと思って簡単に話を振ってしまいました。

ご指摘頂いているデバッグモードでの動作の可能性を踏まえて、
再度調査してみたいと思います。

ひとまず解決扱いとさせて頂きます。

何かわかったら情報だけ、また書き込みさせてもらいます。

解決済み
引用返信 編集キー/
■43381 / inTopicNo.5)  Re[3]: 関数呼出時のスタックの挙動に関して
□投稿者/ 774RR (419回)-(2009/11/09(Mon) 08:34:28)
VS2005 で、簡単なソースコードをコンパイルオプション使い分けテストしてみた

-RTCs スタックフレームのランタイムチェックを有効にする、オプションを指定すると
・スタックを数バイト(状況により異なる)余計に取る
・スタック上に CCCCCCCC を書く(破壊検査のためのチェック値)
・スタックフレームの破壊チェックルーチンを呼ぶ

-ZI エディトコンティニューデバッグを有効にする、オプションを指定すると
・スタックを64バイト前後(状況により異なる)余計に取る(使っていないみたい)

-RTCs + -ZI を両方指定すると
提示例のように192バイト前後スタックを余計に取る+スタックフレーム破壊検査コードが追加される

ということを確認済み。

-Ox かつデバッグ指定なしだとスタックフレームすら生成しない状況になるので
デバッグサポートで間違いないと思われる。
解決済み
引用返信 編集キー/
■43455 / inTopicNo.6)  Re[4]: 関数呼出時のスタックの挙動に関して
□投稿者/ DD. (16回)-(2009/11/10(Tue) 23:14:17)
774RRさん、検証有難う御座いました。
また自分でも検証してみたいと思います。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -